From 100a67217bd6ab8735e8323e3d7d50b5a8b4de59 Mon Sep 17 00:00:00 2001 From: Eike Kettner Date: Mon, 23 Dec 2019 13:06:36 +0100 Subject: [PATCH] Rewrite of sharry This is a complete overhaul to start with version 1.0. --- .gitignore | 9 +- .projectile | 3 + .scalafmt.conf | 15 + .travis.yml | 28 - LICENSE.txt | 674 ------ README.md | 216 +- _config.yml | 1 - .../webapp/src/main/html => artwork}/icon.svg | 0 artwork/icon_small.svg | 143 ++ .../webapp/src/main/html => artwork}/logo.png | Bin .../webapp/src/main/html => artwork}/logo.svg | 0 build.nix | 23 - build.sbt | 479 +++-- deploy.nix | 122 -- docs/alias-list.jpg | Bin 58065 -> 0 bytes docs/alias-mail.jpg | Bin 77127 -> 0 bytes docs/cli.md | 98 - docs/concepts.md | 139 -- docs/configuration.md | 304 --- docs/create-account.jpg | Bin 90156 -> 0 bytes docs/description-editor.jpg | Bin 87854 -> 0 bytes docs/index.md | 39 - docs/install.md | 79 - docs/modify-account.jpg | Bin 83204 -> 0 bytes docs/rest.md | 203 -- docs/search-account.jpg | Bin 46691 -> 0 bytes docs/upload-detail-unpublish.jpg | Bin 79857 -> 0 bytes docs/upload-detail.jpg | Bin 96202 -> 0 bytes docs/upload-form.jpg | Bin 105940 -> 0 bytes docs/upload-form3.jpg | Bin 46157 -> 0 bytes docs/upload-list.jpg | Bin 56223 -> 0 bytes docs/upload-mail.jpg | Bin 71442 -> 0 bytes docs/webapp.md | 144 -- elm-analyse.json | 8 + elm-package.json | 1 + elm.json | 35 + .../scala/sharry/backend/BackendApp.scala | 64 + .../main/scala/sharry/backend/Common.scala | 11 + .../main/scala/sharry/backend/Config.scala | 19 + .../scala/sharry/backend/PasswordCrypt.scala | 15 + .../sharry/backend/account/AccountItem.scala | 5 + .../sharry/backend/account/NewAccount.scala | 38 + .../sharry/backend/account/OAccount.scala | 151 ++ .../sharry/backend/account/Queries.scala | 44 + .../scala/sharry/backend/alias/OAlias.scala | 59 + .../sharry/backend/auth/AuthConfig.scala | 70 + .../scala/sharry/backend/auth/AuthToken.scala | 79 + .../sharry/backend/auth/CommandAuth.scala | 69 + .../scala/sharry/backend/auth/FixedAuth.scala | 64 + .../scala/sharry/backend/auth/HttpAuth.scala | 113 + .../sharry/backend/auth/HttpBasicAuth.scala | 76 + .../sharry/backend/auth/InternalAuth.scala | 57 + .../scala/sharry/backend/auth/Login.scala | 70 + .../sharry/backend/auth/LoginModule.scala | 56 + .../sharry/backend/auth/LoginResult.scala | 21 + .../sharry/backend/auth/UserPassData.scala | 15 + .../scala/sharry/backend/auth/package.scala | 9 + .../sharry/backend/job/CleanupConfig.scala | 7 + .../sharry/backend/job/PeriodicCleanup.scala | 79 + .../sharry/backend/mail/MailConfig.scala | 38 + .../scala/sharry/backend/mail/MailData.scala | 3 + .../sharry/backend/mail/MailSendResult.scala | 24 + .../sharry/backend/mail/NotifyResult.scala | 21 + .../scala/sharry/backend/mail/OMail.scala | 145 ++ .../scala/sharry/backend/mail/Queries.scala | 52 + .../sharry/backend/mail/TemplateData.scala | 15 + .../backend/mustache/YamuscaCommon.scala | 37 + .../sharry/backend/share/ByteResult.scala | 34 + .../backend/share/DescriptionTemplate.scala | 77 + .../scala/sharry/backend/share/File.scala | 11 + .../scala/sharry/backend/share/FileData.scala | 18 + .../scala/sharry/backend/share/FileInfo.scala | 8 + .../sharry/backend/share/FileRange.scala | 11 + .../scala/sharry/backend/share/OShare.scala | 535 +++++ .../scala/sharry/backend/share/Queries.scala | 408 ++++ .../sharry/backend/share/ShareConfig.scala | 5 + .../sharry/backend/share/ShareData.scala | 15 + .../sharry/backend/share/ShareDetail.scala | 15 + .../scala/sharry/backend/share/ShareId.scala | 27 + .../sharry/backend/share/ShareItem.scala | 19 + .../sharry/backend/share/ShareResult.scala | 76 + .../sharry/backend/share/UploadResult.scala | 78 + .../backend/signup/NewInviteResult.scala | 19 + .../scala/sharry/backend/signup/OSignup.scala | 93 + .../sharry/backend/signup/SignupConfig.scala | 7 + .../sharry/backend/signup/SignupResult.scala | 26 + modules/cli/src/main/resources/logback.xml | 17 - modules/cli/src/main/resources/reference.conf | 80 - .../main/scala/sharry/cli/ClientError.scala | 53 - .../cli/src/main/scala/sharry/cli/Cmd.scala | 99 - .../src/main/scala/sharry/cli/Context.scala | 166 -- .../scala/sharry/cli/LoggingProperty.scala | 13 - .../cli/src/main/scala/sharry/cli/OS.scala | 53 - .../src/main/scala/sharry/cli/Progress.scala | 28 - .../main/scala/sharry/cli/StdoutSink.scala | 133 -- .../cli/src/main/scala/sharry/cli/cmds.scala | 273 --- .../src/main/scala/sharry/cli/config.scala | 167 -- .../cli/src/main/scala/sharry/cli/main.scala | 81 - .../src/main/scala/sharry/cli/maincmds.scala | 56 - .../src/main/scala/sharry/cli/package.scala | 56 - .../src/main/scala/sharry/cli/parser.scala | 145 -- .../main/scala/sharry/cli/requestlog.scala | 31 - .../main/scala/sharry/common/AccountId.scala | 38 + .../scala/sharry/common/AccountSource.scala | 43 + .../scala/sharry/common/AccountState.scala | 37 + .../src/main/scala/sharry/common/Banner.scala | 31 + .../scala/sharry/common/BaseJsonCodecs.scala | 14 + .../main/scala/sharry/common/ByteSize.scala | 68 + .../main/scala/sharry/common/Duration.scala | 89 + .../src/main/scala/sharry/common/Ident.scala | 66 + .../main/scala/sharry/common/JsonCodec.scala | 21 - .../main/scala/sharry/common/LenientUri.scala | 233 +++ .../main/scala/sharry/common/Password.scala | 29 + .../main/scala/sharry/common/SignupMode.scala | 35 + .../scala/sharry/common/ThreadFactories.scala | 20 + .../main/scala/sharry/common/Timestamp.scala | 48 + .../src/main/scala/sharry/common/base64.scala | 23 - .../scala/sharry/common/data/Account.scala | 94 - .../sharry/common/data/AliasUpdate.scala | 10 - .../scala/sharry/common/data/ChunkInfo.scala | 14 - .../scala/sharry/common/data/FileMeta.scala | 32 - .../main/scala/sharry/common/data/Pass.scala | 9 - .../sharry/common/data/RemoteConfig.scala | 28 - .../scala/sharry/common/data/Upload.scala | 111 - .../sharry/common/data/UploadCreate.scala | 17 - .../scala/sharry/common/data/UploadInfo.scala | 25 - .../sharry/common/data/UploadUpdate.scala | 11 - .../scala/sharry/common/data/UploadWeb.scala | 35 - .../scala/sharry/common/data/UserPass.scala | 11 - .../main/scala/sharry/common/duration.scala | 361 ---- .../src/main/scala/sharry/common/file.scala | 65 - .../src/main/scala/sharry/common/mime.scala | 73 - .../sharry/common/pureconfig/Implicits.scala | 37 + .../src/main/scala/sharry/common/rng.scala | 77 - .../src/main/scala/sharry/common/sha.scala | 57 - .../src/main/scala/sharry/common/sign.scala | 26 - .../src/main/scala/sharry/common/sizes.scala | 86 - .../main/scala/sharry/common/streams.scala | 63 - .../sharry/common/syntax/LoggerSyntax.scala | 35 + .../sharry/common/syntax/StreamSyntax.scala | 30 + .../sharry/common/syntax/StringSyntax.scala | 21 + .../main/scala/sharry/common/syntax/all.scala | 3 + .../main/scala/sharry/common/version.scala | 17 - .../src/main/scala/sharry/common/zip.scala | 113 - .../src/test/resources/logback-test.xml | 13 - .../scala/sharry/common/DurationSpec.scala | 91 - .../test/scala/sharry/common/ZipSpec.scala | 41 - .../scala/sharry/docs/md/ManualContext.scala | 16 - .../scala/sharry/docs/md/ManualPage.scala | 53 - .../main/scala/sharry/docs/md/TocAccess.scala | 17 - .../src/main/scala/sharry/docs/route.scala | 75 - .../main/scala/sharry/mdutil/Document.scala | 60 - .../src/main/scala/sharry/mdutil/Link.scala | 3 - .../scala/sharry/mdutil/LinkProcessor.scala | 70 - .../main/scala/sharry/mdutil/package.scala | 19 - .../scala/sharry/mdutil/DocumentSpec.scala | 77 - modules/microsite/docs/doc/configure.md | 407 ++++ modules/microsite/docs/doc/dev.md | 66 + modules/microsite/docs/doc/index.md | 68 + modules/microsite/docs/doc/install.md | 150 ++ modules/microsite/docs/doc/migration.md | 97 + modules/microsite/docs/doc/quickstart.md | 25 + modules/microsite/docs/doc/rest.md | 64 + modules/microsite/docs/doc/screenshots.md | 38 + modules/microsite/docs/doc/webapp.md | 197 ++ modules/microsite/docs/index.md | 7 + .../docs/screenshots/20191216-222321.jpg | Bin 0 -> 86202 bytes .../docs/screenshots/20191216-222359.jpg | Bin 0 -> 115497 bytes .../docs/screenshots/20191216-223105.jpg | Bin 0 -> 132764 bytes .../docs/screenshots/20191216-223117.jpg | Bin 0 -> 182188 bytes .../docs/screenshots/20191216-223125.jpg | Bin 0 -> 194563 bytes .../docs/screenshots/20191216-223128.jpg | Bin 0 -> 223884 bytes .../docs/screenshots/20191216-223153.jpg | Bin 0 -> 233405 bytes .../docs/screenshots/20191216-223216.jpg | Bin 0 -> 301390 bytes .../docs/screenshots/20191217-210812.jpg | Bin 0 -> 141599 bytes modules/microsite/docs/screenshots/edit.png | Bin 0 -> 492832 bytes modules/microsite/docs/screenshots/login.jpg | Bin 0 -> 80640 bytes .../docs/screenshots/publish_done.jpg | Bin 0 -> 45193 bytes .../docs/screenshots/publish_empty.jpg | Bin 0 -> 55677 bytes .../main/resources/microsite/css/styles.css | 3 + .../main/resources/microsite/data/menu.yml | 30 + .../resources/microsite/img/favicon-32x32.png | 1 + .../microsite/img/features-header.svg | 1 + .../microsite/img/first-feature-icon.svg | 117 ++ .../microsite/img/light-navbar-brand.svg | 1 + .../microsite/img/light-sidebar-brand.svg | 1 + .../microsite/img/second-feature-icon.svg | 113 + .../microsite/img/third-feature-icon.svg | 100 + .../src/main/resources/sharry-openapi.yml | 1836 +++++++++++++++++ .../restserver/src/main/resources/logback.xml | 16 + .../src/main/resources/reference.conf | 327 +++ .../main/scala/sharry/restserver/Config.scala | 19 + .../scala/sharry/restserver/ConfigFile.scala | 46 + .../scala/sharry/restserver/CookieData.scala | 57 + .../main/scala/sharry/restserver/Main.scala | 66 + .../scala/sharry/restserver/RestApp.scala | 12 + .../scala/sharry/restserver/RestAppImpl.scala | 33 + .../scala/sharry/restserver/RestServer.scala | 136 ++ .../sharry/restserver/oauth/CodeFlow.scala | 124 ++ .../restserver/routes/AccountRoutes.scala | 84 + .../restserver/routes/AliasRoutes.scala | 79 + .../restserver/routes/Authenticate.scala | 82 + .../restserver/routes/ByteResponse.scala | 140 ++ .../scala/sharry/restserver/routes/Conv.scala | 46 + .../sharry/restserver/routes/InfoRoutes.scala | 47 + .../restserver/routes/LoginRoutes.scala | 138 ++ .../sharry/restserver/routes/MailRoutes.scala | 84 + .../restserver/routes/NotifyRoutes.scala | 60 + .../restserver/routes/OpenShareRoutes.scala | 31 + .../restserver/routes/RegisterRoutes.scala | 76 + .../restserver/routes/SettingRoutes.scala | 56 + .../routes/ShareDetailResponse.scala | 74 + .../restserver/routes/ShareRoutes.scala | 155 ++ .../restserver/routes/ShareUploadRoutes.scala | 123 ++ .../routes/headers/SharryPassword.scala | 17 + .../routes/tus/SharryFileLength.scala | 14 + .../routes/tus/SharryFileName.scala | 12 + .../routes/tus/SharryFileType.scala | 12 + .../restserver/routes/tus/TusMaxSize.scala | 15 + .../restserver/routes/tus/TusRoutes.scala | 112 + .../restserver/routes/tus/UploadLength.scala | 15 + .../restserver/routes/tus/UploadOffset.scala | 15 + .../restserver/webapp/TemplateRoutes.scala | 153 ++ .../restserver/webapp/WebjarRoutes.scala | 43 + .../restserver/webapp/YamuscaConverter.scala | 17 + .../restserver/src/main/templates/doc.html | 60 + .../restserver/src/main/templates/index.html | 39 + modules/server/src/main/resources/logback.xml | 13 - .../server/src/main/resources/reference.conf | 265 --- .../src/main/scala/sharry/server/App.scala | 117 -- .../sharry/server/authc/Authenticate.scala | 86 - .../sharry/server/authc/ExternAuthc.scala | 113 - .../scala/sharry/server/authc/Token.scala | 54 - .../scala/sharry/server/authc/package.scala | 24 - .../sharry/server/codec/HttpHeaderCodec.scala | 39 - .../src/main/scala/sharry/server/config.scala | 144 -- .../scala/sharry/server/email/Address.scala | 26 - .../scala/sharry/server/email/Header.scala | 19 - .../main/scala/sharry/server/email/Mail.scala | 49 - .../sharry/server/email/SmtpSetting.scala | 36 - .../scala/sharry/server/email/client.scala | 123 -- .../scala/sharry/server/email/package.scala | 21 - .../src/main/scala/sharry/server/main.scala | 187 -- .../scala/sharry/server/notification.scala | 102 - .../src/main/scala/sharry/server/paths.scala | 76 - .../scala/sharry/server/routes/UserId.scala | 21 - .../scala/sharry/server/routes/account.scala | 136 -- .../scala/sharry/server/routes/alias.scala | 72 - .../scala/sharry/server/routes/authz.scala | 54 - .../scala/sharry/server/routes/download.scala | 174 -- .../scala/sharry/server/routes/login.scala | 77 - .../scala/sharry/server/routes/mail.scala | 105 - .../scala/sharry/server/routes/package.scala | 46 - .../scala/sharry/server/routes/settings.scala | 22 - .../scala/sharry/server/routes/syntax.scala | 180 -- .../scala/sharry/server/routes/upload.scala | 270 --- modules/server/src/test/rest/test.rest | 153 -- .../server/codec/HttpHeaderCodecSpec.scala | 20 - .../db/migration/mariadb/V1.0.0__initial.sql | 95 + .../migration/postgresql/V1.0.0__initial.sql | 94 + .../main/scala/sharry/store/AddResult.scala | 46 + .../main/scala/sharry/store/JdbcConfig.scala | 38 + .../src/main/scala/sharry/store/Limit.scala | 14 - .../src/main/scala/sharry/store/Store.scala | 47 + .../sharry/store/account/AccountStore.scala | 35 - .../store/account/SqlAccountStore.scala | 54 - .../sharry/store/account/SqlStatements.scala | 67 - .../src/main/scala/sharry/store/columns.scala | 63 - .../main/scala/sharry/store/data/Alias.scala | 34 - .../scala/sharry/store/data/UploadSize.scala | 8 - .../scala/sharry/store/doobie/Column.scala | 61 + .../sharry/store/doobie/DoobieMeta.scala | 59 + .../main/scala/sharry/store/doobie/Sql.scala | 60 + .../scala/sharry/store/doobie/StoreImpl.scala | 38 + .../main/scala/sharry/store/evolution.scala | 193 -- .../sharry/store/migrate/FlywayMigrate.scala | 49 + .../sharry/store/migrate/MigrateFrom06.scala | 276 +++ .../sharry/store/records/ModAccount.scala | 10 + .../scala/sharry/store/records/RAccount.scala | 140 ++ .../scala/sharry/store/records/RAlias.scala | 86 + .../sharry/store/records/RInvitation.scala | 50 + .../sharry/store/records/RPublishShare.scala | 97 + .../scala/sharry/store/records/RShare.scala | 58 + .../sharry/store/records/RShareFile.scala | 53 + .../sharry/store/upload/SqlStatements.scala | 274 --- .../sharry/store/upload/SqlUploadStore.scala | 166 -- .../sharry/store/upload/UploadStore.scala | 72 - .../store/src/test/resources/files/file.pdf | Bin 65404 -> 0 bytes .../scala/sharry/store/StoreFixtures.scala | 46 - .../store/account/SqlAccountStoreTest.scala | 47 - modules/webapp/src/main/css/sharry.css | 76 - modules/webapp/src/main/elm/Api.elm | 572 +++++ modules/webapp/src/main/elm/App/Data.elm | 139 ++ modules/webapp/src/main/elm/App/Model.elm | 122 -- modules/webapp/src/main/elm/App/Pages.elm | 175 -- modules/webapp/src/main/elm/App/Update.elm | 577 ++++-- modules/webapp/src/main/elm/App/View.elm | 464 +++-- .../webapp/src/main/elm/Comp/AccountForm.elm | 281 +++ .../webapp/src/main/elm/Comp/AccountTable.elm | 89 + .../webapp/src/main/elm/Comp/AliasForm.elm | 272 +++ .../webapp/src/main/elm/Comp/AliasTable.elm | 83 + .../webapp/src/main/elm/Comp/Dropzone2.elm | 292 +++ .../src/main/elm/Comp/FixedDropdown.elm | 108 + modules/webapp/src/main/elm/Comp/IntField.elm | 108 + modules/webapp/src/main/elm/Comp/IntInput.elm | 75 + modules/webapp/src/main/elm/Comp/MailForm.elm | 125 ++ modules/webapp/src/main/elm/Comp/MailSend.elm | 175 ++ .../src/main/elm/Comp/MarkdownInput.elm | 131 ++ .../src/main/elm/Comp/PasswordInput.elm | 74 + .../src/main/elm/Comp/ShareFileList.elm | 368 ++++ .../webapp/src/main/elm/Comp/ShareTable.elm | 105 + .../src/main/elm/Comp/ValidityField.elm | 57 + .../webapp/src/main/elm/Comp/YesNoDimmer.elm | 117 ++ modules/webapp/src/main/elm/Comp/Zoom.elm | 112 + modules/webapp/src/main/elm/Data.elm | 439 ---- .../webapp/src/main/elm/Data/AccountState.elm | 52 + modules/webapp/src/main/elm/Data/Flags.elm | 40 + .../webapp/src/main/elm/Data/UploadData.elm | 28 + .../webapp/src/main/elm/Data/UploadDict.elm | 142 ++ .../webapp/src/main/elm/Data/UploadState.elm | 72 + .../src/main/elm/Data/ValidityOptions.elm | 90 + .../src/main/elm/Data/ValidityValue.elm | 60 + modules/webapp/src/main/elm/Main.elm | 161 +- modules/webapp/src/main/elm/Page.elm | 252 +++ .../webapp/src/main/elm/Page/Account/Data.elm | 43 + .../src/main/elm/Page/Account/Update.elm | 120 ++ .../webapp/src/main/elm/Page/Account/View.elm | 102 + .../webapp/src/main/elm/Page/Alias/Data.elm | 48 + .../webapp/src/main/elm/Page/Alias/Update.elm | 190 ++ .../webapp/src/main/elm/Page/Alias/View.elm | 173 ++ .../webapp/src/main/elm/Page/Detail/Data.elm | 222 ++ .../src/main/elm/Page/Detail/Update.elm | 508 +++++ .../webapp/src/main/elm/Page/Detail/View.elm | 731 +++++++ .../webapp/src/main/elm/Page/Home/Data.elm | 14 + .../webapp/src/main/elm/Page/Home/Update.elm | 9 + .../webapp/src/main/elm/Page/Home/View.elm | 33 + .../webapp/src/main/elm/Page/Info/Data.elm | 28 + .../webapp/src/main/elm/Page/Info/Update.elm | 9 + .../webapp/src/main/elm/Page/Info/View.elm | 32 + .../webapp/src/main/elm/Page/Login/Data.elm | 27 + .../webapp/src/main/elm/Page/Login/Update.elm | 78 + .../webapp/src/main/elm/Page/Login/View.elm | 129 ++ .../src/main/elm/Page/NewInvite/Data.elm | 50 + .../src/main/elm/Page/NewInvite/Update.elm | 30 + .../src/main/elm/Page/NewInvite/View.elm | 113 + .../src/main/elm/Page/OpenDetail/Data.elm | 62 + .../src/main/elm/Page/OpenDetail/Update.elm | 118 ++ .../src/main/elm/Page/OpenDetail/View.elm | 142 ++ .../src/main/elm/Page/OpenShare/Data.elm | 50 + .../src/main/elm/Page/OpenShare/Update.elm | 188 ++ .../src/main/elm/Page/OpenShare/View.elm | 163 ++ .../src/main/elm/Page/Register/Data.elm | 44 + .../src/main/elm/Page/Register/Update.elm | 119 ++ .../src/main/elm/Page/Register/View.elm | 150 ++ .../src/main/elm/Page/Settings/Data.elm | 56 + .../src/main/elm/Page/Settings/Update.elm | 136 ++ .../src/main/elm/Page/Settings/View.elm | 118 ++ .../webapp/src/main/elm/Page/Share/Data.elm | 83 + .../webapp/src/main/elm/Page/Share/Update.elm | 221 ++ .../webapp/src/main/elm/Page/Share/View.elm | 241 +++ .../webapp/src/main/elm/Page/Upload/Data.elm | 30 + .../src/main/elm/Page/Upload/Update.elm | 45 + .../webapp/src/main/elm/Page/Upload/View.elm | 57 + modules/webapp/src/main/elm/PageLocation.elm | 172 -- .../src/main/elm/Pages/AccountEdit/Model.elm | 23 - .../src/main/elm/Pages/AccountEdit/Update.elm | 51 - .../src/main/elm/Pages/AccountEdit/View.elm | 103 - .../src/main/elm/Pages/AliasList/Model.elm | 19 - .../src/main/elm/Pages/AliasList/Update.elm | 14 - .../src/main/elm/Pages/AliasList/View.elm | 19 - .../src/main/elm/Pages/AliasUpload/Model.elm | 94 - .../src/main/elm/Pages/AliasUpload/Update.elm | 184 -- .../src/main/elm/Pages/AliasUpload/View.elm | 222 -- .../src/main/elm/Pages/Download/Model.elm | 19 - .../src/main/elm/Pages/Download/Update.elm | 18 - .../src/main/elm/Pages/Download/View.elm | 17 - .../webapp/src/main/elm/Pages/Error/Model.elm | 12 - .../webapp/src/main/elm/Pages/Error/View.elm | 23 - .../src/main/elm/Pages/Login/Commands.elm | 24 - .../webapp/src/main/elm/Pages/Login/Data.elm | 10 - .../webapp/src/main/elm/Pages/Login/Model.elm | 23 - .../src/main/elm/Pages/Login/Update.elm | 33 - .../webapp/src/main/elm/Pages/Login/View.elm | 82 - .../src/main/elm/Pages/Manual/Model.elm | 22 - .../webapp/src/main/elm/Pages/Manual/View.elm | 25 - .../src/main/elm/Pages/Profile/Model.elm | 20 - .../src/main/elm/Pages/Profile/Update.elm | 20 - .../src/main/elm/Pages/Profile/View.elm | 33 - .../src/main/elm/Pages/Timeout/View.elm | 23 - .../src/main/elm/Pages/Upload/Model.elm | 72 - .../src/main/elm/Pages/Upload/Update.elm | 165 -- .../webapp/src/main/elm/Pages/Upload/View.elm | 161 -- .../src/main/elm/Pages/UploadList/Model.elm | 18 - .../src/main/elm/Pages/UploadList/Update.elm | 13 - .../src/main/elm/Pages/UploadList/View.elm | 18 - modules/webapp/src/main/elm/Ports.elm | 71 +- modules/webapp/src/main/elm/Resumable.elm | 115 -- .../webapp/src/main/elm/Resumable/Update.elm | 37 - modules/webapp/src/main/elm/Util/Duration.elm | 66 + modules/webapp/src/main/elm/Util/Html.elm | 57 + modules/webapp/src/main/elm/Util/Http.elm | 281 +++ modules/webapp/src/main/elm/Util/List.elm | 96 + modules/webapp/src/main/elm/Util/Maybe.elm | 57 + modules/webapp/src/main/elm/Util/Share.elm | 59 + modules/webapp/src/main/elm/Util/Size.elm | 57 + modules/webapp/src/main/elm/Util/String.elm | 16 + modules/webapp/src/main/elm/Util/Time.elm | 102 + modules/webapp/src/main/elm/Util/Update.elm | 18 + modules/webapp/src/main/elm/Util/Url.elm | 13 + .../src/main/elm/Widgets/AccountForm.elm | 209 -- .../webapp/src/main/elm/Widgets/AliasEdit.elm | 169 -- .../webapp/src/main/elm/Widgets/AliasList.elm | 229 -- .../src/main/elm/Widgets/AliasUploadForm.elm | 149 -- .../src/main/elm/Widgets/DownloadView.elm | 611 ------ .../src/main/elm/Widgets/LoginSearch.elm | 138 -- .../webapp/src/main/elm/Widgets/MailForm.elm | 189 -- .../src/main/elm/Widgets/MarkdownEditor.elm | 40 - .../src/main/elm/Widgets/MarkdownHelp.elm | 333 --- .../src/main/elm/Widgets/UpdateEmailForm.elm | 96 - .../main/elm/Widgets/UpdatePasswordForm.elm | 130 -- .../src/main/elm/Widgets/UploadForm.elm | 295 --- .../src/main/elm/Widgets/UploadList.elm | 161 -- .../src/main/elm/Widgets/UploadProgress.elm | 122 -- modules/webapp/src/main/html/index.html | 39 - modules/webapp/src/main/html/placeholder.png | Bin 15322 -> 0 bytes modules/webapp/src/main/js/sharry.js | 234 --- .../main/scala/sharry/webapp/route/Url.scala | 56 - .../scala/sharry/webapp/route/webjar.scala | 204 -- .../favicon/android-chrome-192x192.png | Bin .../favicon/android-chrome-512x512.png | Bin .../favicon/apple-touch-icon.png | Bin .../favicon/browserconfig.xml | 0 .../favicon/favicon-16x16.png | Bin .../favicon/favicon-32x32.png | Bin .../main/{html => webjar}/favicon/favicon.ico | Bin .../{html => webjar}/favicon/manifest.json | 0 .../favicon/mstile-150x150.png | Bin .../favicon/safari-pinned-tab.svg | 0 modules/webapp/src/main/webjar/img/icon.svg | 1 + modules/webapp/src/main/webjar/img/logo.png | 1 + modules/webapp/src/main/webjar/img/logo.svg | 1 + modules/webapp/src/main/webjar/sharry.css | 114 + modules/webapp/src/main/webjar/sharry.js | 151 ++ modules/webapp/src/test/elm/DataTest.elm | 43 - nixos-sbt | 20 - project/Dependencies.scala | 140 ++ project/ElmPlugin.scala | 189 -- project/WebjarPlugin.scala | 165 -- project/build.nix | 14 + project/build.properties | 2 +- project/build.sbt | 9 - project/libs.scala | 123 -- project/plugins.sbt | 10 +- project/project/build.properties | 1 - project/project/plugins.sbt | 1 - version.sbt | 2 +- 456 files changed, 22467 insertions(+), 16690 deletions(-) create mode 100644 .projectile create mode 100644 .scalafmt.conf delete mode 100644 .travis.yml delete mode 100644 LICENSE.txt delete mode 100644 _config.yml rename {modules/webapp/src/main/html => artwork}/icon.svg (100%) create mode 100644 artwork/icon_small.svg rename {modules/webapp/src/main/html => artwork}/logo.png (100%) rename {modules/webapp/src/main/html => artwork}/logo.svg (100%) delete mode 100644 build.nix delete mode 100644 deploy.nix delete mode 100644 docs/alias-list.jpg delete mode 100644 docs/alias-mail.jpg delete mode 100644 docs/cli.md delete mode 100644 docs/concepts.md delete mode 100644 docs/configuration.md delete mode 100644 docs/create-account.jpg delete mode 100644 docs/description-editor.jpg delete mode 100644 docs/index.md delete mode 100644 docs/install.md delete mode 100644 docs/modify-account.jpg delete mode 100644 docs/rest.md delete mode 100644 docs/search-account.jpg delete mode 100644 docs/upload-detail-unpublish.jpg delete mode 100644 docs/upload-detail.jpg delete mode 100644 docs/upload-form.jpg delete mode 100644 docs/upload-form3.jpg delete mode 100644 docs/upload-list.jpg delete mode 100644 docs/upload-mail.jpg delete mode 100644 docs/webapp.md create mode 100644 elm-analyse.json create mode 120000 elm-package.json create mode 100644 elm.json create mode 100644 modules/backend/src/main/scala/sharry/backend/BackendApp.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/Common.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/Config.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/PasswordCrypt.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/account/AccountItem.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/account/NewAccount.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/account/OAccount.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/account/Queries.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/alias/OAlias.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/AuthConfig.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/AuthToken.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/CommandAuth.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/FixedAuth.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/HttpAuth.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/HttpBasicAuth.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/InternalAuth.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/Login.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/LoginModule.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/LoginResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/UserPassData.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/auth/package.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/job/CleanupConfig.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/job/PeriodicCleanup.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/MailConfig.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/MailData.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/MailSendResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/NotifyResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/OMail.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/Queries.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mail/TemplateData.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/mustache/YamuscaCommon.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ByteResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/DescriptionTemplate.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/File.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/FileData.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/FileInfo.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/FileRange.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/OShare.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/Queries.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ShareConfig.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ShareData.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ShareDetail.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ShareId.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ShareItem.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/ShareResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/share/UploadResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/signup/NewInviteResult.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/signup/OSignup.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/signup/SignupConfig.scala create mode 100644 modules/backend/src/main/scala/sharry/backend/signup/SignupResult.scala delete mode 100644 modules/cli/src/main/resources/logback.xml delete mode 100644 modules/cli/src/main/resources/reference.conf delete mode 100644 modules/cli/src/main/scala/sharry/cli/ClientError.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/Cmd.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/Context.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/LoggingProperty.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/OS.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/Progress.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/StdoutSink.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/cmds.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/config.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/main.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/maincmds.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/package.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/parser.scala delete mode 100644 modules/cli/src/main/scala/sharry/cli/requestlog.scala create mode 100644 modules/common/src/main/scala/sharry/common/AccountId.scala create mode 100644 modules/common/src/main/scala/sharry/common/AccountSource.scala create mode 100644 modules/common/src/main/scala/sharry/common/AccountState.scala create mode 100644 modules/common/src/main/scala/sharry/common/Banner.scala create mode 100644 modules/common/src/main/scala/sharry/common/BaseJsonCodecs.scala create mode 100644 modules/common/src/main/scala/sharry/common/ByteSize.scala create mode 100644 modules/common/src/main/scala/sharry/common/Duration.scala create mode 100644 modules/common/src/main/scala/sharry/common/Ident.scala delete mode 100644 modules/common/src/main/scala/sharry/common/JsonCodec.scala create mode 100644 modules/common/src/main/scala/sharry/common/LenientUri.scala create mode 100644 modules/common/src/main/scala/sharry/common/Password.scala create mode 100644 modules/common/src/main/scala/sharry/common/SignupMode.scala create mode 100644 modules/common/src/main/scala/sharry/common/ThreadFactories.scala create mode 100644 modules/common/src/main/scala/sharry/common/Timestamp.scala delete mode 100644 modules/common/src/main/scala/sharry/common/base64.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/Account.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/AliasUpdate.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/ChunkInfo.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/FileMeta.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/Pass.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/RemoteConfig.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/Upload.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/UploadCreate.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/UploadInfo.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/UploadUpdate.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/UploadWeb.scala delete mode 100644 modules/common/src/main/scala/sharry/common/data/UserPass.scala delete mode 100644 modules/common/src/main/scala/sharry/common/duration.scala delete mode 100644 modules/common/src/main/scala/sharry/common/file.scala delete mode 100644 modules/common/src/main/scala/sharry/common/mime.scala create mode 100644 modules/common/src/main/scala/sharry/common/pureconfig/Implicits.scala delete mode 100644 modules/common/src/main/scala/sharry/common/rng.scala delete mode 100644 modules/common/src/main/scala/sharry/common/sha.scala delete mode 100644 modules/common/src/main/scala/sharry/common/sign.scala delete mode 100644 modules/common/src/main/scala/sharry/common/sizes.scala delete mode 100644 modules/common/src/main/scala/sharry/common/streams.scala create mode 100644 modules/common/src/main/scala/sharry/common/syntax/LoggerSyntax.scala create mode 100644 modules/common/src/main/scala/sharry/common/syntax/StreamSyntax.scala create mode 100644 modules/common/src/main/scala/sharry/common/syntax/StringSyntax.scala create mode 100644 modules/common/src/main/scala/sharry/common/syntax/all.scala delete mode 100644 modules/common/src/main/scala/sharry/common/version.scala delete mode 100644 modules/common/src/main/scala/sharry/common/zip.scala delete mode 100644 modules/common/src/test/resources/logback-test.xml delete mode 100644 modules/common/src/test/scala/sharry/common/DurationSpec.scala delete mode 100644 modules/common/src/test/scala/sharry/common/ZipSpec.scala delete mode 100644 modules/docs/src/main/scala/sharry/docs/md/ManualContext.scala delete mode 100644 modules/docs/src/main/scala/sharry/docs/md/ManualPage.scala delete mode 100644 modules/docs/src/main/scala/sharry/docs/md/TocAccess.scala delete mode 100644 modules/docs/src/main/scala/sharry/docs/route.scala delete mode 100644 modules/mdutil/src/main/scala/sharry/mdutil/Document.scala delete mode 100644 modules/mdutil/src/main/scala/sharry/mdutil/Link.scala delete mode 100644 modules/mdutil/src/main/scala/sharry/mdutil/LinkProcessor.scala delete mode 100644 modules/mdutil/src/main/scala/sharry/mdutil/package.scala delete mode 100644 modules/mdutil/src/test/scala/sharry/mdutil/DocumentSpec.scala create mode 100644 modules/microsite/docs/doc/configure.md create mode 100644 modules/microsite/docs/doc/dev.md create mode 100644 modules/microsite/docs/doc/index.md create mode 100644 modules/microsite/docs/doc/install.md create mode 100644 modules/microsite/docs/doc/migration.md create mode 100644 modules/microsite/docs/doc/quickstart.md create mode 100644 modules/microsite/docs/doc/rest.md create mode 100644 modules/microsite/docs/doc/screenshots.md create mode 100644 modules/microsite/docs/doc/webapp.md create mode 100644 modules/microsite/docs/index.md create mode 100644 modules/microsite/docs/screenshots/20191216-222321.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-222359.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-223105.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-223117.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-223125.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-223128.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-223153.jpg create mode 100644 modules/microsite/docs/screenshots/20191216-223216.jpg create mode 100644 modules/microsite/docs/screenshots/20191217-210812.jpg create mode 100644 modules/microsite/docs/screenshots/edit.png create mode 100644 modules/microsite/docs/screenshots/login.jpg create mode 100644 modules/microsite/docs/screenshots/publish_done.jpg create mode 100644 modules/microsite/docs/screenshots/publish_empty.jpg create mode 100644 modules/microsite/src/main/resources/microsite/css/styles.css create mode 100644 modules/microsite/src/main/resources/microsite/data/menu.yml create mode 120000 modules/microsite/src/main/resources/microsite/img/favicon-32x32.png create mode 120000 modules/microsite/src/main/resources/microsite/img/features-header.svg create mode 100644 modules/microsite/src/main/resources/microsite/img/first-feature-icon.svg create mode 120000 modules/microsite/src/main/resources/microsite/img/light-navbar-brand.svg create mode 120000 modules/microsite/src/main/resources/microsite/img/light-sidebar-brand.svg create mode 100644 modules/microsite/src/main/resources/microsite/img/second-feature-icon.svg create mode 100644 modules/microsite/src/main/resources/microsite/img/third-feature-icon.svg create mode 100644 modules/restapi/src/main/resources/sharry-openapi.yml create mode 100644 modules/restserver/src/main/resources/logback.xml create mode 100644 modules/restserver/src/main/resources/reference.conf create mode 100644 modules/restserver/src/main/scala/sharry/restserver/Config.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/ConfigFile.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/CookieData.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/Main.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/RestApp.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/RestAppImpl.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/RestServer.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/oauth/CodeFlow.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/AccountRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/AliasRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/Authenticate.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/ByteResponse.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/Conv.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/InfoRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/LoginRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/MailRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/NotifyRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/OpenShareRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/RegisterRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/SettingRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/ShareDetailResponse.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/ShareRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/ShareUploadRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/headers/SharryPassword.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileLength.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileName.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileType.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusMaxSize.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadLength.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadOffset.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/webapp/TemplateRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/webapp/WebjarRoutes.scala create mode 100644 modules/restserver/src/main/scala/sharry/restserver/webapp/YamuscaConverter.scala create mode 100644 modules/restserver/src/main/templates/doc.html create mode 100644 modules/restserver/src/main/templates/index.html delete mode 100644 modules/server/src/main/resources/logback.xml delete mode 100644 modules/server/src/main/resources/reference.conf delete mode 100644 modules/server/src/main/scala/sharry/server/App.scala delete mode 100644 modules/server/src/main/scala/sharry/server/authc/Authenticate.scala delete mode 100644 modules/server/src/main/scala/sharry/server/authc/ExternAuthc.scala delete mode 100644 modules/server/src/main/scala/sharry/server/authc/Token.scala delete mode 100644 modules/server/src/main/scala/sharry/server/authc/package.scala delete mode 100644 modules/server/src/main/scala/sharry/server/codec/HttpHeaderCodec.scala delete mode 100644 modules/server/src/main/scala/sharry/server/config.scala delete mode 100644 modules/server/src/main/scala/sharry/server/email/Address.scala delete mode 100644 modules/server/src/main/scala/sharry/server/email/Header.scala delete mode 100644 modules/server/src/main/scala/sharry/server/email/Mail.scala delete mode 100644 modules/server/src/main/scala/sharry/server/email/SmtpSetting.scala delete mode 100644 modules/server/src/main/scala/sharry/server/email/client.scala delete mode 100644 modules/server/src/main/scala/sharry/server/email/package.scala delete mode 100644 modules/server/src/main/scala/sharry/server/main.scala delete mode 100644 modules/server/src/main/scala/sharry/server/notification.scala delete mode 100644 modules/server/src/main/scala/sharry/server/paths.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/UserId.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/account.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/alias.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/authz.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/download.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/login.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/mail.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/package.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/settings.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/syntax.scala delete mode 100644 modules/server/src/main/scala/sharry/server/routes/upload.scala delete mode 100644 modules/server/src/test/rest/test.rest delete mode 100644 modules/server/src/test/scala/sharry/server/codec/HttpHeaderCodecSpec.scala create mode 100644 modules/store/src/main/resources/db/migration/mariadb/V1.0.0__initial.sql create mode 100644 modules/store/src/main/resources/db/migration/postgresql/V1.0.0__initial.sql create mode 100644 modules/store/src/main/scala/sharry/store/AddResult.scala create mode 100644 modules/store/src/main/scala/sharry/store/JdbcConfig.scala delete mode 100644 modules/store/src/main/scala/sharry/store/Limit.scala create mode 100644 modules/store/src/main/scala/sharry/store/Store.scala delete mode 100644 modules/store/src/main/scala/sharry/store/account/AccountStore.scala delete mode 100644 modules/store/src/main/scala/sharry/store/account/SqlAccountStore.scala delete mode 100644 modules/store/src/main/scala/sharry/store/account/SqlStatements.scala delete mode 100644 modules/store/src/main/scala/sharry/store/columns.scala delete mode 100644 modules/store/src/main/scala/sharry/store/data/Alias.scala delete mode 100644 modules/store/src/main/scala/sharry/store/data/UploadSize.scala create mode 100644 modules/store/src/main/scala/sharry/store/doobie/Column.scala create mode 100644 modules/store/src/main/scala/sharry/store/doobie/DoobieMeta.scala create mode 100644 modules/store/src/main/scala/sharry/store/doobie/Sql.scala create mode 100644 modules/store/src/main/scala/sharry/store/doobie/StoreImpl.scala delete mode 100644 modules/store/src/main/scala/sharry/store/evolution.scala create mode 100644 modules/store/src/main/scala/sharry/store/migrate/FlywayMigrate.scala create mode 100644 modules/store/src/main/scala/sharry/store/migrate/MigrateFrom06.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/ModAccount.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/RAccount.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/RAlias.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/RInvitation.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/RPublishShare.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/RShare.scala create mode 100644 modules/store/src/main/scala/sharry/store/records/RShareFile.scala delete mode 100644 modules/store/src/main/scala/sharry/store/upload/SqlStatements.scala delete mode 100644 modules/store/src/main/scala/sharry/store/upload/SqlUploadStore.scala delete mode 100644 modules/store/src/main/scala/sharry/store/upload/UploadStore.scala delete mode 100644 modules/store/src/test/resources/files/file.pdf delete mode 100644 modules/store/src/test/scala/sharry/store/StoreFixtures.scala delete mode 100644 modules/store/src/test/scala/sharry/store/account/SqlAccountStoreTest.scala delete mode 100644 modules/webapp/src/main/css/sharry.css create mode 100644 modules/webapp/src/main/elm/Api.elm create mode 100644 modules/webapp/src/main/elm/App/Data.elm delete mode 100644 modules/webapp/src/main/elm/App/Model.elm delete mode 100644 modules/webapp/src/main/elm/App/Pages.elm create mode 100644 modules/webapp/src/main/elm/Comp/AccountForm.elm create mode 100644 modules/webapp/src/main/elm/Comp/AccountTable.elm create mode 100644 modules/webapp/src/main/elm/Comp/AliasForm.elm create mode 100644 modules/webapp/src/main/elm/Comp/AliasTable.elm create mode 100644 modules/webapp/src/main/elm/Comp/Dropzone2.elm create mode 100644 modules/webapp/src/main/elm/Comp/FixedDropdown.elm create mode 100644 modules/webapp/src/main/elm/Comp/IntField.elm create mode 100644 modules/webapp/src/main/elm/Comp/IntInput.elm create mode 100644 modules/webapp/src/main/elm/Comp/MailForm.elm create mode 100644 modules/webapp/src/main/elm/Comp/MailSend.elm create mode 100644 modules/webapp/src/main/elm/Comp/MarkdownInput.elm create mode 100644 modules/webapp/src/main/elm/Comp/PasswordInput.elm create mode 100644 modules/webapp/src/main/elm/Comp/ShareFileList.elm create mode 100644 modules/webapp/src/main/elm/Comp/ShareTable.elm create mode 100644 modules/webapp/src/main/elm/Comp/ValidityField.elm create mode 100644 modules/webapp/src/main/elm/Comp/YesNoDimmer.elm create mode 100644 modules/webapp/src/main/elm/Comp/Zoom.elm delete mode 100644 modules/webapp/src/main/elm/Data.elm create mode 100644 modules/webapp/src/main/elm/Data/AccountState.elm create mode 100644 modules/webapp/src/main/elm/Data/Flags.elm create mode 100644 modules/webapp/src/main/elm/Data/UploadData.elm create mode 100644 modules/webapp/src/main/elm/Data/UploadDict.elm create mode 100644 modules/webapp/src/main/elm/Data/UploadState.elm create mode 100644 modules/webapp/src/main/elm/Data/ValidityOptions.elm create mode 100644 modules/webapp/src/main/elm/Data/ValidityValue.elm create mode 100644 modules/webapp/src/main/elm/Page.elm create mode 100644 modules/webapp/src/main/elm/Page/Account/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Account/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Account/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Alias/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Alias/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Alias/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Detail/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Detail/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Detail/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Home/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Home/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Home/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Info/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Info/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Info/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Login/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Login/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Login/View.elm create mode 100644 modules/webapp/src/main/elm/Page/NewInvite/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/NewInvite/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/NewInvite/View.elm create mode 100644 modules/webapp/src/main/elm/Page/OpenDetail/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/OpenDetail/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/OpenDetail/View.elm create mode 100644 modules/webapp/src/main/elm/Page/OpenShare/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/OpenShare/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/OpenShare/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Register/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Register/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Register/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Settings/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Settings/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Settings/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Share/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Share/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Share/View.elm create mode 100644 modules/webapp/src/main/elm/Page/Upload/Data.elm create mode 100644 modules/webapp/src/main/elm/Page/Upload/Update.elm create mode 100644 modules/webapp/src/main/elm/Page/Upload/View.elm delete mode 100644 modules/webapp/src/main/elm/PageLocation.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AccountEdit/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AccountEdit/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AccountEdit/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AliasList/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AliasList/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AliasList/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AliasUpload/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AliasUpload/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/AliasUpload/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Download/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Download/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Download/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Error/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Error/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Login/Commands.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Login/Data.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Login/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Login/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Login/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Manual/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Manual/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Profile/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Profile/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Profile/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Timeout/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Upload/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Upload/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/Upload/View.elm delete mode 100644 modules/webapp/src/main/elm/Pages/UploadList/Model.elm delete mode 100644 modules/webapp/src/main/elm/Pages/UploadList/Update.elm delete mode 100644 modules/webapp/src/main/elm/Pages/UploadList/View.elm delete mode 100644 modules/webapp/src/main/elm/Resumable.elm delete mode 100644 modules/webapp/src/main/elm/Resumable/Update.elm create mode 100644 modules/webapp/src/main/elm/Util/Duration.elm create mode 100644 modules/webapp/src/main/elm/Util/Html.elm create mode 100644 modules/webapp/src/main/elm/Util/Http.elm create mode 100644 modules/webapp/src/main/elm/Util/List.elm create mode 100644 modules/webapp/src/main/elm/Util/Maybe.elm create mode 100644 modules/webapp/src/main/elm/Util/Share.elm create mode 100644 modules/webapp/src/main/elm/Util/Size.elm create mode 100644 modules/webapp/src/main/elm/Util/String.elm create mode 100644 modules/webapp/src/main/elm/Util/Time.elm create mode 100644 modules/webapp/src/main/elm/Util/Update.elm create mode 100644 modules/webapp/src/main/elm/Util/Url.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/AccountForm.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/AliasEdit.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/AliasList.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/AliasUploadForm.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/DownloadView.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/LoginSearch.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/MailForm.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/MarkdownEditor.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/MarkdownHelp.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/UpdateEmailForm.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/UpdatePasswordForm.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/UploadForm.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/UploadList.elm delete mode 100644 modules/webapp/src/main/elm/Widgets/UploadProgress.elm delete mode 100644 modules/webapp/src/main/html/index.html delete mode 100644 modules/webapp/src/main/html/placeholder.png delete mode 100644 modules/webapp/src/main/js/sharry.js delete mode 100644 modules/webapp/src/main/scala/sharry/webapp/route/Url.scala delete mode 100644 modules/webapp/src/main/scala/sharry/webapp/route/webjar.scala rename modules/webapp/src/main/{html => webjar}/favicon/android-chrome-192x192.png (100%) rename modules/webapp/src/main/{html => webjar}/favicon/android-chrome-512x512.png (100%) rename modules/webapp/src/main/{html => webjar}/favicon/apple-touch-icon.png (100%) rename modules/webapp/src/main/{html => webjar}/favicon/browserconfig.xml (100%) rename modules/webapp/src/main/{html => webjar}/favicon/favicon-16x16.png (100%) rename modules/webapp/src/main/{html => webjar}/favicon/favicon-32x32.png (100%) rename modules/webapp/src/main/{html => webjar}/favicon/favicon.ico (100%) rename modules/webapp/src/main/{html => webjar}/favicon/manifest.json (100%) rename modules/webapp/src/main/{html => webjar}/favicon/mstile-150x150.png (100%) rename modules/webapp/src/main/{html => webjar}/favicon/safari-pinned-tab.svg (100%) create mode 120000 modules/webapp/src/main/webjar/img/icon.svg create mode 120000 modules/webapp/src/main/webjar/img/logo.png create mode 120000 modules/webapp/src/main/webjar/img/logo.svg create mode 100644 modules/webapp/src/main/webjar/sharry.css create mode 100644 modules/webapp/src/main/webjar/sharry.js delete mode 100644 modules/webapp/src/test/elm/DataTest.elm delete mode 100755 nixos-sbt create mode 100644 project/Dependencies.scala delete mode 100644 project/ElmPlugin.scala delete mode 100644 project/WebjarPlugin.scala create mode 100644 project/build.nix delete mode 100644 project/build.sbt delete mode 100644 project/libs.scala delete mode 100644 project/project/build.properties delete mode 100644 project/project/plugins.sbt diff --git a/.gitignore b/.gitignore index 20ff2b2d..4a818859 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,5 @@ -dev.conf +_site/ target/ - -# ensime -.ensime_cache/ -.ensime +local/ +elm-stuff/ +result \ No newline at end of file diff --git a/.projectile b/.projectile new file mode 100644 index 00000000..ae3a0324 --- /dev/null +++ b/.projectile @@ -0,0 +1,3 @@ +!/local +!/local/dev.conf +!/local/testing.org diff --git a/.scalafmt.conf b/.scalafmt.conf new file mode 100644 index 00000000..96ae4980 --- /dev/null +++ b/.scalafmt.conf @@ -0,0 +1,15 @@ +version = "2.2.0" + +align = most +#align.arrowEnumeratorGenerator = true + +maxColumn = 100 + +rewrite.rules = [ + AvoidInfix + RedundantBraces + RedundantParens + AsciiSortImports + PreferCurlyFors + SortModifiers +] diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 496fc3c3..00000000 --- a/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -# must use non-containerized build, because elm-compiler is too slow -# otherwise and using the trick with sysconfcpu breaks sbt -sudo: true -language: scala -scala: - - 2.12.3 - -jdk: - - openjdk8 - -cache: - directories: - - $HOME/.ivy2/cache - - $HOME/.sbt/boot - - sysconfcpus - -install: - - nvm install node - - nvm use node - - node --version - - npm --version - - npm install -g elm@0.18.0 - -before_script: - - export TZ=Europe/Berlin - -script: - - sbt ++$TRAVIS_SCALA_VERSION ";run-all-tests ;make" diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 94a9ed02..00000000 --- a/LICENSE.txt +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index dfb12725..15e65d89 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,14 @@ -sharry -====== +# Sharry Sharry allows to share files with others in a simple way. It is a self-hosted web application. The basic concept is: upload files and get a url back that can then be shared. - -How it works ------------- +## How it works -### Authenticated users -> others +### Authenticated users → others Authenticated users can upload their files on a web site together with an optional password and a time period. The time period defines how long @@ -20,7 +17,7 @@ can be shared, e.g. via email. The download page is hard to guess, but open to everyone. -### Others -> Authenticated users +### Others → Authenticated users Anonymous can send files to registered ones. Each registered user can maintain alias pages. An alias page is behind a “hard-to-guess” URL @@ -29,207 +26,12 @@ corresponding user. The form does not allow to specify a password or validation period, but a description can be given. The user belonging to the alias can be notified via email. -### Others -> Others +## Documentation -If authentication is enabled, it is not possible to share files between -non-registered users. One party must be registered. But authentication -can be completely disabled. Then any user can upload files. This may be -useful within a closed network. +Please see the [documentation site](https://eikek.github.io/sharry). -Upload and Download -------------------- -Sharry aims to provide a good support for large files. That means -downloads and uploads are resumable. Large files can be downloaded via -[byte serving](https://en.wikipedia.org/wiki/Byte_serving), which allows -for example to watch video files directly in the browser. Uploads are -resumable, too, by using -[resumable.js](https://github.com/23/resumable.js) on the client. -Uploads can be retried where only chunks not already at the server are -transferred. +## License -Each published upload has a validity period, after which the public -download page doesn't work anymore. A cleanup job running periodically -can delete those files to save space. - -Features --------- - -- resumable and recoverable upload of multiple files; thanks to - [resumable.js](https://github.com/23/resumable.js) -- validation period for uploads -- resumable downloads using [byte - serving](https://en.wikipedia.org/wiki/Byte_serving) -- download single files or all in a zip -- protect downloads with a password -- automatic removal of invalid uploads -- external authentication (via system command or http requests) -- managing accounts, uploads and alias pages -- a command line client for uploading files - -Try it ------- - -~~There is a demo installation at . You can -use the account `sharry` and no password to log in. The mail feature is -not enabled and uploads are restricted to 1.5M.~~ Sorry, I had to shut down this service. - -Or, clone this project and use sbt (see below for prerequisites) to -compile and run: - -``` shell -sbt run-sharry -``` - -This will build the project and start the server. Point your browser to - and login with user `admin` and password -`admin`. - -Or, download a binary from the [release -page](https://github.com/eikek/sharry/releases). - -Documentation -------------- - -These pages are shown in each sharry instance, for example -[here](https://sharrydemo.eknet.org/#manual/index.md). The documentation -to the command line client is included. - -Building --------- - -For the server, you need Java8, [sbt](http://scala-sbt.org) and -[Elm](http://elm-lang.org/) installed first. Then clone the project and -run: - -``` shell -sbt make -``` - -This creates a file in `modules/server/target/scala-2.12` named -`sharry-server-*.jar.sh`. This is an executable jar file and can be used -to run sharry: - -The `--console` argument allows to terminate the server from the -terminal (otherwise it's `Ctrl-C`). By default a -[H2](http://h2database.com) database is configured in the current -working directory. - -``` shell -$ ./modules/server/target/scala-2.12/sharry-server-0.0.1-SNAPSHOT.jar.sh --console -2017-05-08T14:53:07.345+0200 INFO [main] sharry.server.main$ [main.scala:36] -–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - Sharry 0.0.1-SNAPSHOT (build 2017-05-08 12:49:58UTC) is starting up … -–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– -2017-05-08T14:53:08.563+0200 INFO [main] sharry.server.main$ [main.scala:42] -–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - • Running initialize tasks … -–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– -2017-05-08T14:53:08.622+0200 INFO [main] com.zaxxer.hikari.HikariDataSource [HikariDataSource.java:93] HikariPool-1 - Started. -2017-05-08T14:53:09.272+0200 INFO [main] sharry.server.main$ [main.scala:62] -–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - • Starting http server at 0.0.0.0:9090 -–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– -Hit RETURN to stop the server -``` - -The command also builds the command line client. It can be found at -`modules/cli/target/scala-2.12` named `sharry-cli-*-.jar.sh`. - -Building only the command line client doesn't require Elm and can be -built separately with `sbt make-cli`. - -Dependencies ------------- - -The server and cli part is written in [Scala](http://scala-lang.or) and -uses the following great libraries: - -- [fs2](https://github.com/functional-streams-for-scala/fs2) all the - way -- [fs2-http](https://github.com/Spinoco/fs2-http) for the http stack -- [doobie](https://github.com/tpolecat/doobie) for db access (which - uses fs2, too) -- [circe](https://github.com/circe/circe) great library for json -- [pureconfig](https://github.com/pureconfig/pureconfig) is reading - the configuration file using - [config](https://github.com/typesafehub/config) library -- … - -See all of them in the [libs](./project/libs.scala) file. - -The frontend is written in [Elm](http://elm-lang.org/). Two libraries -aside from `elm-lang/*` are used: - -- [evancz/elm-markdown](https://github.com/evancz/elm-markdown) - rendering markdown -- [NoRedInk/elm-decode-pipeline](https://github.com/NoRedInk/elm-decode-pipeline) - decoding json - -Non-elm components: - -- [semantic-ui](https://semantic-ui.com) for a well looking web - interface -- [resumable.js](https://github.com/23/resumable.js) for handling - uploads at the client - -Configuring (server) --------------------- - -Sharry reads a configuration file that can be given as an argument to -the executable. Please see the -[default](./modules/server/src/main/resources/reference.conf) -configuration for all available options and their default values. It -also contains hopefully helpful comments. - -For more detailed information on its syntax, please refer to the -[specification](https://github.com/typesafehub/config/blob/master/HOCON.md) -and documentation of [config -library](https://github.com/typesafehub/config). - -The important settings are - -- `sharry.web.bindHost` and `sharry.web.bindPort` the host and port - for binding the http server -- `sharry.web.baseurl` this must be set to the external base url. So - if the app is at , then it should be set to - this value. It is used to restrict the authentication cookie and to - create links in the web application. -- `sharry.db.driver|user|url|password` the JDBC settings; currently it - should work with postgres and h2 -- `sharry.upload.max-file-size` maximum file size to upload -- `sharry.authc.enable=true|false` whether to enable authentication - (default is `true`) -- `sharry.authc.extern.admin.enable=true|false` enables an admin - account for initial login (password is `admin`), default is `false` - -Every setting can also be given as a Java system property by adding it -to the environment variable `SHARRY_JAVA_OPTS` (`-D` prefix is required -here): - -``` shell -SHARRY_JAVA_OPTS="-Dsharry.authc.enable=false" ./sharry-server-0.0.1-SNAPSHOT.jar.sh -``` - -This overrides same settings in the configuration file. - -### Reverse Proxy - -When running behind a reverse proxy, it is importand to use HTTP 1.1. -For example, a minimal nginx config would look like this: - -``` conf -server { - listen 0.0.0.0:80; - - proxy_request_buffering off; - proxy_buffering off; - - location / { - proxy_pass http://127.0.0.1:9090; - # this is important, because fs2-http can only do 1.1 - # and it effectively disables request_buffering - proxy_http_version 1.1; - } -} -``` +This project is distributed under the +[GPLv3+](https://spdx.org/licenses/GPL-3.0-or-later.html) diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 277f1f2c..00000000 --- a/_config.yml +++ /dev/null @@ -1 +0,0 @@ -theme: jekyll-theme-cayman diff --git a/modules/webapp/src/main/html/icon.svg b/artwork/icon.svg similarity index 100% rename from modules/webapp/src/main/html/icon.svg rename to artwork/icon.svg diff --git a/artwork/icon_small.svg b/artwork/icon_small.svg new file mode 100644 index 00000000..491090b0 --- /dev/null +++ b/artwork/icon_small.svg @@ -0,0 +1,143 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/webapp/src/main/html/logo.png b/artwork/logo.png similarity index 100% rename from modules/webapp/src/main/html/logo.png rename to artwork/logo.png diff --git a/modules/webapp/src/main/html/logo.svg b/artwork/logo.svg similarity index 100% rename from modules/webapp/src/main/html/logo.svg rename to artwork/logo.svg diff --git a/build.nix b/build.nix deleted file mode 100644 index 80fa4011..00000000 --- a/build.nix +++ /dev/null @@ -1,23 +0,0 @@ -with import { }; -let - nixpkgs1803dist = builtins.fetchTarball { - url = "https://github.com/NixOS/nixpkgs/archive/18.03.tar.gz"; - sha256 = "0hk4y2vkgm1qadpsm4b0q1vxq889jhxzjx3ragybrlwwg54mzp4f"; - }; - pkgs1803 = import nixpkgs1803dist {}; - initScript = writeScript "sharry-build-init" '' - export LD_LIBRARY_PATH= - ${bash}/bin/bash -c sbt - ''; -in -buildFHSUserEnv { - name = "sharry-sbt"; - targetPkgs = pkgs: with pkgs; [ - netcat jdk8 wget which zsh dpkg sbt git pkgs1803.elmPackages.elm ncurses fakeroot mc jekyll - # haskells http client needs this (to download elm packages) - iana-etc - ]; - runScript = '' - ${initScript} - ''; -} diff --git a/build.sbt b/build.sbt index d8f457a9..82f865be 100644 --- a/build.sbt +++ b/build.sbt @@ -1,237 +1,326 @@ -import libs._ -import Path.relativeTo -import java.nio.file.{Files, StandardCopyOption} -import org.apache.tika.Tika +import com.github.eikek.sbt.openapi._ +import scala.sys.process._ import com.typesafe.sbt.SbtGit.GitKeys._ -lazy val sharedSettings = Seq( - name := "sharry", - scalaVersion := `scala-version`, +val sharedSettings = Seq( + organization := "com.github.eikek", + scalaVersion := "2.13.1", scalacOptions ++= Seq( - "-encoding", "UTF-8", - "-Xfatal-warnings", // fail when there are warnings "-deprecation", + "-encoding", "UTF-8", + "-language:higherKinds", + "-language:postfixOps", "-feature", + "-Xfatal-warnings", // fail when there are warnings "-unchecked", - "-language:higherKinds", "-Xlint", - "-Yno-adapted-args", "-Ywarn-dead-code", "-Ywarn-numeric-widen", - "-Ywarn-unused-import" + "-Ywarn-value-discard" ), - scalacOptions in (Compile, console) ~= (_ filterNot (Set("-Xfatal-warnings", "-Ywarn-unused-import").contains)), - scalacOptions in (Test) := (scalacOptions in (Compile, console)).value + scalacOptions in (Compile, console) := Seq() +) + +val testSettings = Seq( + testFrameworks += new TestFramework("minitest.runner.Framework"), + libraryDependencies ++= Dependencies.miniTest +) + +val elmSettings = Seq( + Compile/resourceGenerators += (Def.task { + compileElm(streams.value.log + , (Compile/baseDirectory).value + , (Compile/resourceManaged).value + , name.value + , version.value) + }).taskValue, + watchSources += Watched.WatchSource( + (Compile/sourceDirectory).value/"elm" + , FileFilter.globFilter("*.elm") + , HiddenFileFilter + ) +) + +val webjarSettings = Seq( + Compile/resourceGenerators += (Def.task { + copyWebjarResources(Seq((sourceDirectory in Compile).value/"webjar") + , (Compile/resourceManaged).value + , name.value + , version.value + , streams.value.log + ) + }).taskValue, + watchSources += Watched.WatchSource( + (Compile / sourceDirectory).value/"webjar" + , FileFilter.globFilter("*.js") || FileFilter.globFilter("*.css") + , HiddenFileFilter + ) +) + +val debianSettings = Seq( + maintainer := "Eike Kettner ", + packageSummary := description.value, + packageDescription := description.value, + mappings in Universal += { + val conf = (Compile / resourceDirectory).value / "reference.conf" + if (!conf.exists) { + sys.error(s"File $conf not found") + } + conf -> "conf/sharry.conf" + }, + bashScriptExtraDefines += """addJava "-Dconfig.file=${app_home}/../conf/sharry.conf"""" +) + +val buildInfoSettings = Seq( + buildInfoKeys := Seq[BuildInfoKey](name + , version + , scalaVersion + , sbtVersion + , gitHeadCommit + , gitHeadCommitDate + , gitUncommittedChanges + , gitDescribedVersion), + buildInfoOptions += BuildInfoOption.ToJson, + buildInfoOptions += BuildInfoOption.BuildTime ) -lazy val coreDeps = Seq(`cats-core`, `fs2-core`, `fs2-io`, log4s, `scodec-bits`) -lazy val testDeps = Seq(scalatest, `logback-classic`).map(_ % "test") -lazy val common = project.in(file("modules/common")). - enablePlugins(BuildInfoPlugin). - disablePlugins(AssemblyPlugin). + +val common = project.in(file("modules/common")). settings(sharedSettings). - settings(Seq( + settings(testSettings). + settings( name := "sharry-common", - description := "Some common utility code", - libraryDependencies ++= coreDeps ++ testDeps, - libraryDependencies ++= Seq(`circe-core`, `circe-generic`, `circe-parser`, `scala-bcrypt`), - buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion, gitHeadCommit, gitHeadCommitDate, gitUncommittedChanges, gitDescribedVersion), - buildInfoPackage := "sharry.common", - buildInfoOptions += BuildInfoOption.ToJson, - buildInfoOptions += BuildInfoOption.BuildTime - )) - -lazy val mdutil = project.in(file("modules/mdutil")). + libraryDependencies ++= + Dependencies.loggingApi ++ + Dependencies.fs2 ++ + Dependencies.fs2io ++ + Dependencies.circe ++ + Dependencies.pureconfig + ) + +val store = project.in(file("modules/store")). settings(sharedSettings). + settings(testSettings). settings( - name := "sharry-mdutil", - description := "Markdown utility for sharry based on flexmark-java", - libraryDependencies ++= testDeps ++ coreDeps ++ Seq( - `flexmark-core`, `flexmark-gfm-tables`, `flexmark-gfm-strikethrough`, - `flexmark-formatter`, jsoup - )) - -lazy val store = project.in(file("modules/store")). - disablePlugins(AssemblyPlugin). - settings(sharedSettings). - settings(Seq( name := "sharry-store", - description := "Storage for files and account data", - libraryDependencies ++= testDeps ++ coreDeps ++ Seq( - `doobie-core`, `bitpeace-core`, h2, postgres, tika, `scodec-bits` - ))). - dependsOn(common % "compile->compile;test->test") - - -// resumable.js is too old as webjar, so download it from github -lazy val fetchResumableJs = Def.task { - val dir = (target in Compile).value - val url = new java.net.URL("https://raw.githubusercontent.com/23/resumable.js/feb33c8f8d5d614d3d476fc2b3e82372c7b6408a/resumable.js") - val outFile = dir / "resumable.js" - val logger = streams.value.log - if (!outFile.exists) { - logger.info(s"Downloading $url -> ${outFile.getName} …") - val conn = url.openConnection() - conn.connect() - val inStream = conn.getInputStream - IO.createDirectories(Seq(outFile.getParentFile)) - Files.copy(inStream, outFile.toPath, StandardCopyOption.REPLACE_EXISTING) - inStream.close - } - - Seq(outFile -> outFile.getName) -} + libraryDependencies ++= + Dependencies.doobie ++ + Dependencies.bitpeace ++ + Dependencies.tika ++ + Dependencies.fs2 ++ + Dependencies.databases ++ + Dependencies.flyway ++ + Dependencies.loggingApi + ). + dependsOn(common) -lazy val webapp = project.in(file("modules/webapp")). - enablePlugins(WebjarPlugin, ElmPlugin). - disablePlugins(AssemblyPlugin). +val restapi = project.in(file("modules/restapi")). + enablePlugins(OpenApiSchema). settings(sharedSettings). - settings(Seq( - name := "sharry-webapp", - description := "A web frontend for sharry", - libraryDependencies ++= testDeps ++ coreDeps ++ Seq( - `semantic-ui`, jquery, highlightjs, `logback-classic`, yamusca, - `fs2-http` - ), - // elm stuff - elmVersion := "0.18.0 <= v < 0.19.0", - elmDependencies in Compile ++= Seq( - "elm-lang/core" -> "5.0.0 <= v < 6.0.0", - "elm-lang/html" -> "2.0.0 <= v < 3.0.0", - "elm-lang/http" -> "1.0.0 <= v < 2.0.0", - "elm-lang/animation-frame" -> "1.0.0 <= v < 2.0.0", - "elm-lang/navigation" -> "2.0.0 <= v < 3.0.0", - "evancz/elm-markdown" -> "3.0.0 <= v < 4.0.0", - "NoRedInk/elm-decode-pipeline" -> "3.0.0 <= v < 4.0.0" - ), - elmDependencies in Test ++= Seq( - "elm-community/elm-test" -> "4.0.0 <= v < 5.0.0" - ), - // webjar stuff - resourceGenerators in Compile += (elmMake in Compile).taskValue, - webjarPackage in (Compile, webjarSource) := "sharry.webapp.route", - sourceGenerators in Compile += (webjarSource in Compile).taskValue, - resourceGenerators in Compile += (webjarContents in Compile).taskValue, - webjarWebPackages in Compile += Def.task({ - val elmFiles = (elmMake in Compile).value pair relativeTo((elmMakeOutputPath in Compile).value) - val src = (sourceDirectory in Compile).value - val htmlFiles = (src/"html" ** "*").get.filter(_.isFile).toSeq pair relativeTo(src/"html") - val cssFiles = IO.listFiles(src/"css").toSeq pair relativeTo(src/"css") - val jsFiles = IO.listFiles(src/"js").toSeq pair relativeTo(src/"js") - val resumable = fetchResumableJs.value - WebPackage("org.webjars", name.value, version.value, elmFiles ++ htmlFiles ++ cssFiles ++ jsFiles ++ resumable) - }).taskValue, - resourceGenerators in Compile += (webjarWebPackageResources in Compile).taskValue)). + settings(testSettings). + settings( + name := "sharry-restapi", + libraryDependencies ++= + Dependencies.circe, + openapiTargetLanguage := Language.Scala, + openapiPackage := Pkg("sharry.restapi.model"), + openapiSpec := (Compile/resourceDirectory).value/"sharry-openapi.yml", + openapiScalaConfig := ScalaConfig().withJson(ScalaJson.circeSemiauto). + addMapping(CustomMapping.forType({ + case TypeDef("LocalDateTime", _) => + TypeDef("Timestamp", Imports("sharry.common.Timestamp")) + })). + addMapping(CustomMapping.forFormatType({ + case "ident" => field => + field.copy(typeDef = TypeDef("Ident", Imports("sharry.common.Ident"))) + case "accountstate" => field => + field.copy(typeDef = TypeDef("AccountState", Imports("sharry.common.AccountState"))) + case "accountsource" => field => + field.copy(typeDef = TypeDef("AccountSource", Imports("sharry.common.AccountSource"))) + case "password" => field => + field.copy(typeDef = TypeDef("Password", Imports("sharry.common.Password"))) + case "signupmode" => field => + field.copy(typeDef = TypeDef("SignupMode", Imports("sharry.common.SignupMode"))) + case "uri" => field => + field.copy(typeDef = TypeDef("LenientUri", Imports("sharry.common.LenientUri"))) + case "duration" => field => + field.copy(typeDef = TypeDef("Duration", Imports("sharry.common.Duration"))) + case "size" => field => + field.copy(typeDef = TypeDef("ByteSize", Imports("sharry.common.ByteSize"))) + }))). dependsOn(common) -lazy val docs = project.in(file("modules/docs")). +val backend = project.in(file("modules/backend")). settings(sharedSettings). + settings(testSettings). settings( - name := "sharry-docs", - libraryDependencies ++= coreDeps ++ Seq(yamusca, `fs2-http`), - sourceGenerators in Compile += (Def.task { - val docdir = (baseDirectory in LocalRootProject).value/"docs" - val tika = new Tika() - val list = sbt.Path.allSubpaths(docdir).toList.map { - case (file, path) => - val checksum = Hash.toHex(Hash(file)) - (path, checksum, tika.detect(file), file.length) - } + name := "sharry-backend", + libraryDependencies ++= + Dependencies.loggingApi ++ + Dependencies.fs2 ++ + Dependencies.bcrypt ++ + Dependencies.yamusca ++ + Dependencies.emil + ).dependsOn(common, store) - val code = s"""package sharry.docs.md - |object toc extends TocAccess { - | val contents: List[(String, String, String, Long)] = ${list.map(t => "(\""+t._1+"\",\""+ t._2+"\", \""+t._3+"\", "+t._4+")")} - |}""".stripMargin +val webapp = project.in(file("modules/webapp")). + enablePlugins(OpenApiSchema). + settings(sharedSettings). + settings(elmSettings). + settings(webjarSettings). + settings( + name := "sharry-webapp", + openapiTargetLanguage := Language.Elm, + openapiPackage := Pkg("Api.Model"), + openapiSpec := (restapi/Compile/resourceDirectory).value/"sharry-openapi.yml", + openapiElmConfig := ElmConfig().withJson(ElmJson.decodePipeline) + ) - val tocFile = (sourceManaged in Compile).value/"toc.scala" - IO.write(tocFile, code) - Seq(tocFile) +val restserver = project.in(file("modules/restserver")). + enablePlugins(BuildInfoPlugin + , JavaServerAppPackaging + , DebianPlugin + , SystemdPlugin). + settings(sharedSettings). + settings(testSettings). + settings(debianSettings). + settings(buildInfoSettings). + settings( + name := "sharry-restserver", + libraryDependencies ++= + Dependencies.http4s ++ + Dependencies.http4sclient ++ + Dependencies.circe ++ + Dependencies.pureconfig ++ + Dependencies.yamusca ++ + Dependencies.webjars ++ + Dependencies.loggingApi ++ + Dependencies.logging, + addCompilerPlugin(Dependencies.kindProjectorPlugin), + addCompilerPlugin(Dependencies.betterMonadicFor), + buildInfoPackage := "sharry.restserver", + javaOptions in reStart ++= + Seq(s"-Dconfig.file=${(LocalRootProject/baseDirectory).value/"local"/"dev.conf"}", + "-Dsharry.migrate-old-dbschema=false", + "-Xmx512M"), + Compile/resourceGenerators += Def.task { + copyWebjarResources(Seq((restapi/Compile/resourceDirectory).value/"sharry-openapi.yml") + , (Compile/resourceManaged).value + , name.value + , version.value + , streams.value.log) + }.taskValue, + Compile/sourceGenerators += (Def.task { + createWebjarSource(Dependencies.webjars, (Compile/sourceManaged).value) }).taskValue, - resourceGenerators in Compile += (Def.task { - val docdir = (baseDirectory in LocalRootProject).value/"docs" - val target = (resourceManaged in Compile).value/"sharry"/"docs"/"md" - sbt.Path.allSubpaths(docdir).toSeq.map { - case (file, path) => - val targetFile = target/path - IO.copy(Seq((file, targetFile))) - targetFile - } - }).taskValue - ). - dependsOn(mdutil) + Compile/unmanagedResourceDirectories ++= Seq((Compile/resourceDirectory).value.getParentFile/"templates") + ).dependsOn(restapi, backend, webapp) -lazy val server = project.in(file("modules/server")). +lazy val microsite = project.in(file("modules/microsite")). + enablePlugins(MicrositesPlugin). + disablePlugins(ReleasePlugin). settings(sharedSettings). settings( - name := "sharry-server", - description := "The sharry application as a rest server", - libraryDependencies ++= testDeps ++ coreDeps ++ Seq( - `logback-classic`, pureconfig, `scala-bcrypt`, `fs2-http`, - `doobie-hikari`, `javax-mail`, `javax-mail-api`, dnsjava, yamusca - ), - assemblyJarName in assembly := s"sharry-server-${version.value}.jar.sh", - assemblyOption in assembly := (assemblyOption in assembly).value.copy( - prependShellScript = Some( - Seq("#!/usr/bin/env sh", """exec java -jar -XX:+UseG1GC $SHARRY_JAVA_OPTS "$0" "$@"""" + "\n") - ) + name := "sharry-microsite", + publishArtifact := false, + skip in publish := true, + micrositeFooterText := Some( + """ + |

© 2019 Sharry, v{{site.version}}

+ |""".stripMargin ), + micrositeName := "Sharry", + micrositeDescription := "Sharry – Share files conveniently", + micrositeDocumentationUrl := "/sharry/doc/index.html", + micrositeFavicons := Seq(microsites.MicrositeFavicon("favicon-32x32.png", "32x32")), + micrositeBaseUrl := "/sharry", + micrositeAuthor := "eikek", + micrositeGithubOwner := "eikek", + micrositeGithubRepo := "sharry", + micrositeGitterChannel := false, + micrositeShareOnSocial := false, + micrositePalette := Map( + "brand-primary" -> "#7a1800", + "brand-secondary" -> "#009ADA", + "white-color" -> "#FFFFFF"), fork in run := true, - connectInput in run := true, - javaOptions in run ++= Seq( - "-Dsharry.console=true", - "-Dsharry.authc.extern.admin.enable=true", - "-Dsharry.db.url=jdbc:h2:./target/sharry-db.h2", - "-Dsharry.optionalConfig=" + ((baseDirectory in LocalRootProject).value / "dev.conf") + micrositeCompilingDocsTool := WithMdoc, + mdocVariables := Map( + "VERSION" -> version.value ), - javaOptions in reStart := (javaOptions in run).value ++ Seq("-Dsharry.console=false"), - resourceGenerators in Compile += Def.task { - val cliRef = (sourceDirectory in (cli, Compile)).value/"resources"/"reference.conf" - val target = (resourceManaged in Compile).value/"reference-cli.conf" - IO.copy(Seq(cliRef -> target)) - Seq(target) + Compile / resourceGenerators += Def.task { + val conf1 = (resourceDirectory in (restserver, Compile)).value / "reference.conf" + val out1 = resourceManaged.value/"main"/"jekyll"/"_includes"/"server.conf" + streams.value.log.info(s"Copying reference.conf: $conf1 -> $out1") + IO.write(out1, "{% raw %}\n") + IO.append(out1, IO.readBytes(conf1)) + IO.write(out1, "\n{% endraw %}", append = true) + val oa1 = (resourceDirectory in (restapi, Compile)).value/"sharry-openapi.yml" + val oaout = resourceManaged.value/"main"/"jekyll"/"openapi"/"sharry-openapi.yml" + IO.copy(Seq(oa1 -> oaout)) + Seq(out1, oaout) }.taskValue, - resourceGenerators in Compile += Def.task { - import scala.sys.process._ - val jar = (assembly in (cli, Compile)).value - val help = (s"java -jar ${jar.getAbsoluteFile.toString} --help").!! - val target = (resourceManaged in Compile).value/"cli-help.txt" - IO.write(target, help) + Compile / resourceGenerators += Def.task { + val staticDoc = (restapi/Compile/openapiStaticDoc).value + val target = resourceManaged.value/"main"/"jekyll"/"openapi"/"sharry-openapi.html" + streams.value.log.info(s"Copy $staticDoc -> $target") + IO.copy(Seq(staticDoc -> target)) Seq(target) }.taskValue - ). - dependsOn(common % "compile->compile;test->test", store, webapp, docs) + ) + -lazy val cli = project.in(file("modules/cli")). +val root = project.in(file(".")). settings(sharedSettings). settings( - name := "sharry-cli", - description := "A CLI interface to sharry", - libraryDependencies ++= testDeps ++ coreDeps ++ Seq( - scopt, `logback-classic`, pureconfig, `fs2-http`, yamusca - ), - assemblyJarName in assembly := s"sharry-cli-${version.value}.jar.sh", - assemblyOption in assembly := (assemblyOption in assembly).value.copy( - prependShellScript = Some( - Seq("#!/usr/bin/env sh", """exec java -jar -XX:+UseG1GC $SHARRYCLI_JAVA_OPTS "$0" "$@"""" + "\n") - ) - ), - resourceGenerators in Compile += Def.task { - val src = (baseDirectory in LocalRootProject).value/"docs"/"cli.md" - val target = (resourceManaged in Compile).value/"cli.md" - IO.copy(Seq(src -> target)) - Seq(target) - }.taskValue + name := "sharry-root" ). - dependsOn(common % "compile->compile;test->test", mdutil) + aggregate(common, store, backend, webapp, restapi, restserver) -lazy val root = project.in(file(".")). - disablePlugins(AssemblyPlugin). - settings(sharedSettings). - aggregate(common, mdutil, store, server, webapp, cli) -addCommandAlias("make-server", ";project server ;set elmMinify in (webapp, Compile) := true ;assembly") -addCommandAlias("make-cli", ";project cli ;assembly") -addCommandAlias("make", ";make-server ;make-cli") -addCommandAlias("run-all-tests", ";test") -addCommandAlias("cli", ";project cli ;run") +def copyWebjarResources(src: Seq[File], base: File, artifact: String, version: String, logger: Logger): Seq[File] = { + val targetDir = base/"META-INF"/"resources"/"webjars"/artifact/version + src.flatMap { dir => + if (dir.isDirectory) { + val files = (dir ** "*").filter(_.isFile).get pair Path.relativeTo(dir) + files.map { case (f, name) => + val target = targetDir/name + logger.info(s"Copy $f -> $target") + IO.createDirectories(Seq(target.getParentFile)) + IO.copy(Seq(f -> target)) + target + } + } else { + val target = targetDir/dir.name + logger.info(s"Copy $dir -> $target") + IO.createDirectories(Seq(target.getParentFile)) + IO.copy(Seq(dir -> target)) + Seq(target) + } + } +} + +def compileElm(logger: Logger, wd: File, outBase: File, artifact: String, version: String): Seq[File] = { + logger.info("Compile elm files ...") + val target = outBase/"META-INF"/"resources"/"webjars"/artifact/version/"sharry-app.js" + val proc = Process(Seq("elm", "make", "--output", target.toString) ++ Seq(wd/"src"/"main"/"elm"/"Main.elm").map(_.toString), Some(wd)) + val out = proc.!! + logger.info(out) + Seq(target) +} + +def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = { + val target = out/"Webjars.scala" + val fields = wj.map(m => s"""val ${m.name.toLowerCase.filter(_ != '-')} = "/${m.name}/${m.revision}" """).mkString("\n\n") + val content = s"""package sharry.restserver.webapp + |object Webjars { + |$fields + |} + |""".stripMargin + + IO.write(target, content) + Seq(target) +} + +addCommandAlias("make", ";root/openapiCodegen ;root/test:compile") diff --git a/deploy.nix b/deploy.nix deleted file mode 100644 index dd69f6f2..00000000 --- a/deploy.nix +++ /dev/null @@ -1,122 +0,0 @@ -# then create a container with nixops (only first time) -# nixops create -d sharry deploy.nix -# -# first build the app -# sbt make -# -# start it -# nixops deploy -d sharry -# -# connect your browser to the ip address of the container -# -{ - network.description = "Test Sharry"; - - sharry = - { config, pkgs, ... }: - with pkgs.lib; - let - versionsbt = last (splitString ":=" (builtins.readFile ./version.sbt)); - version = builtins.replaceStrings [" " "\n" ''"'' ] ["" "" ""] versionsbt; #"] - sharry = pkgs.stdenv.mkDerivation { - name = "sharry-${version}"; - version = version; - src = (./modules/server/target/scala-2.12 + "/sharry-server-${version}.jar.sh"); - unpackPhase = "true"; - installPhase = '' - mkdir -p $out/{bin,program} - cp $src $out/program/sharry-server - chmod 755 $out/program/sharry-server - - cat > $out/bin/sharry-server <<-EOF - #!/usr/bin/env bash - export PATH=${pkgs.jre}/bin:$PATH - $out/program/sharry-server "\$@" - EOF - chmod 755 $out/bin/sharry-server - ''; - }; - dataDir = "/var/run/sharry"; - conf = pkgs.writeText "sharry-conf" '' - sharry { - authc { - extern.admin.enable = true - } - upload { - chunk-size = "256K" - simultaneous-uploads = 1 - max-files = 5 - max-file-size = "500K" - max-validity = "6 hours" - cleanup-enable = true - cleanup-interval = 8 hours - cleanup-invalid-age = 2 minutes - alias-delete-time = 2 minutes - enable-upload-notification = false - } - web { - baseurl = "http://10.233.2.2/" - bind-host = "0.0.0.0" - } - } - ''; - in - { - - networking = { - firewall = { - allowedTCPPorts = [ 9090 80 ]; - }; - }; - - environment.systemPackages = [sharry]; - - users.extraGroups = pkgs.lib.singleton { - name = "sharry"; - }; - - users.extraUsers = pkgs.lib.singleton { - name = "sharry"; - extraGroups = ["sharry"]; - }; - - systemd.services.sharry = { - description = "sharry service"; - after = [ "networking.target" ]; - wantedBy = [ "multi-user.target" ]; - preStart = '' - if [ ! -d "${dataDir}" ]; then - mkdir -p ${dataDir} - chown sharry:sharry ${dataDir} - fi - ''; - - script = '' - ${pkgs.su}/bin/su -s ${pkgs.bash}/bin/sh sharry -c "cd ${dataDir} && ${sharry}/bin/sharry-server ${conf}" - ''; - }; - - services.nginx = { - enable = true; - httpConfig = '' - server { - listen 0.0.0.0:80; - - proxy_request_buffering off; - proxy_buffering off; - - location / { - proxy_pass http://127.0.0.1:9090; - # this is important, because fs2-http can only do 1.1 - # and it effectively disables request_buffering - proxy_http_version 1.1; - proxy_read_timeout 120; - } - } - ''; - }; - - # deployment.targetEnv = "virtualbox" - deployment.targetEnv = "container"; # works only on nixos - }; -} diff --git a/docs/alias-list.jpg b/docs/alias-list.jpg deleted file mode 100644 index 444116cca815bed072f486dd7280b4fe34da07d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58065 zcmeFY1y~%}wlLaAV*!E(NpQCy4Z$sFL*uR?Xrn|e3kR0~4+j??_tq^u5ugQ35aOzZ-9i1Xd@ar2BMVWrXMIbyMMsX((8EuHVP5|84m>y06@CPibg0PSvUQn zhQW0!3qc`+m0Euh{Og|jwfRrcE$O7+7fMnC030_GBvcIL8-yo>;S`i9>rbczh_;lc?3^dtj5?}xIpg<|8tl5Yi1Un-#auMjApA-R$kBzFlB zf_&uxv2k3#JMwoV20IyGRXM!ch^HUh>=_cOFE*h_G@>3{&3^tsU4Wm2D>VQbk>ctr z!QB=MKuiAUoNMD!;GqW>q8shwNJ4sVC1y%NIHoM|z8@z$*dAARm`yagLDI(vJr*`z z^U?)vb#vI~{NZB-h2-DW`a2Sp1l#vEk&sIUf53#X9*g-eD!`Y6omHdU7-RqByX_ z(5phu^hSmp#Q-LL$zpDtIe*)T7`Tv>1iFazAYCRuTJJ0og+@NTuLJ;qfr@AX01NyI zfQXjAG`7F^f+U3V7XqM;Ne{rFzhQ1!wEiNK^fkO8kgk|IK5N0Y5YC&FTHu ztc#2Z@Ij)+!~82n01IOMkV!nQppmRhayq))U&6G}Jdh z*1fur=Aq!@hK4ju;WDZ$vOsC+semTv;}T@-5-1t&`E}#Hyi4HmKJK$|@{VN{WTBe) z2TWxY|7k-2s*ip9tmCLVspm-1OnvQ@i9X=ab`s>DjYT^^U{(Ae&dsy#r9G&rz!Pk|nsk76s zLCtID%U1bS8y^N5cAi2@MVJMn9)`_*H`)1e4Nw{B8n_h_kT&Xhmvo^v=Ko0L`gunp zCRQqQeM9aa&z8L{l`}G02G96}zaDPXxpbtSiCneZb{|n5x}%&iFnl!X_VMG(nYf~z zZ43M}$BwHWi}x2cf4l3yxz|ZuPpVtDs$UXyi;m&}X)Ta`0IwhQ#l4SIPP1Q^V@LnC zX?!BCuT*C$Bg{+rtUr$?9m)NE=g{*zm8|`5<|IQCelS4bqu+!87WyBjBWAW688YIU z`By*Ak z^yuC1%6^iVv=&~!Nin$X8hmb8V9w5OQUDev>kWrI=6Zu}0grFcKZAUV@oxfTYy(cl z@H$ttH*q2eDcp#A7;vVZb#n(n_-k!I)C6*BM`f=fU!2BR0LL9=u3n+nP@J}0A!HoP z7V6g~znS}$LJdh+{gnm)sJp7ypS8W^!u6_qj%Y06M)XeL->r_Lc{YyD{ifh5B$ zI!_34b3j1!^4K5V*u<4zNyHF*n9UJuAgcRQ6X7fYKfJXl34sogT^zlEjAIFoJ1R`P zN)k{=aoXb~NX!o4ul4SSL6WenpN4M`Gkp<20YIR8AMj&LV*x9( zkHiAyto}_30AjLeP$PI$26$8Nja*T|E&2xkGx&}r{!Y-z)A@s|PKy7Xl%zk@2f?C} zgtY=_BmltJV*nm1LIMoK2dN_p0JMx_)Ch!!NgQn9gCKqaH}>lvRQ2y-8GvM0RCFV~ z#jpyXLChxvMw0G{`LHo?Gr4Ftd{Q#J>t%(*gAqE&gA5<)z9#73=%dh+A{Gq(0VsF_ z5idRWk{;Y$L-j)up*6g8)*Jw_C%q~My;nCQW8^Lu^lRXOn8E=YLw%LJSdp$rxYolU zCTr*`$+y7joGc`T{0Fi{3qDBZZvb2$n;;(Df)1Z;hWdYWufS~Z%=zr{$`w}LRI!oR zgMF~bY9VEq0v<}6F}as1yu4TUwFFN|wV!0GeX({Tb`oRJilickf&ev60LRG0XR|SLiDIA7l?( z!bam#KWtXL|CVmNBE|!=H+l(qfAzHP!ke%Mdf1gt+-Fl+z)0b~(D)qZop~iwX-nQh zN37&}5a)BfGM*3~Y?McCfNmbie;N2{ST*IL?iNu4= zoMMe|z56KXf~T> z#<=;x2Y?7A@*xjvKF4CAgUfUCA01buwDrCZ8JPjQ7>P7Kvud6g8#;I5?(ZJtJv&^s z-hpj5ecAuIe5BJnV(6ypdgA%Q_%yd;d}AsgvVXIZ#jppn1)9YFLChvMZf0rhV7(tb zA-U(70wP!f)oS>&{@6D}Q2R;%ko%qikQ7vJNB{fRI};3lq>(uThqr)HLv zAb7vzz0InQ!}DgZIbR>d%!Z^TzWbhPg{z86fCzMKmp_E}jgcEGKkzTRpA+%M3kbNW zNFBy;S;zla6~XCLvVT{;5)<7GA4L>mI`d4tnd^bvC<5Deew~UpEF#tOwBF#KExjQT za5E_o2nm>Te8VDw@do`f_z?~KCP2oP`sJLU{@a-oVf2?+`o7jU1QBJLsc_rWa|zO5NA6 zvBg`}v{)6#bhlW6le2~0dEIv?sj9zQcR9si0JDdU#5`8d!eOm;s`?=RZ`A{kEa1zd zaM9GZB0s5CLMdq&wSa}6w~-k22sSJy5%nfcs}s`QeO=SN=D?PCvAz}HJi}fwW9(x6 z_iDkCKqW@TlIKY3!z7VFbYg&f6)4fesM|i66&tO9eUte93~nBqh~Ob|4hk{~Itnrx z00_KMyLoDYgoaN@heu3;PC(7Y!z)3=t;+v|2E_M3>JcpiJLod)3;sj9tKKj!;+6@0Is*r1dcwkcQkmIMz6Uv!RjnT~d)3ioN4u-q$l$*gw z%uqY;#x+2UFpjykhtD;&dr5jGb5m1lfI*ma*z`^{b!?})wYj;XA_40=)VFuqPdH?SvTeJnESWXJ4{6gj?| z&Ow33BGqHX{gBy+50qt@*6xdOwU0@arV@I{!}Ghiq`)eMU5VQBO?D-3+z2}^znElp zFVUyi)zYp{MmFMQ8q;!eGz~reCUkXAM%nLkT3h*RodEE@!?Mi5n{@?2X4gX<2rbiN zq6l@FlitN!Wn9s+9|Y|^^ItOD$*8cbAk%2JE>>Dc zUJs6SuD4Rc<{Ejonc&%hM$o5}*e~O?TD@ zKdY_>X>6s*$tsN1_LzIqt+j|NfF3x7gKr-)doJ4a@zOUp^oICT8K|j6Y3uJg*90B& zH}moZANN&lD|y~q=%}rK2isEbq#cA>HyQ0SwDe`l8eBFxTt(zxPx4Zai&mE~fH#PoXYd>IxLwyI7YG5NPNQSY?Hx(SNO#Z;{M_@Kk z&PRidhTg1$*$OEIpY;<&P#TO@JX(MUTzI5d8=LPWZq%_h)z56>mTwvJSs}OZFl23! z(APhY6coRDNbD#S!pfzb5c9)j{z{^BSb4WRB`X~`WNurhXj(k_nr54f4ocivl#WH} zuYMhUnQ|L@Uq?99>Nd}kl>YEsE>|B${g}VLXJDPNsKVy047=f(Tq;?u7>uF|0@U!wpH*a9r@QrgWp1>?t}leyZ@r~2alLs z16nV(-_0A`=lI&`K-zZ8JHvRh`AG8s+^)zZNc;`tq8eZ~Idio%r<4to54-;@>_suE z^cw4Q6^~J_RCg)RvulyHSAjp&R(Xp0TvvfV-k$GyXKVRw?@px#_X84+k@++-t*~S( z(88yO@Q_F?2Y21MW{l>t$@1$Z5f&Gya;Bxj=9%@Thnf}R_h~CCW+sfw5Bex1 zFAWm|a-nmPs|yWpGYv+@o0pmr_b*1{YgLGE5wz13?gv>{qo+4PXTKR5iKY_ZQdI9o zRlcge1~j~_`sNy^PgP^Uh%C0nuo|x6F;^^Kr?5O-c1u1Ll3F}G+$`cvFsH{t0cMZP zU#H8dDAisB$(gfqS|80`1Rsv%=H_?Q<$2C8SCbiVZm{!nYv^#~jqm0@3*3>;tk%ut z{9NN5@gej*E>K3pcuV*r`c&HY}YG)UWcJ}S-HxOct3%+>5!V&<2Uk#AZH z^ym15Y(uMNnT>9?@{4L?SOUrBQ>l6dD*CS*%<@V221rwDlORoMGemaPJ&n19S_mId zt_HFC>mLL=%GI!&rNUFpzs5c=l-d(*q%%tsO|iHe#&ocmn$J3BDVJ!Sil!rkZO+C# zT1Hn$+Mk>xq94}Sm^0Tn3^gcWj4Y@q_((8(NVH%$Ha^6lYVRWR#`R(|JfbwHx6WD- z#-US9`0=9+3-cHw_rxGW`1*$s8>T!>+M`3}o!VI4u)MvUF!ODx^@vcO*ue?A?zPCc zCu=7-*tweo?(6#@HjL)VdUrk(x$5^MTE>yi)$t;)HIwGvomx{53T&bf1;w2!Itw?N zkv4eq^mFq&Mn^kzZ_&T)t(_oP8tAi(Ik#e;mW)+dXs}#gkF=hR3)gzIF4HV6K0`(h z)?f4CO-`Y2k*Va&iH&9tzL-pneaeDz*7fXrX|ZkMdWY_CuU03X}J?`2&y`2vqKorN%uh^UgY~B`Am8EyD zl|DPmPf(azun~DQ74B)n03${+1; zx&^lN4t;1vd_j-9)H}H8YGdg97o@ALq{;KB4|*kmM1MUh#_%ePu6NShtY47`E`A3xSJ9+B^+gU z#l!0W3$TeHQ6~1~44$G-$cO~Ng_&jTN}2%wYK^6e!713~!g>6N;lx@i{ZODZVn4;Vix&0{pH)i^UxF+?6R#0Tg+UK()!Sgwz&)S;P| zjVb@B%T_yhN{(yaxa5!}^&~F@Pbnf+MusN2Z08_W?NPYe*VEqZam=hK#-e<5N*_oL z%l&JBPspv}aOWlWPPYZ589OZ|h#t zEEGaU7^)${t^dsF5+h~uUjJt=?WEmnz-%XeX}}uCIc++40nE9opE+~Lyg8Y7N=#pn z;HO+fxh!a*;FwX3%AhG!l#@e}|KN6|qUkLUCYmx9<-T@T83+C!R{F{F%j=nK#1dom z&F27P!Fz=>IhGL&J59uO`mBBa@xlQb z^tA>sxrqD=?@zvCSK{CBO{xYoM?RLTYetI;zca&5Gv8n$6X@$!=5dM({~hy?vi6U{ zf719#^af?y_htQ~E?Y<=7SYoWhK zD)*Vk#O5<64J$634t%&o&hWkPntaj1XVOo%^R@5WOOF@cJ{qGYDzK>f?b5H(Z>a>u z?FgVbu@k&ys|F$Hecd&W&IL(cD!ef5@Q2YVkFF}O7Gw|f?8RI};xaDqC4MRKytRuT zXU{Nv0?kFwii?O(3P`mTo0heQ8x+)(Qz~R_F@cWh4nm%{b7D?%jNN-eN0QFnac*@p0li1aHsQy-l<_=dVfvvm$#j(+3kD=&OH20(Vl@($Y$rm&|SHknC ze7B!0;~pvq$i-X(7P}ujuS--K(371g%M|f&(JdOd?=XGpygeyhKr4d(sq?fp#XWKl zdcYB+aXL0yPhL5$t?vf?K0*nGEc9p7>Zax-4NQ_(axgt``s5+Q{K2;+UUBR+?o($( zGsvJoeI+d|B#+?AY~10*R&v3d<Ya-Vkyq=z4&Hr)TC7`IWQSPx zG2d(Lr*q9f)@RgzybzlZDZ7&F;^d_z3OoyI0(?d_w5YKDrkK4&5@w6q^uU*&Fe65P zDJ|i}9n@wv*x0MMdNv@gU-MC@*lcQj{#4@#g*Y8ChmEkeW#59zWTO!A0Y^Z2qsP;H z_%Iyqr8Pw9*X*g5-(_QPm^HatxkYg1wRzPd@~)+oW#@ijAB2ETnfcpGo1Y!JJh`|A z01C6-W%5xu4(XhPc#1h&ab{%8{+mq_qWs-jc#v zM`d)+SF8u0i~hvcEB#R$qW>EkVwMaA>*p4z{hLiyb6|Obd4l@Cvk6%os_|?n6Q%|Sp1L7k5da-kXw+O|Br7LI4`2oW@dlMBcU(eOulUaT?4%RVlu_WF)OQ1Vc#f! zrjvSDQvG)3(V9}I;{D!UK{9kY>P_>z;eIjE&OErXl0QYyLZf%VoV7Zez@ps~+)V0! zvjbw3v4vg(2(2UVb3n4eW8`$wKS@UL%U_yBr5|BbvCF^6g8<@ZFiwhh3ganc$9HDh zF8!X>jn#u(tJg~lWgZ5xz-8VH$T_*Sm_lVMG(6{P@y8)sDIdMvWx5;n^-`aGS%?(V zf(j-+*^EoF$Mw~DBQy{q91t#5mQUVWZU0QV*_l2cCY>m2ln3UnfiN@_@7!N#AGSyf zD+`_jSr~j#|8$9Kh+hJVb+;jZT&`iW`=I=i>Dw1p>bDid3D)|Fl2yH|*^2t)f#d;X z8&1~%>E~D8kE4J#`3u+*YOYHDYb~VSS>wRZH%n%d|otShLr=wwd;gTPg#6 zjcrI+N^zTgKg+$@YdOCP4 zE#?=M&&O@gB~>2s$uBd|R`Q?4A117+fxae{nl2w^%~>&~t^M?qe~BV{7fa7kyI#&y zAy+LHcjk_)y;bfzd7;q0x>PL-v-~?yw06S}Z`PcigFb(Oz;pW;_v4)mo+>6964B(9 zR6B)>HAz)?#FoCMe?=91d+UqN*T`Su2eU?yfvW9FI%KxV?tFkaqbuW{gL+#z8SmyH zRC7In142+0v!#q{^>KJpQJLZVI0-Dh3B65ys5|W+v&!(;T_^>Itq>$L*qiZCUP3k;Mhide^nHDOleJObnpv^Luz-^(wGDZ+$wxUz|@x z#y{`G93o$Q%aXxbcLmFM#aFVNiucL1%sep4y*?Z`C!e1O7) z>X>6aH!qhjU??^u`klaipofQTp?bI&t@UFWy;*|$n(hp4G#lr>uPT$H>~RzD(ZG&E zd&}Sx+kLO?cRd*jGT3Q%FT(%&BqcH^H*2vw%D6rXcH+duOuCrOBl2c!#;4dP~4!n}LkK)ce z@PlYoop~c=oqC4_$$IDnHm&Z4Z^WeiL)2kyzEEMlWAn!>LhH&z@~&stcHd*`{5#+~ zB65Ewx4zm>V(uxu54yjsP;7WPMtpqt8!1%|KKduY@5=s!)DF{5{Z|w39<*6kLI0q< zp0A(#FO~g4=Z~iT*v81cZs7eVEmxmx1Ve&DOc)+sfn8~b2^}AbJ4oF-!JOQSPY{O3 zQE7ln;x3R}a9N_Ym2A^2vMs5+UAhLmRI9aR(Js9bibxuNTA3I= zMOz9Iy(=O;TWXd8cUV1Vb0Y)`EKL+CP1)St!YZ)PEMXc|t;@8nC+~ zgR3!l&O#s-fRU5cw_Bk7zC9vBW@m7Z;p|+`A}$|8JE5qQ=L1P;3~PO{`c-h{atJ=n zHK0BeK5`L+Si2U$2OwVJM?*nFd{2P#V}Tp-9zO~yKH^IQ8g4Z_vlt*Dt>oh;)I1Bl{wH1d zy8)7k*U6H}kC#xZxmSEjmd#okhe?p|#>7?BO%nlbTkaEBYKp8_S3{vP!xuU1KA+uSt( zyz2Sp zjP{Mq)UEGny9EPHhU6bG!3*`9XZm;)D#!~IQb|Hotf4t{QC3%MFG5a~Cy#IO!vYw% zRyVARlRw@gWHJvKl5cnzdN*t6DL2GbB_(jSHG)V-j6xB%1|!7b`7|;}WWC>kiY0kauFEDezZ0;kP`BEjGwFD(EMrnY0sL{oj0De}xb}tpIe1T8i?vF{^C*hTlC^E$M znOEzvC;k(G-5*_)gfi<_i19WPjklcGzfD)^-ZUY)^Xp{c1pl_hGDh4jQ?93Mn0}3j zg8ueLhuVL!u;7y&V}Z|@PK)!xm`UTGD11XG*vH|Bk>gjBz388PS{PXs$J93AvVKykPo5M>wr1IOJDx#^ zTE@G+ui!!5LxwoM24Uf+;}5JQOs%wiOKm&CA&e+t>SUO-!B>{9_}n8sVGH_9l4G+? z)ML46B8SE1aQbZ!I|qnML0fM)6Q~EbEbeTWIq83OaxBgwQ5$_A$R)&k;K6E_;Y~VE zY_!EZjiX^`03B8}elJU1V%2VY7MgS+zp~M)1{R_)L&4KzPS3p0J|p*}yBSSU8VUgUE@Tw1 z*iAmJ$=tuw_@YURaynG8+}bNHB3J7^sU&@ab|VeXG%`(H!l{nWHrgBOR32Smgk*`A zWeXSaVGOEv6hR1na`3KvjRmB>l0Zqy%0L)Y1f3$Pg1c=0nkAg}-NKAvrEs3~{0TNNu zKH<4Zt01RrDfLIM5P7xj_(x_%{w1@9f6=;syIiZ@x4-mE5ArgM1@3a||IilD=99=UpfyzNPLYbE~p z;L%l=9tSYfPfgFZZn$SsWV9~jb8y0YS^VNYq1i>oW|+%>9s~N@3X%+~i~IPlFo(Mn z4yl^nHiQR9(AXtn13R$|=>*8|v*fd9L5C*CDnv^irb2YMcv^LXqhn4bLsF?w#ncjV z;5wiw1WBj*u{x@?mN19TsB454iAK?ZMrW5@3G4ocINP@FI3s%pl)#Q~{Nyrrc1R(MH3{9xI7j#aZ*Js+I#8&XbA zaPYJCFnEWV>rg6FuWhSmS)2GbcjBEkZ=@JM#(gjCC8)$QBoVjPy~;NG6c9E42hzju zsud=q;p%^I{Q7)Zn@aulMMBVInOMH*Ios`G-521Fz26D3%$*D(&sz?4l#C^mk2G`* z@6(QtvAMT>4#FE_8IEXs?87G!WFyW=?9}W)n9v>>42t0jjvyWvB~h6sh>W7l%}I}| zes*y$8+g0nNODyThnZ*X>2Zn@S`c0YO{o+pkob`0p!q<_`YGxdPEp3Jt@gcbLabF} ziEl%u>|>%wc?Sba)~@M&<=A-QJQW`=?Wk0x?@an+=t(9Syj3o)@!@PD9vJ_e-U}D0 zD%T<(lgV>hu)KPdeqL|?5NC|PG(CqR!5FI`26JS!vh7V}=}Mqq-hub+#-wj3T0)<7 zbybVnTW5}yib#)Ft5QRrMcF*BY-q$PyF1Ms6lqKJ+>`wgO6m|#Da#(y(R~7HrrJY@ zS^X1(7M?nPZwi5aV!#7mmyUQTd)Y-C8vZOm9f)mE5*Nj}Gcho|&SV<%8erf(VjHmK z9|&XO{}j5r9`+!o%e9j&V^*@+=E)ZVVtZ4^%Vxo5RbtiWfwQXFQUO>*%&NI&U%asT zyL_pMw}p{U@4fPfY<<)7$k^=leeT&i$@{kk-GTooh|n9S5qBssC8hq_UbzpB8#cx-CQ1`0?~muH<=9aZUce^ATAGSxOsqtk}=tMM6?gp zOr3b8Ud4`~QPXjO_#{-FqoW$UW4a^g(unUt4U#>NOUO~C{dER6c#8W6OL+TYZS z0b_S1dh95J7OdF}ebQ(U0X_Hr?zDz;*bsv1}eu{jS+ zk#joQvh?sT#}U>?2Yx1hsV2(kUna=(h`q?r9xK#YIJb<#zM8VW`c%b(2@3SuHsx7Q z#Vo%R-P!Uq-LNQ#*3Mm|OIHlY<_{$bk|Bx}HdAEaIV{<iZoge=l2)VR5BDKTXZr z;Tx*r^d;b?0|R{Y(~%je&bmJ9$x>iPVoFz*F0hh9bct??JnH8~CHdEREVB0Pvvd|y zA$5YygQsq&3r-;LhfA)-!KU-@2G#`igrMyV5HxR|E2IuNHb7I)s9ymsUL3EGR13~v zBMF+vx&21RpQ$6!Q!5qv5;9~EVzMrr?GmRoRq%mjFn5+FX-qXpm4t2OD8mVZc}k=X z@?7I6Gu?w#!yYR--1HVHv(5^~3{K)`Y(CrThmQO<3n5qvhhi6&5HPc1FEgB9x>;W# zu@Iz=0p-Qch?O1r+6`)k48Nt%aPZCNPF_rJrh|Zopd9L(CK@c6uE^@b5Hp#2mI5YF z-kUj&H;n3~e6t#AUu0oPS7n!FWo2_&j@)mSjC_4Ti=m*Jap$sP^wrZ_ukZOXF%)ha zI!k`S?!a=>s@6z;DMCG>+*I4hU%jWA>ta2N&T_ova%Jg#$jFpujKwpp)EWGpb$#@E zWj9DIg}=~J@5OF_clccMm_O9RqmbzGEOci~+e+#(X``Lg#&k-Y3;#HhdA+=fX36pU zdhSxk5OcmY6v#$_VcsF+B&2TYB5zS2CLN*vs!(>MfN8r}vrr~~-cuoJ0UbQ}K&T+R z-9P~;{s6N^ek@Ld95O_b5_mw8JiK1)v+&dvsy&x%I1sLso$_=WUk1=*Su{tEQ7R9C z%qZ|$E3sy!9^FfI2+7W8vVxnD1o3&iIwmTZc=*CQlyJOuWuaft9Bw;;W|02OHet5k zQD>9ZG=#-pkS&iK7m$Xx=k6)}yul-%WYJC^9Jd`kXkEy7Rs$0en6T)|f%QPrka}F7 zXUC6C+*T1}k7reLkS(oCZ7>U9~OCMU#ZA-sD4M2=dTIBHJtw*7E+@-258Tk-9L z0X#Vtt_xrT&q`y z7o!fG{oEZD_daSEJi^dsX{sGRAIqj{+Sfy+U*KP}H$(VBriAn}Ylllk)d)kPvA!eI z>bUzs$Xh(CZA#NVx6h^QWf2j0^Q_iM9nf-D{jxtgK*@@~LhBamhhH`1X%dzA`Kut_ z0lEf!ety943H>vM`96+cySU9gCSDG%^L(BOdbCu)7J>9g~1`QJ_V0L`KboXY=HW{nG#PSQ2~X$ zuRj%k*0ku9En|jq_Ge$aOc33De{iwJeI;8myRmVhdv}58?_L_{Z;+2c%w$9H20T?D zqIvW%t=DZ1LzRSeOrW}VGXnM;dv+H2{1@3hVR8{ zsYbU-L3b|Az)H5~Z_W?wQ;Dh~W>>N3a31v`I=tJyxmqksVvSO*K7UalDCFRmXW zsL<6);dhHHeVkz8r;>Bp`*lo6v-kB$=w$mGE(7aBKB%ZRE`ymohfN z5^q>@cb1{MHl*r}2|1)Or1nkm7LDfs4XacvH$FY0)0I4x*_-}ccyY=LA43vx4iS?*Zy_G49sfEqPSxq)CzrdCpb0keX0I3?7it09njE`;zgiT{99Tw4;Y>lxe2b!1aTzaA7uGcXc_iiykocp}tQ(KQ0Yx znRT(f?FEmlT7XROrDJlsA3UtROI73~KU)ZXrspbUajiV6qhNNPERhP)C zBsdTFE-?S)O0PtWN}B3!OYQlW3)VL@VpNckcHZOgOFD6kKO@*2{jJu>zR14B&-@F7 zqSt?5=4TC}B9JHlVO9U875`I3`S1QxxBk&}MK9XKzv_#B9P}@Q_r>iP_79w5>v4{& zyHEU;xvgQ_BkqAzQfDE{ybK0~QR3~<^ z)_^z3X-4w)3i@sP05z(3$WCDs{{>WG7QQb2{`iFIoaz!A903}iQZHABb()&=GbqLK zIR^mhGIlsVOz~7XZSTU-3o)h?h4REBi`OjV+KGAjk4@v(^JOxZk-ejIp4Jg^v!0k( z7&||z{IC zK-cLV%bCp>1@Xf25;>#_7Z*4kqL~XA)z>XYyzVe$DkP-_b;8n3Ca*Dpi{Cq*7)pgS zMCWB}pkK*d15n7Bx>i1QM?pL1?VbC;aZ8G;6}Fl=WyB&?t)@6i);b341s%ESCHbu7 z8{gf#Bh_t(e3NXFfkrCBq;V;UNlD4C3Ep}#E6lsafXXR-#>r(2@~;>uqF!=y^A${0 zc($MgWR+2ln+CxJu!k5lRqe}lSq?r%5I*pX1-rd}R(#gs>~b>5$LG74>`?dZz%Gnj z@O2=GTLQRT|LhtN%dzuG$TXBEX1*qBQxyMY^z%u){S888C6Zux0KF-imTW~o>&RJ} zxPZ<@)HR?9q!ZS15NNq|Si%yl_Q)MWQbaii8`L8T z7E|mD-NTMUo0cQ>1ZWbYYud@2X7p?%55rzi`j#%zeEq7kkf1B6&&R37CJYpf5ebO3 z7+-gL(KCG6(ubetR>Mn(B;$>nC6il^E0^r5Z$BB&{FKzNGxwC04H7`pMPGRAmpAWe zp+T%xU3=@nh48u|MBvmDHlZ$24xJayCI|WMR~t;J4drm4Z^teRH9!2ArwB@1Ou*I- z@MW#6Rkg(=j7YWa-@_qFhSzT!$)95RRAShNxQ|ajLK#@*uwFn7ZkO_g!}LGmk?dur z7Q*(LL}&<3)z>>-D)&g|wzFDV#z(D{yoe5gYWpb_0>saW6Jo|}F~$iQq*;6U)nhcG zvL0#_?-bi>My+X&y#uiwLOE?tE3#O+a;ED}N6%Uv9PDuf!E>DxbvsHEH5>&-n$=r2 z#Kyz3&ZfojEQzN@Fujla5t{Jvd(H_p0dj6mkv7HC9c|hev&3_TY*=nnfeSKw>Jfkd zJ{JBUL;3PF9O36{1>x&_6^$iQ{0Z9eE5MMDPX3)Pfw_3(4M0aX&yj&*AnTEij~xrQ(2RDcM|TFrgF5#^!|75_ zw`&t>BBu5$@M)Mg_Om&O@AQ9^vV%G0DJBe~T5t8WrU45esd%y)fOa zD4eDYqeYHT>h2NpM!@w|!LK?ASOugCjGQ|#Avra#CE}GnfW2U-5rx$a5)L*{oCX=Y z$It~=moB9`1{PZ*+Z5Q_o@`5G}mx&oDiG*Iuev9U_Tmv7By?TgdgDin14MSui>u&w;uQU68~cWVJvF z3I^Y;l#yP;daQ4c+XS?W$c4Liuz0lko}AnJy=SW?Pt@=c+hLUwmgp8E@PMC%%6I#d zlXt(`9`QmQ=pK_S(zny*)6lTCpV#iD$GtE`c5~stRA;5E9pidu#g!Dwi;ZzcI?kau zlFb`Ymz64fM~N-qd3H!j61z{o_D1M&VLWC&o7TzkFQ3I2jpNw9IQZAvL>tW8zC4J@zlWh*rE#RC*#d%E z8jjobi!i3$ho7?0`@MRzCZAxM5+g89IQGn=y(+J9AUqF!d4@q+Gc?UiLf(e_{b6-& z_FS&SyzLv9`p#$bdmgxagDX7s;9;C65(DGzT@pJ+rtGW1}tRaj&13NRa}+7 zWumN}h4(WOeouM3vcEy_?tQROBTMaI=2?)!JGR0c(b0-txTQ}yzaDi*G*&I{-DFr|@^~4TU0^5GVmrGsftnz3v~5Y7AGw6Vu8 zY@IqMv=hkZIv#16NxI17_xalr?b=NbXuDsSDWwFF$uJpn2E-WfEl_TvWaXXC=dpc( zG>gzFXX`5zllk%JSWLfSbx0>vf09R2?2$Lj3$@^+<1~A6*0Gc3R!|Uq`sUP7g1`K( z?UH=jVw{8{1)2O;v2U0+2dR5XDs)A=p)Z`d-YT{X@ROIO79DYq>-_c*vQ) zUfTnT4QYl#)%ECsXnD26f_yIGYhHxh7OdL*Vw{ zoJl*3U}D==*@~)g(nk>8m#@Sk^+LCj9D( zZo9VpOB)0xJ9Nh(nXf-zb;&i}KSO-bQI|Zlf6zHak`7Nouj>M%Uf zHw=tFCrUC9om!{U->|mtY^X~p;gc$IVQLbc*gO3YXVs%~%fZw>XTX8cqW(5`>AceG zd9aNe$t3x+S(ipY!5iA0l+UcQsy6n=8(>PirphOt%yI>c8r-HO{ro9Xr2#R?x0Rk( z8D_SF6V=qi#tl*O<;N5pOl!*>731?*^OkA0DcsmRV77QTyA{OOfI<`{P@n-R4SbFw zo3lKRW73zPmhl+(L5I?*r5l7oUgniFnO8@*oB>1LE3JjmHTG z5sK_}1LCdzJ~YaT3W~4SP8aOxdxVtYn=GBC1G~zP3znn|?RAKXG)W~Ms|DIoC`{D> zafyA&p*TR+vDYxoPp!_D%EqQG@KQQiG<@?TxBkSoB5+xw&jXa z(_h>sLH8d#l+Fe1Fd7<0mEygde8r6Cy0CO>ji0lHAaW6NRkNuW9(dBHhR zLB)t{2A)S*DbG}o<}Bpt!^Mvw9`(dr8@>7qXuWFX_X7taXxiuCzS#y$a4Dt9TtWtc zI|f(M7`NXtaemk+Gk8?$#qfTM)MImXBf?i&kLQ3W-~;rL)%W|9U+lZ! z0S(JCEPO1-0iaW;NB-j=pk&}VPg!kgc^C%rkW*0O2El{_t7%VkZ5>W@uD%IQad&hr zzfAzqa@^7!Ca-$9649!W9c#?cl4(8ZHDEy9CVezQx<+Z1M59y!f^IHw#FI4LfT4db zRZ_u+81eX55@@|V?MB(`o~g*)J5bNWgBll`YSzekcM12$V584yx13%pQ7iS=aN)-b z%!2&u<_YErebt#!1>himj)CdCf&gPKM#I=7gY_#L7|>v?UVEJAgWK!s)Cogt4@TFp z0r1|ag?|*cK&eL16P{6nU~0B*}7$|m>LZ|o^Z2i3fGRR z8-EA9DdqutJqk2QK|hVo95qi148l9~h44jik;Hu$dF=hwLJGG^D8h|huf@w|ew@9T z&vLq)HtWJH9ikK>8(PL#47bISGE^)kONW%|l!B%k-E3$d zJ>aPxa;V-~j6D>1Jr67?mi1!^2{XCHycg^w;L8@yb7BPE8hlq)j#lRw5~i=O);$>; z9oTMDwR1l&q#u$1O|~sJT-+Y?J3Vj`x$%;d|ww_!f5Mxi{inP}=we!)zxixdc@A45r;Ha-TUxYZ8kM(K)r*Zr zqf_IQ#4<8(XWic;ekSo{^U_&t^kQP%o2sy|W9QaIfH9t!p!nS=xETB_vuAhrc+*8T z-+Y*cyo}gdK{RWA z*(k=8%e;xA%>TpPTYy!SwGG1uICM&f-~j>Y4n>ge?(UF7qtYM^(%s$N-Hi%}ba$78 zQWE+daGY_T(V2PP_y7Ozy8gZQwf0)~x@)a_#f}v<>WgAX;)T*nVNUN(@+YV33TsBH zW@Xg1?>1?z7~zoZmX=j*^&NV?WeQNGFV(gu76)R-$3#2zNl7Jgcto1N`4WQL&_%zi zY&Z55;D<7h*f)zz)vRzH8RtCSP_r|eKKm7bB5isaD>YEFi|vc6Eto-`9Zfj&f#ihS zOUL$v<3rL5)ckq0OyQNCBtT*Q{iAiIxpyTBV#H92t`vf>knYFZzUE`~gp#&9-KvE~ z4b4VDzo0eEAGs3g{+ap9n<(2P+&B&&B2%PB|606EBNM_n(|&XM`uQTfmHYGD!IuF} zpRuPWDL5=)bd5|yurjqJjbkwj8oZLd&-r+oB+4--DJ+kyyz>SGk!$DKtEt|eFS@8K8Q-& z{gp@<_?rGf_9)Ai@w7eQobW^b(Ja=MwHRrgTsucU`#G1lNoulzvvvzjufK`1M)mAd zwLB%}!#i1@8;NA1lH)fzj9$QU?~}0+KG?j&)uI`zC8<#rqk8Aq*pY7yyhp)SNk?0y z#=CR^`4>W!h`Sc`&N#4g=EIenX|(2rj)=S3q2)Az4b9YJ{@1Qx-nFPNZ#H8!l~$`L z{PI1bC)=G3=Y~dD-wn)O>>&Sp{;7%wpgzOQ%HgB;T4QXg-l&LK-XEX^h}l>+$-;N*Y7ojOW-E zZ2C5!A(oPSLnSu0%TiHQr>mA{LWY{7i=I@)#j2BV1Zkvlltv!*9bqiB@q-HO3g)b8 zqds!AXaS|wK2y5HGP&&luQL=+8@1xJ=&IW!fT_3 z{^wvv+!Ejv;LOmKnBKD0${6yPV5w5EAHPfR70|t1&^#Y%-n1$>AkNkAtRN1RhZIo0 zWAFV!H>|rXoFyk#$5Lg+(J2?$)F>gHd&o+k9Y@{BYZgbOcz04!_DRiN4wPF8jC<;S!p-yCTs zYyd1dlIq=;!DR?{J#%qmb7$0S<8bUy7=2{>jVx#9=8ik_%n!XV469D4mU`}&Y?Z?vg2T?sOaU41s8K86D>AAxn&^=S(O!KrlGK&s$$Yo`d07pgOudGC^Pl)o0MlPWR~- z%Mj8m_K!PupIe+&9i@|+N;!oBUu1V@gh#2_l6n-$MEIKffG2a6ylJzEB*6%jQ;h@> zLUaCX=9vjzzIb$}>YevSoGGR?q{%5Za=r2&_uLn!0Ut}zfInDPYwOH}D!FBxon`{#Qju<{}+JwZ@Qw~bP;(1 zA>%vIKe-WQXx||a+3HIfj(MC#;~)a*=L_Zu6dPIcUKq>#KL93qH4l@?DI))m45O_) zhl#SN{#iDsfb)HlH+{D}Lx!WRg0o&2-x5Mn@&7IGmF(!~G3>QK8N$80X`!-V69E^_ zFFo4wm6u^wqmJGloxP8|EH0n*t!Krshq@pgys-Sf6JSNK6Ij2=xD_1Gl zovPK|F>M3q9$o5XU)FlnqLUJ21;qoJu-Nx*>+&C`51I>~X!4xJi1t5i{h0sR;%q_r z9{o>I-$GC+0!@ftYEQyQ2=-O;Kg7@jX;G^Uv}v$1P6YR#WU*YE{yH$&a-^5|;cmf& zvl9-z^|F_x`o7;uU{$fU&wSk?OJ7xs=95=WsD*`K6;*rqMaG!tSTZ@Wih(h(0S<%p z$QpGR*@X6sZ(;*Sh~+4#O4d-^Nram}c3FayCFIlZTngvW_o>s?87(n45l1MptS??S zrR5U3#b|)XeA7o_;3FCuRN0Fk#VF-i=QV4h54e)CP6@;re!yS|b#3sWRCrfnX_bv@ zyuh_YZ#E|op843?Z=B=&sag>t+(#+++}LamWs?Gd823yfV^-SQ6>l)CKdkuiGl~NL zS9Ss!wL>a}_CtJ0ac&HfUjZc8M|(ajbCcp-#;{^?67TiovDYjWWp-+UP&0RCnBpi? z#(jyXu_+{YJW%upE!I`$`z^uL3a7mtt!Fy(NwU-&Y@ z`7b_LD49gX@HFjF%p%Tnd37(D`t4g|iCWk`TJdTZ1|RN`5{?Wxw~wxF$BUn2z5*Pm z;q-Bck1V)@*sC-?tTp#cc5EY;a$dfDUqQ%v&FMaSP{tM%;`)eg;tG6_!<%G&nRVf0 z8|=ggfjWu0YMEC>yQL~!^KeJe8mmxhSRz>*G_si$=ywlNFn~T6X86ZT^-*BFgUt*Q z7NO8qrZewH3ujO@@WCzJh^t0F-&S)Qcj5s{>KbXIHNB75BUeVrM~e#xfjcE^&r!U% zFP4`DuA{4yw>4B647d@Os$HB9>kq z2M7PiQ&AD+d3YWXSmi|M7~8#@qc`+W_bfhU$dYKI6;m&a-NSmp$|E|68V|t1ANJfi z600nAj3KiHdS#c8P#$PzA~@3_c|i>ni5iosqDoM&Q?p*O#F3lV*@{ll5WwBBhC%Wc zb2Bw7inqyUPmtv*iP#qvmP!)TSS@{EoQ~wNN(c?c<9;yo=CMUFkpM{=sf<*~gdBF2 zCiGMTPja9Ri!)<-YR?nf6XCh2M)?`GoE)x6C3_Sgn8dj+(OUdTT@X%&1X`DL1vO}` zAbJ>VS2(y5tq1@#+beaiezIa(2(m2Crn%JnP)sZNjvlI~@l8w|4Gy@)!1_|u!c;wh z=|SF|V#FBn!AL4)b10efWM|v7=})fH^qESF;3oB5&(?iqN4~St@*H|Z8@YlSdHLM+ zoLN+s*=Nht_l&x~0@#v-qO+5FwUkrzZ4KF7fHd>;&;8A%SY6gGr`sx^WXa~dN}+f^ z;Y$rH)4lQaA-xaglylLi&mg6eZbx@byXVG!HQF}+rVJrgzDp&^Z&XaBS}hhwT;MB! z(E>pF;YC6+VYD0&R^ihu=18T&7FZ^`w66ymZq`2-jPqpVt|}KF_4J0&j5A?&PD>tI z9Np$r2*H=6#SiOtbdL({<7g<>BDXC2l^7;se0+%{pdoCia}LcCDVFw6nDD{U>2TQh6hd2+X#snA zUjfXSWup59qzgyP+WNBAj}uMe_Swo9BrGSziH=2VzS30pe(bQ~Y?1ZS(VJKy&w4^W{JvcN_V!SB%oxB4We{gE;2{ z`BF{Xz&XGqjE^*#kz`XAt_Q}nw6b<>tw^bYfVh82`s_Gx4x83vFF<@AlVaLl8@AM{ zdfHNqbFcIKx*%Jr-Im@=!$c>WTqQfw{$o)me2Y##d6S?X-H@uWftgdc=_RX1`HI5M zPIyx3R`*f3QsFw~{A2{P*{J!W@?IQ<%K$s)@zNQ4uQJy(=TE?CWNBL1xamkIc)}8a zW-{$MMY@3|TI4Kt@=+-NHrcSq5*{k3dFHy1NwPC#wZ=XQ-biQ?Qo0W2f5#jc3w zbW$0a*+A@qA~k21W&eggp;0^B6Kx!r%9sEj8iSEkJBAqb&gfHt4Y@5uTWVx}X>*As z^Tqy0r}stNbI&fFv<%fWYBnhe1?P$S6TNLb_L`r)LEvQNS z)tvg|r%40cYuTOZlD#7%wI6h682u-9K4eV5z_PVjUg?ugS2vCbQxRo6p=^EQEIs+5 zKR1 z&58}pZ8;`+9~Nn0qBQz~1g_$mm-zZGggtBZyXZuLGs?7|MF&}1E8V4B*B|dbIDS2- z_&*JhzSezdEXFR=;3!futTd77=R-2}dC<{a1HyZgXEzVRJ8Gd364?IV25z~vyU8@M zd=!RWP&Ngrx;hEJj@J4c=d$~nhnG)xjONhusB1N9^(6CUs>PkB<*!wHxmuaWk3!3W z?OY9uR*7}-cg}wTe30S(_Xt0w`e&eG#;+v)K^w*z?3DaBy8VX9#G?Jry#6Vje@Oiw zV)h{N9eVIyoz5YNZBi?HEP@~Mfn^?OdgkKn`O-{PMj54^7X?-!$lH<9bhX0fQEPq$ zd^r^m2tf(~(u}lMTBPBd^$iy(h_?}?Q=q|O(ookzD=g7GbZCcR4wB4}B`cn)j8O-z z0;xQTgqaN{B@k+9m;+%|a9(QZ*Aye8*&Bd>Pz%biJ=zizDMQn0xLSMDfIy{0U5_AP zYWZqF6-x91ZlMj+9T`6)o}(h+vl=zOHYnr!t)7C2ah?LO+ggEN9= z!a)poBwkCz?0*H6O*{9zwd5;mJ%CJyY%JEQDb3HJSM4pogi7MK);b>grp!Z1$~4+Zc0yOYA3ZHWw4yDYrCz9A1XvJ8xLQ6b@u$fX7%fsmA|_O! z7+c>#t;co+iw&=ff22N_+4qs~r!k9+-Ad=X7y3rRj|^G_9_tNSVP|J^j=jLBOvJOv zFIzZp>yyUR=(#BrI0|q*WJjjN^e9Xl_*=qqwKWvRH5}D6?u=kSG zqk2X{qLg#Al8XvaAc>lSjLxjEQDNRH;05I+666OhS%3g$q`l`?fRsCAnh+xfWO5@E z6l9tZWP3Qs0huNQxI=m~%kl6C!`3q*qhc7u#MiMbXQP+y5&qj8AShl^6t~fiyn~}h zkh$`t-+6CBl8KaJJ6 zgNuXOByNVrBg`Exg-Tkajk}aw2n68F79z3Aj0p@r+NX*Sr)d~RY3!|`f)8U5OGI$Z zYUnyi4H7wA)h;|+<>&P?A{SY3jA3DN11efS>aOv`+<6$YjlDl=p$TJdjU2{xvF_Ut z5s_@pT8)j+NR}j31Lii>a5a~p>N}m2xGEhqg<^tBtz0}5R;hzpv%fgF{Ia@Oo1G{0 zNLk%QUnQY1A_Tb$T*TOSx26s*aDN2<{d*Lmz``9`0#+J2l~Dj2$AE>W3J-P%3Wsex5LCUu5QPInt1U9HEE???axc#s zX(rFOo&5UvQ1J0KVcFwPk3)%uO*vWmH(2azDNHRHGg7KVpF+y>o*F0AT*W2&bHrGc zu*pWxg}H${JErS-XvjWa=tO8b$cz#i%9Lm@1XvhRi$xD?3#$(dbMfxV!Sog_vJftL z6JZ&LhKYNgVQ?NdKZDh@v059XIU=Q*es_@A-QQckqe_@wP!1lAu@Fua>_s#!BFL^+ zZoEItiaU1T0a6{k^N!GdTb4kRK%2=lesFe#(2X*{jeriw93nQ#bzaq-GC8C7p6*Gs`G>+C`NS1gDE_CN`O>WepOl05u2IbWKIqVsordKKHu!<$4{0h$f!yf4$csLL0 zrup{96PH(MNcRViH}xAGwpLq>1D9eNIdqjD?0TuRao3cx&Qo;kVZzwN*lcwce!L^)z*w;w;d2^|Pmj)Y$+<3OKTtNA-B~7@ z7hJG)Hbs7lmb(<>n2{N|HgUlkV8$`9aWGP+Q6Qw>%!9-7I0>Y7q1vpS@ZP%gE1+$k z=aL5c{3I8L^tI7zlq#9^u6QE@0VvbV8GrH~6=T2IhxMFJA1UltJm_}ltBmHE)wSvC zoE~5oa4W>>sn{#c?6KmO_dg?rGmnHD3PJm*og(U>y+>#;_|BMS(u;}C$6z0r$gja* zF>S#%HVz-~=98wr^4nN*W(5p#%WRh%+cL<(cS6-2(z=@WO6>#ZrL;_X)->KbBcp_Su1q-AHrQUWD`hr&j{$HP>s<2PVH;RjPT zo-gsy54}FTW5(Hfaa`TsKnv;0^S1qT?>Q0Qy7wx@8-9f(>FnHk!RMsxEMed6D*$hd zCokir@t{re@}th@KAVVxSji6_%KRQo$Ul_P`$gOzs9u;P(SITR7VQ|%eg^zS-0xEU z;Pf*c{ztJLh#`0XoRnX&xmzN#M$UvZ{L}RRis&11hdAW*{dwHP6_MmoEL!xCR4LN<`P!54`3@801{NlZuYgx_7gVzbllcdjrEoON z2eVrk?6U|pc_jytw4un=bT0VI(8xs6IP&Z4K%ZkPiDO-Y%q1U*Q2bFbiuf?O$-}N* zWR!x@r4@(lHkZI@q`G{wy`TixB;!uugY!74vaQ4+Y;$hInU8n+U^?BzX_@7hHT_aF`O?0RE2h>r3pXGxHPdV>I%x6KYTlZG1bCvF{Y24d8>4_> z7dc$?U5EFXwF?X~j&UTtHaYPQ6Ip zueSm^CpD_7khuV_B?}-+o1v{=J1|0Cf!i`yP>uT&Pv@Gx0*0p_YxHLV`#1RC4r$)u z2K9lC8v5&p-Xk2sO+0RAv$f@>@FVq`L^Lw%HPcLS$_i#l(j35E(K0vlbqw`~o_j#x zjk-&Z@V0tR-5+y#G>fI=xY)u37wPUBE_NPepk}}n@tt|(uvfJabSQL^wgDP176)SJ zyIwTF@4;xb42{mw7lB`W6!OSW70l8drwYt!(tH@Z2ga5nZDyx6>=*!$SNXXf*s-#C zXv1O8#!xnd+C`){GBUiOCX0SZ0C^x)8eW3Ydhsd;b5}x>IohN;^lb+YQM%fZ5&}hL zcWejIMNQ|boD!kbNzeFemS7#>&il%uckEWNI?-hD`#Q>V&6IUug9y@WXlfVKJQJ%3 z7p!ARI1FuOY?`8*Mei@*3I@?9-H}F%{@{BCRzOb~`$EF072$o^V0fe^3-D>F2DJ?_&UhwwE<@n|3^q%^imRhXWok+zq zd-VC`)%FF&xSLO5>l!B>$Rf+TeIij>Ngvq{(uFn?Fb;j-T3KbBlZdLrtVkPGw1K$L zPX(Qh-?T(-CC^k!NAVgIKI7aPTw6(~*^bLL&E7Q8zF@{>0M=RHHU0`nwhJhm%NBWO zaI#EGha%kz)lRtbo``Mw1E;=<9?uF*m}5c;l4f&)*^p=XQx(DNsU_-Yuj8HlAbaP; zU^``Pb0&{V*K(EUGiybw1!~Bov3n+c z^d!VAU{nS$#PY>7p@NWM^#(Y0JhlCLoJ!U6pGC)BO|=uGZ(5Nu9MH35SjANGdc{>P zH!|r223=%w6+YH-5LQy`eRndfxP;FOeL&v!D73c6r6wjMsI`bMbJlB#IzE%X(H^0C zf@IQO4D$*p!045)Jg4`4zqj%jZI6f5=1Kg`{k~XQUh6;Y&`Y15eOV=>7L9`ZIF4K0 zvx3M4J_sDe{P=SfeO&Ncd0|tA3n!T~;2tR`2bIbxz4*+J7D_*gkolAJbQm=#q!1JX zLlFp`+G=SwQRU&!5M^K}eS(;**0&&waIZ&uSdQ~9ZE&V|F^h;Vpn@7Xi%PYz4ycuX zvWSHws)XDB2&ZAdU^)eqe^i$y`TN)DX^~_yy&FWWs)YU~LpA5g)!|phe zk?jTH(oZp<;?+KB_QefkIQEY6M<5s|XGGx=nJk>g3vhbUD43`FnsdMRxx^|9M-}YQ zvRb0f2N>fw_^8nm*FjN8)&dSvik)R@+pB=LViSX@m{+?Y69^8fwg@mttyr+^-1VZy z0j(BdDso0s2R7620xI%WC{)T5^ZM2^dJN{atyW&cIK!1+0iO)j?SuG;EHirXr>VBR z<)3*dA8qF#2{-aFkW@l%xK)D`@@YzxTj_u{k6k9A6qPbd9epg)r@`wsS7}&h-f1RViXO9pS~q^96>XT2(GPC7`_wRu8bOEp-VAT!w$}bd!RW zZjq{*7EvVOpe2!KRLOL4F8iK?QkRDWjj!H5*=BBy;g~l~^bWnF%1o2OdT)Gm?o6x! zqGOiJ;k%FRr6^QA6At}n&h*G|6pEI)F`6^Q2Ij<$O|eouOJ&~DIIk9@Hl?xUy}I6b zTFe+@<7hnA-^6%G7qqTg?jbrS3ISVcHj!RJ%!|FQawLUsocbgB^n zY(}Qw7qoW;rhW_edN-McL5ChZ2<{!z6&I!qOZFnQ7lJa~%28A0HS@EIv##pNPInZJ z-c~P$P@W~CYL-cQ8?V0Kg{(Z_U1fNTkq$egl8#1nr?5?78e3zJ(_+fe&XT%!bD^#y zq=W``&EQVq!HN1X+zU>!A|1@REMN}h!};zpy#sAfWnBb)7|}gk5LnzeS&U%&Ip6wq zW}{wH1Go(V70=kRsRZSTJUzYIh4lOL#~i$Z_W5vG&^8oh_;wRiTdg%pN5$_x&2{26zqV!tI&w(m$l-XAtx)Mbmo3g*}79S@iD(7l)CH+{w zzio9U>H?#z?{?Yjz%PuwKV+_6$N*eaXff`OwvAGBOR5+2sjnv}#dDY0ydoXG)M@^d z@a|OU@I%|?(?=I^yvu~)0vcKJyd;?tCNp%-OrxKCN;@hXxav0StOs@$6UN(Ei(Woe zxf(3_oTB;ZXW&#z_tqKUA^RgJK`B{XZ6Lj_I47w;{R)5|e~=DYqLTqfM)IZo z^!B3XZkY9GJBL+9c-IOQ?o$Yc@sR7K9YfC98LKWB9o4On0&(z z&a1PPky3#AVtgww%ly`3Sd0qJl(?Y8?Su@gM@C@H zL`%+|$gj;l>ZcV!V>FbLe0fmUfjb#94tZMQUKcvqHzJtN#Jh{znKC#p#)I^RScdYT zgxvscs@BUwj~OG2n9bpIR5~<2zk5I({)JT$_g!ekI-OaUHcXXc$g*;}4W*2OvpkP$ zwV6a-$^b?~?EL(cEzK6Vuxp5)6I+pW!If}!Yy~Gu%!D+KgL{$K>t22ZRPBaY^|g5Q z0+2Tj{Y90;TtHZ3?3Jd2Ol$)>A_44j*d{4S(iCM<&Km_I$?UJYNfwC30CB2?i4qJ# zq`4KZx2ADEd|DGaLO1mmDsO?7p5=6D)TB1BBK7Bb$yq4NKjnC=L50qNEMr_$$TLVB zp;ULU1~WJPNaVbiBwdnYxau7NmN{(+TnKe{%k$@$4~eBUk>yT|y)-Lqm1`;1J`oLF zDQg5YM)eYyKOG5BO)s%h?W77zjYrHZqSm?(TgijxWQEW8ZrAZ07m+VGzANNJDP#U= zCQ{vYNJuMQ>4*Ec8Sm8CEfb2n+2t8n>oQtOFW$<7WdkY+N)nks>-r3H#IS#4UHQ5L zPGO19EZUc0W%5CLt%qGj4HZd+g-1c#36ORye`IO!D)2aSfxWI#CmP9!=*jz1o+cOx z*y`&+TxWr#XH_j?jD0lOs#JxRL*{jzAf)6pM{~;7*-Bg_ahclKDcew{CVX+B7Iu}G z!aCyqhf5q?CB(VY8tQH=8>>3}aVHttO${luG}F0Lxg}W$7=<4jM~_+*oY7vtyPJNN zo{J}_G0zCdr{L*9AsTumw3$AZqEs5vGW;AdT4dO7VQNf94=3G%m~Pa*ya-oHgA=9E z5U4GECzB8~U7`2dsWY<-oB6f6t+dslcHfqp*u?{Lc6}a&Qy2+6l?%3!WvfF9tb45cDxv0G*oh37H=m2qiy%Mj05Hu$b)kZ1&h<8J#OX1M9UDcga{cxn`_WwKnNI-# z)?7Nd)~*@ZB1Ibcz1qmUlfTuXD|9UvcW+4fcS{e~Xnz>uz8v>lOE;y~*8uhnR^p)69Vk~ zUjT^%3Qhfz{*e!cXZqP7%s)xqm?tE1AARM7#rXwCx(ndlU1E`=A_+u|cp|3$E)3EeXJ#qrOm9&=Aly_WnLU&Znc z8<()-Yjcf>nv!2SR!KYuO`joO^%oC$`1fw?IqG&Geb&&5zFfd~Kt{j|zj*n@z3uD@ zUGCP}!;sjM#mRSvFQW(QoFeg|QY_FgvLZhv_gwz+dUqK#1^Gpj2m07uPb~As%De7< zFIr2zSsUf^#r@}L|8PB9+y~DW#E5e3IrP_0U}?-#Uq`l0)Be&y(neL=MSJglaGR=f z1cI5(Kn5!~LuNigl!I^2G2dUk}!{b zO&Hs~>^w$!-rtR-=M}jHaNZI?mZ`&*s0S9&3P0JF5(7^|{=~R(#(%1Zkr=b!svc=V zL_!n&06)Innv_a*2pXG^d{4E%`6e7`-ylSCXXBh#kwK7J-t3-%!c&FzFm zgcX&&UZ;^g%p-g*Ixn6CQB(TJ6gm9P8xn*BWh~{ z@O2&}&jGYTRd{R+&FlIV8SftXWnT^6iceJ$kgWHA8QnQVn zrLdHy;8blTf407|T+@VMYJcH9TYFaK{O%o1hHQN$$#oeCm<~xu%JZQw63gKQvXCaNY_sWbUF6VaXOqib5~pVD z+h0QdF}^?havdt*sug9gN{~?78B(yXxyb+o%Ejn$B~iR0g;z9L&t}EIwUlli4Fpr` z4;)y!ZUke<(F&UQJSZuisk7L06Ru*{_N?ec9zg9=c$638xS|KAky+tQgl8i^yMt~u z8E?dv=9l&vdiV|jvlXdPU4Cm#W0A<=apO#=Q|>|M ziISmCTj~Im=2xQfcI|Hkxyo>rz1j(zDFYYbZTOyivjs|A@I3GWD`eBmQ!QmGw)&re( zp;RTvDq5d@V!=$Hyx7a9$y&H$z0j)6%7hI~xR5`yQma&{kuAE7$L7#p#NTY0&*hgG zmn~bf-3NerLErkJZ+|zafx^#rqb7ak5u(;}`eI_bb{Xe#Aw-uCe0LnJx^MniFy_|1 zThiEp9zRTAXzrqJs7=bPs%3WpQCmQVG8BhKY_dhFR}7}9=3ZFhD{s_yT8JjczwQ#7 z8c35{18AYRX)VHU8*FmqzG0}grDBEM386a`tCC;5l@W!%=mq#wqoA$g4Qhi|= z`l{=(t`ZN!w86_K!+NTop08we_tvbG`Vc0jHeZ+}7}U9t%;r#G($_3>gTBM(EQq^JoN~dRPGro|^9*sQ&mi&*EByE{ql3m?(7GdC=|01wi}Z^2i}(cH zT*30)z|(EEws0pjz7HkVUCcLeCVRym`1nquAOy=L1O~PjGEjf1|>$(hG?^}C+Nu54`G~?WA64uXu+o%43!rkk30s7w@tD2Zv z0L;N{$S;Zab}MSACUc#|ikGT=%8a|GySptu}O^l=n7}DSp2SOy=SJm!qF>n0lJDs;6u{6 z6}{04En|)LeU;WB>XBhhTMUf{aY23=>9CdCt{?ofG54Om8;v8RZ?NC)TwgN;T?P?2SrvGyZa=k3!{a(p2+cS#6tQ zJ0$$;J%uemGrq587=uhG*Rpl`IMM^ zm{tvuasf6AuKMZ6OZJue6BxBqv!LTuH}e@Yd7F31jTLQk!?A{|FWSw&Cd!r&Ju**&R<@7hZy9(l%q287wp&n~3xslmassJv(UGXm zBE`ug#eWF@=!Fbk`F8Mq_W%HqP{2rWU?d{B2gJRh1>L$3&tERF-ytB(+gLAg5af#F z17Pw4Z-nxbe}n&(HXIS?0R;$0B!}iB$G9N@V%&0r;Ct``Z}{+&d;L}7H;5R7Ef4@j z?jd%A1Ar)u2pNR~^x_A2@q?ftH~{kSU(t$#p!oq9{N#~h5V<$9Zt%r{5PUDh@5%Yy z^Ghb*Fd=D#T;!0vx=rA>jJk#Vn$Y8qs2?#wkc8hd`I*c28!-GgL69Km@9_VI)os*m zl7A-Xp9mou{yJm-1w+Jtf%7XJASU}&)IY-iD5(DfCcyu>+`p+i|ERP0FYC^~(Fam5 z{tensasDrxm=Ds1{P)U#H!%S5zo-3Hi*H&0fEVDuCI43IK@ho^kcQ~L)Ex5`9~uFG z2?h9XX}{$XCZrjJv}ymP-2cla{x7xtEoZ)&SnRiq3P-%P)J@w6ibMo{%gJBo;jL-- z$N@Jk7{~(=1Pul0fPfwdkiG!u#Rr1Ge@%O9Vle=w*iG*S=_WAwfDnlgi-$vcF-RBo zw@uSG#V`;6(0qV!F(Aa&(2$-H0R-t@0g&L|(tb1XuNC_no&URrI?5ikcGmLd%DCnE zEpPuWPks=s@$Qy#*0L-6M%BMf(SN2z=t1qgRnoO~!HV(^e+Uqtcz*Sj?Z`KzRQA zT5utZprUGB&RKqYgYeD7fPZ%osjq!wn=*Yv`>htIeFc0!559Z;e22V!d_Ud4dwzDm zUQ_&LNvqvk-4Soy-${O8^JnU|@4+81ey92#_p^J$t$=R@2J)Bn`}sS+?|^Ujvp<5r zWBek;e_-DDzTArWR<`)JAs=CH&a-XzPmou(AI~q>b)(zvXVcbSKD+%0|FysS)*Qea zSBy6|?gkOUJ~v6y`p-0r7D>`}UoOdKv>~G_{~Y!6(D^OnZ>19c!{j%l#TPT+xl=6RcfSA0;*an*W|4?D zWyRyR8cciqP%CL}{DilV?c3sXEBn?;kl?o>eCvh-Zh>syqrM|c-nMS)v zmz{HistLM9{8mVze(?V&2Z7uxfIJfMK`=xYg2C_fLD@G90Ki*`w=N&t?#F!taiE77 zq>}@M10atk5RSl`w=!WLNCT}qZpJ7E=X(_x;!lMELHMmt{npRH*okJY*@D9P$vyZ$ z(1?)NsvFIr#Xym?R5uN@HHq+gS1)*iqgNkO42XdUz`RxQ)&(r5#9oWuJPAQ&NrdwQ zAa7_8xsa|7Q-TCj92hyXFZv;7`{2MWU@RR0g7Dje%WX*kVL~KAk$WKkF%f{_;(&03 zo3z~YxHtSkkrZzsdH{GJ_N>;sd2#)%&;Dk9=vy7W`5{!lUl_N3Oz~g{1ato;V0hzz z0Eo9Zx30$z{@)0{LBwxxZl&KM-v)0GAQ|%A4Zq3QKVLUV{_Xm!KEFl%fb%=@zxDwC zHRd0hd?)$VqWl&9uOOJ;)AgO(zoPnv{F7|_*W7-YjsJ!N;(wv!f2Ql3q5qAPzvBG= z%ft}VW5NO>q}k-1%KQGB*jvaiObqhk2LeD)+^?R0p)OGm__;ZLW#XH6D&Y@}vi0O) zt82DDr;SAXIXoQk=Cz8W9!w@q-qP`NoJiT5DP4CUpUohfJ;B2OAv-?Z9#D`eU5Ai4 zT^KgD5gCxlT%Hw7dc#K`z907k#egiXSY63YTK~X>=C8+|%G)_1tgdGGU5?PGM_4cB%i?5mbsr(-(F;Lo1(WHdwtv1)pGQ$EDAyU`Jcg0(+wp#C!c#!!1kUJ(P=3 z%7mW5S@_WDl|?Ku3LF!L#Fpl!bn`qd+{?}q6HKP?JSNAoddLr%>7NmvLO>1{;cic* zh0DgRAZ{k8TAh=ea4vnPwj1CWo1_cXpD5`)_B?l~T(PdfwgMC28%$tRb<>EoMrK%lDYr zEhK{|(?|RFJx+k!$?Bno$w=YlPY7LwJUR2((~~rU^aIpUJz=v)h&LNA}fZKiqLL@n@>?>x;&=>go;hO?C zV*BOH;Y8yuR#j;prT*EwQ|l_Xq&>(p9_MuHyHnxT0y(Y3i0jvPiER;)TQ4J8_C?Mb zh!)nYU4HHjQJgy=L6*qx))>Y#+!1f?l(2MR!h$ohSguKv#lK(>uz~8PI`gi;F63I!pDv-5DrAFM7w?v!kQb zTaHCcNbeG|4Rdq*$wiQK+_GuOI%||y31QuoRGRN4dgmC4e&+O;2Yatfv~A=T9b+*I z_~Z&5%x9H&6lXm;V(xhQ7znGpPtAel5kZa_g{=h_-*k$g(q}$4)O63wt79i_ZOV?o zGr4DHGRNB{OHHeF)=yF_)$6>`agv#)(0C`aAmP1MBtz-uo9f+~FsKMjjoPP7lsQH0 z@tuQD#)9iHS(jn`J(EO9cTeyf5%aOVTB28&XVlV2^`{ek`1;=Z%utE5C2F~QQbk_$ z8dVdG$4wQCG=$n*^8nd&=&Ii~1ag}e+my*|iw1ePa*%kLpgv76eye!@!ad4z%(?Sn z#4softGj`lr(3a1fC;gOo!WSyPb(rtC4{p4Q^zIZaX7EnSjcAAC7WyFrj~4bkZ4ap zk2jrjNw`}_ZS@fogPE}&WaF@Jhx8Fn=Eh4Y!tvEpLk@-<;olDdbsixj1>VxfJ^{^P zg{t1z1-nF2GbW=P3Dxg%Em^@yQg(UCBkJ~-|pWgSD_GW)j zNK3muWA%_y_hfU)zrZ`6FHtt=QCijUL&npW{%?2%H|}M8LLd6{6zoa9@8~? z{7e6Ve~i%Cd+yoH{{>!U0=7^}D;Z;UFS$EEK8C8Q{%|Q~yo(+`mL0PxWqG;JP&0}E zhaD_SzTprsko-E92eKuFt{3N?qwzE{QY)sSg11fwhN)4Rs2vi}R0Tg(9sg*Lz3Bch zs#lXv{mhawSC=V^92r1S>I|F zS7~mP_KENMI4IIwNz(fvrc{+p&)OqIbbijLIGgSnRod10u7viKJhZO>>$QBAgRz4> z=d7GL#`eooZk9bIgqaWnhBthI&6QN-{ZG9K0=am%1o^eY@Pe7zcNS9VBv2o5qL{Cc z>#|CNeZ2?z8|LarMLa$R?K8Drk9{}-;u1pT<`%>v7cAb2IXCx49_Y} zZ_B->oP=Q+)&?NjeJOO+Y;<3&uzBPu5eS@*^n!-o_>;D6)X(Fzcmxlhj) zXb~##2x0Ah_}|_9Hf-#|u1L$4h)xN=kD8-?+4ZvK;`krBflG3u|LtKSVf2>Z_X9R9 zPi;qO5Z2;*`k6WA?hE}{hWlv{DB_VrVAlEirSX59Ce%w&#+)yRB{&ovR*}Qbunve# z>=GuPs;B&MOXuAyW0F;!Q+zWS1mlEI)8(ku#f|a~GPURuo5*&LINGfBNRFtU1Q|9> z%5TVToF@W{qyiPGBTpZAs%& z1qjPM^?fOt`jMn1>^U0NUHxR?ZZU)f1g?jXSR83i_7`K0bVbvfZhe&9H7X&&>NWa@ zxIs&%f{vQJcNk+HkREVi(u_t9Ira{>v2_lFC2TzT1;?VxX9>U{eILMVtjzC(6hOwB%2Q)3L!N=cnP#DLGHUd zPE_ZLRoF6Ec*a#Uw^R1~Pu{nuZoOGTr9hGQFp!ZQyR5~7Ra^sqzFFAS?OB5-D6k;S z_@FOjEApvI&bzqM$kXD}BAW(pb9rGE=>oRI*hIVq-K4NhR+3TaF7+22++qiZm*{y&YPb+qoKp*U*@iI$j!Bx=i?d{%!{mtt2ce@_8gWz(yK=n8d!7b)qNclDBmoEo1rLP$mA*NCSR{ezc9jGW zpG}9H-thA8D3mx}_``U5ox0mq@E4wrycAii$RA?pCUwOXfv@41CegkkFxUWg7)E(yC~VaBM{yvjrngTkKBO4qE4#Cim! z>w{oYM@fn#p;p4?@fEHVA@g?zXD)tZv$z$9qVf>3Dw@w<>L3F5e$axrC1r&EMHDz!$k9v@30qAU_ zPV~8(M7lug=Is)bbTzixltQE|X!ZFcnu^b-gid2eJnpG>sZXs9HXc@Q+*b_8TahQA z!r4pbD3J<@iPsqMO!mvXPq5_c5YswJet<>`+shDWhXVo*PskCzB&TCTlB1$}YwPNQ z@2M9PG)$2z)NA4KV!&*xjcRP!v$=2lL*28)J+nEDh>GDEy)q;z2V{{dRDE$ic5i1F zZcdbsb0lK~Xif7*6t#5al|wm1Wuji|kfBr_U4}p?1!!-9?dQ#WI&%X_En{NVfC=^> zaLv#M1VxohOVi|}_H>5bv=LXUP5cs%HN$O$=&^PLo(+|cw-LuVe=W zf>WUJIhs`4QE!zGBZ6Su|H70F#Y4C; zT=y|fi45=|6kW5{OS%UmPeG1I(WV|(c42sp+*l=JkfDVlxV~~iFLd~!3j5_g_2iTD zy$PJP3NBkw?p${=$FAUX$F_)^vLmsX)>2g6g4GzR;ul8Ye7N}>Mz9?KE3eQk_ zhyq^r-uLW#&UQqy3W$`%lU}a88((|4Gz>k37%rE; zxK;e##hc}e%cvFO%yiuGpnUX5SG#B^lQ*4;isnP}knu;0At^cP+YJg7qx+n`ZR+AO zRhq3KKv#gEVdVhxvLdhDAda5Xyckz;g2aq(DcL3Zm9MOh#nwxQjQQDSbehz&BUckM zlvfw|YzpUGjG^UBp;p563WLVg{m`Hcz8~+t2$J51=*Fil_rbYBbFd*N@3miSz$m9b zv3@G1^1wq$W;acgzr%F)cf)YlT~dvN-2vAtD@RtDgmS}74nGRHg1?C;;>I}309!S} zxH*L;juuLAY$As;GA8ouL-kH9s&5@Z0jVLgO}fpJmJ$lPmhTx3S_<`OLnQcep$Cnx z9e!8!S`+OG`4Wyek%81Igj#}678KOs5yuyMl=Cw{GOUM^1OD@+R(WNKFHa%_fD0S*Q= zVkLvv&5oE(rN>$Vg(qhzW?z7M#cHAjk;7DtA>)`SKuuE`xr5g)7TYfSMF>|4RYh?@`5+(O@Nk=c+G zd6T}X$M`cv@^y+DKwO9|U3xft z-PTecj4V%JnoH^Gh-q_XMSNZCVX3LNUs{oFQ{ifn3D~fT8&&Oy9dHkzaR(YP?$i+d^k# z&99-X$6!Jb)f-+MBuL-JlC0R~0rsd?p=E{}4TR1w24xRaGQM`jl-2pBu$V-v>5p7l zMM#T`^O4vmu871lCUX~xtTf&=DUwh0^>HMlnDo@_QQiX-_r&Ml{TAWRVC-3zN0;Dja6dpJ1^`fR9KK>rR<38DIsY5YDb&S@v3U zJiGvQK~W)Gaex$<2S?uQ-eHZ25drz#>z;GUo0}n$_l@N~cmj}zbNEMR{h3U5_tC44 zG3l{8jR#ME>oM5s;4Q_KsPkt&=wSH9rFNAIn}6%I0N5|E&0LGgqLb{W^vC{Mfuo17 zz0c*Gzgi@+7NxMY!uF)^nQ6aCGbr1b+CBG`ZvSs03Qedt;l7QK`mQ&EMMgs<)7Ngq zpT2!*A@r|DijQ7iPrLDE@eYlBeR=JTu_$n;Wa)U<@8a!$7fY*@Hw_#GIB_FKC4
1`ZNp6eG|7#kTw(pLQ1q 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 DtsMY6 diff --git a/docs/alias-mail.jpg b/docs/alias-mail.jpg deleted file mode 100644 index dd96e8ce76d4e6cdab6fdfad7a1ef7bdc7712d48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77127 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 E0S=%nQ2+n{ diff --git a/docs/cli.md b/docs/cli.md deleted file mode 100644 index cb4a14b2..00000000 --- a/docs/cli.md +++ /dev/null @@ -1,98 +0,0 @@ -# Command Line Client - -Sharry provides a command line client for uploading/publishing -files. Managing aliases or user accounts must still be done using the -web interface. - -## Getting it - -### Download - -There are prebuild binary files here: - -- [Sharry Cli {{versionShort}}](https://eknet.org/main/projects/sharry/sharry-cli-{{versionShort}}.jar.sh) - - -### Building - -You can build it from source. It requires Java >= 1.8 and -[Sbt](http://scala-sbt.org). Run - - sbt make-cli - -in the source root. This will create an executable jar file in -`modules/cli/target/scala-2.12/sharry-cli_2.12-{{versionShort}}.jar.sh`. You -can link it to some shorter command, like `sharr` in your `$PATH`. - -## Publishing files - -The command `upload-files` or `publish-files` can be used to send -files to sharry. The former only uploads the files while the latter -also publishes them. - -Here is an example: - - $ sharry publish-files --endpoint http://localhost:9090 --login admin --pass admin ~/Downloads/*.mpg - Prepare to upload 46 files (113.22M). - Authenticating at http://localhost:9090 - Creating a new upload. - 100,00 |==========================================================| 56.61M/s - Publishing upload. - http://localhost:9090#uid=cH3wcZqnwv7QQPFQ8sRvm-o - http://localhost:9090#id=JNDKvZahrw5wmcN9Mxc2jOdLfOrOnkyzB3Sco - -The last url is the public url, if the upload is published. There are -options to specify properties for the upload. - -You can pass everything to the command or use defaults from the config -file. - -``` -$ sharry --help -{{& cli-help}} -``` - -Since you can only upload files to an alias page or your own account -one of `--alias` or `--endpoint` (and `--login` and `--pass`) must be -specified. The `--alias` options wins if all are specified. - -You can also run `sharry resume` without any options, then it tries to -resume an existing upload that has been cancelled. - - -## Publishing text - -There is a special publish command for markdown files. The markdown -file is used for the description of the upload. All referenced local -files are added to the upload. The links in the markdown text are then -changed to reflect the uploaded files. So with this command you can -publish a markdown text together with its resources. - -The same options apply as to the `publish` command, only -`--description` is ignored and only one file (in markdown format) can -be specified. - -If you don't use markdown, there exist tools to convert your markup of -choice to markdown. For example [pandoc](http://pandoc.org/) works -great. - - -## Configuration - -The config file is `$HOME/.config/sharry/cli.conf` and its format is, -like the one on the server, in -[HOCON](https://github.com/typesafehub/config#using-hocon-the-json-superset) -format. Please see the _Format_ section of [configuration manual -page](./configuration.md) for more details. - -The config file can be used to set default values for certain options -(e.g. `--endpoint`, etc). - -### Default Configuration - -The following is the default configuration as shipped with sharry for -reference. - -``` -{{& default-cli-config}} -``` diff --git a/docs/concepts.md b/docs/concepts.md deleted file mode 100644 index ea32717f..00000000 --- a/docs/concepts.md +++ /dev/null @@ -1,139 +0,0 @@ -[Contents](index.md) -{{=<< >>=}} - -# Concepts - -Sharry allows its users to share files with anyone else and it allows -them to receive files from anyone else. - -The basic idea is simple: upload one or more files and get a unique -url to a public download page back. This url can be shared with -others. It is not protected, everyone can download the files. - -In order to receive files from others, ”alias pages” can be -generated. These are unique urls that are associated to a registered -user. Anyone can upload files using this url and they will be visible -in the receiving user's upload list. Only the registered user who is -associated with that alias page can download the files. - -That's all. - -## Uploads - -An “upload” is a set of files (and some meta data) that have been -uploaded to the sharry server. There are two states of an upload: -published or not published. If an upload has been published, it is -accessible through some public download page. The owner can decide -whether to publish a download or not at any time. If an upload is not -published only the owner can see it. - -Uploading files is resumable. Files are transferred in chunks (default -256k) to the server. This way a broken download (e.g. due to a lost -connection) can be resumed and all chunks already uploaded are -skipped. Uploads can also be paused and resumed. This should maket it -more convenient to upload large files. - -Downloads are similiar. They are transferred in chunks and range -requests (a.k.a. [byte serving](https://en.wikipedia.org/wiki/Byte_serving)) are supported. This lets you watch -large video files in the browser without downloading the whole file. - -An upload can be given some properties: - -- validity time span -- password -- description -- maximum downloads - -They are explained below. - - -### validity time - -Every upload has a validity time after which the uploaded files are -“expired”. Then the public download page is not visible anymore and -the files can't be downloaded from non-protected urls. - -The files are there and the user that owns them still has access. They -are eventually removed by a cleanup job. - - -### Password - -The files can be further protected by a password. The download page -requires this password in order to download the files. - - -### Description - -You can add some text to an upload. The download page displays the -descrpition. The description can be [markdown](http://daring-fireball.net) and is converted to -HTML when being displayed. - -The description text is further processed as a [mustache](http://mustache.github.io/mustache.5.html) template -and allows to refer to the attached files. You can access the -following properties of any uploaded file: - -- `id` -- `filename` -- `url` -- `mimetype` -- `size` - -The files are refered to by either `file_n` where `n` denotes the -first, second etc. file starting by 0 or by `fileid_` where `id` -is the file-id that was specified when it was uploaded (it is chosen -by the client). So this would render the url of the first file: - -``` -{{#file_0}}{{url}}{{/file_0}} -``` - -or - -``` -{{file_0.url}} -``` - -or using the id: - -``` -{{fileid_6487425-DSC0100JPG.url}} -``` - -The web application uses the file size and the file name (without -dots) for the id, as show in the example above. - -This makes it possible to embed files in the description, for example -to display an image file, you could write the following description: - -``` -![an image]({{fileid_6487425-DSCF0343JPG.url}}) -``` - -There is also a `files` property that can be used to iterate through -all uploaded files. So this would render the id and url of all files: - -``` -{{#files}} -- {{id}}: {{url}} -{{/files}} -``` - - -### Maximum Downloads - -This setting restricts the number of accesses to the download -page. Despite the (bad) name, it doesn't restrict the number of -downloads of the single files. If the download page is accessed more -than this number, it will not work anymore. - - -## Alias Page - -Alias pages are always associated to an registered user who generates -them as he or she wishes. An alias page allows anyone to upload files -to this specific user. - -The upload form on alias pages is just a subset of the normal upload -form: it only allows to give a description. All other properties are -not allowed, because they don't make sense. diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index cdfcc18f..00000000 --- a/docs/configuration.md +++ /dev/null @@ -1,304 +0,0 @@ -[Contents](index.md) - -# Configuration - -Once you downloaded or build sharry, you can run the sharry server by -executing the `jar.sh` file. This file has one main argument: the -configuration file. Sharry doesn't look at any predefined directory -but expects the configuration to be passed. - -You can quit the server by pressing `Ctrl-C`. Alternatively, use the -`--console` argument. This way you can quit the server by pressing -`Enter`, it will then shutdown gracefully. - -## Format - -The format is called [HOCON](https://github.com/typesafehub/config#using-hocon-the-json-superset) which is a superset of [JSON](http://json.org/). For -the details, see [its specification](https://github.com/typesafehub/config/blob/master/HOCON.md). - -The HOCON format allows to create a hierarchical layout, where a key -is a path. Path elements are separated by a dot `.`. So writing - -``` -sharry { - authc { - extern { - admin = true - } - } -} -``` - -is the same as - -``` -sharry { - authc { - extern.admin = true - } -} -``` - -or in one line: - -``` -sharry.authc.extern.admin = true -``` - -All config values related to Sharry are nested in a main `sharry` -namespace: - -``` -sharry { - … -} -``` - -Every value in the custom config file will override the corresponding -one from the default config. So only what's different needs to be -specified. - -Besides the configuration file, every option can be overridden by a -corresponding system property. They are passed to the java command: - -``` -SHARRY_JAVA_OPTS="-Dsome.property=value sharry-server-{{versionShort}}.jar.sh -``` - -For all possible options, please refer to the default configuration at -the bottom of the page. It shows every setting with its default value -and a description. The following now explains some specific settings. - -## Required settings - -The most important settings you probably always want to change are: - -``` -sharry { - web { - # the host for binding the http server - bind-host = "0.0.0.0" - - # the port for binding the http server - bind-port = 9090 - - # The base url to use when constructing urls. - baseurl = "http://localhost:9090/" - } -} -``` - -`bind-host` and `bind-port` specify the address to bind the http -server to. Then `baseurl` must be the url where sharry is -deployed. The default setting works if it is running and accessed -locally from `localhost:9090`. - -The `baseurl` setting is important, because sharry resricts -the [http cookie](https://en.wikipedia.org/wiki/HTTP_cookie) used for auhtentication based on this value. The -cookie will only work for the domain in this url. Furthermore, all -absolute urls presented in the webapp are based on this value. - - -## Database - -Sharry requires a sql database. Currently it works for [PostgreSQL](https://www.postgresql.org/) -and [H2](http://h2database.com/html/main.html). By default, sharry is configured to use a H2 database -which writes in a file in the current working directory. - -Please open an [issue](https://github.com/eikek/sharry/issues) if you need support for other databases. - -To change the db settings, specify a [JDBC](https://en.wikipedia.org/wiki/Java_Database_Connectivity) url, a driver class, a -username and a password: - -``` -sharry { - db { - driver = "org.h2.Driver" - url = "jdbc:h2:./sharry-db.h2" - user = "sa" - password = "" - } -} -``` - -The driver class is specific to each jdbc driver: - -- H2: `org.h2.Driver` -- Postgres: `org.postgresql.Driver` - -The jdbc url is also a little different for each database system: - -- H2: `jdbc:h2:` -- Postgres: `jdbc:postgresql:///` - -H2 needs a file which is created on first access. For postgres, -specify the full url to the database server. - - -## Authentication - -Sharry manages accounts. Accounts only consists of a login and an -email. The email is optional and used to send notification emails. - -Accounts can be authenticated via a password (internally) or via the -following: - -- HTTP request -- System command -- a predefined admin account for getting started - -These are configured in the `authc.extern.*` sections. If an account -doesn't exist, it is created on first login. - -Only one of those methods should be configured. If multiple are -enabled, they are tried in _some_ order and the first that is -successful wins. - -### Admin account - -To get started, it is possible to setup an admin account via the -config file or system properties. - -``` -sharry.authc.extern.admin.enable = true -``` - -The account and password are both `admin` by default, but could be -changed by keys `login` and `password`. - - -### HTTP request - -It is possible to authenticate a user by calling to another http -server. The response status code indicates about success and failure, -it must be `OK 200` for success. The relevant settings are self -describing: - -``` -sharry.authc.extern { - # use a http request to do password verification. It only checks - # the response status code for a 200. - http { - enable = false - # the url to use, it may contain placeholders {login} and {password} - url = "https://somehost/auth?login={login}&pass={password}" - # the http method to use - method = "POST" - # the body of the request. it may be empty (for GET requests), - # placeholders {login} and {password} can be used here - body = """{ "login": "{login}", "pass": "{password}" }""" - # if `body' is non-empty, use this contentType - content-type = "application/json" - } -} -``` - -The `url` is the url to use for the request. The placeholders -`{login}` and `{password}` are replaced by the values from the login -form. This applies to other values as well. The config format allows -to use tripple quotes that makes it more convenient to have single -quotes in the value. Otherwise you need to escape them with a -backslash. - -### System command - -Another way to authenticate a user is a system command. This is a last -resort and can be used to integrate other forms of authentication -(e.g. LDAP). You need to write a program or script that accepts -username and password and does the authentication. The return code -indicates about success or failure. - -Here are the relevant settings: - -``` -sharry.authc.extern { - # use a system command and pass the login and password via - # placeholder {login} and {password}. - command { - enable = false - program = [ - "/path/to/someprogram" - "{login}" - "{password}" - ] - # the return code to consider successful verification - success = 0 - } -} -``` - -The `program` array contains the path to the program or script as -first element and all subsequent elements are arguments to the -program. Again, placholders `{login}` and `{password}` are replaced by -the corresponding user input. - - -## Email - -Email can be used to be notified when someone has uploaded something -to an alias page or you can send the new download page directly from -within sharry. - -This most often requires correct smtp settings. These are specified in -this section: - -``` -sharry { - smtp { - host = "" - port = 0 - user = "" - password = "" - from = "noreply@localhost" - } -} -``` - -If these settings are left default, sharry tries to send mail directly -to the mailserver of each email domain. This may or may not work, -usually depending on the policy of the receiving smtp server. - -To enable or disable the mail forms in the webapplication, use this -setting: - -``` -sharry.web.mail.enable = true -``` - -Another value is this: - -``` -sharry.upload.enable-upload-notification = true -``` - -Which enables to send mails on finished uploads to an alias page. - -## Reverse Proxy - -When running behind a reverse proxy, it is importand to use HTTP -1.1. For example, a minimal nginx config would look like this: - -``` -server { - listen 0.0.0.0:80; - - proxy_request_buffering off; - proxy_buffering off; - - location / { - proxy_pass http://127.0.0.1:9090; - # this is important, because fs2-http can only do 1.1 - # and it effectively disables request_buffering - proxy_http_version 1.1; - } -} -``` - -## Default Configuration - -The following is the default configuration as shipped with sharry for -reference. - -``` -{{& default-configuration}} -``` diff --git a/docs/create-account.jpg b/docs/create-account.jpg deleted file mode 100644 index 156d155e67480bff2703425f3ec76d25ab9338b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 90156 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

xwo^DWEgCVMX1@d`0x6|s6IUE-^|UlK6U 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%0D^*z_KO@{zk-J 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

XD7dGPg>FL8I$xc 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 diff --git a/docs/rest.md b/docs/rest.md deleted file mode 100644 index e9df8b6d..00000000 --- a/docs/rest.md +++ /dev/null @@ -1,203 +0,0 @@ -[Contents](index.md) - -# Rest Api - -All functionality is provided by the server via a rest interface. This -page sketches the current state – it is a work in progress. - - -## Authentication - -Authentication is done via username and password. Upon successful -authentication, a cookie header is sent with the response which must -be used with all non-public requests. - -The cookie is valid for a certain amount of time (15 minutes per -default). This time is reset on each request that requires the cookie. - -- `POST api/v1/auth/login` - - json body with username and password `{"user":"", "pass":""}` - - returns cookie when successful verified and account data without password - - returns 401 when verification fails -- `POST api/v1/auth/cookie` - - checks the cookie header - - resets cookie time -- `GET api/v1/auth/logout` - - removes cookie by sending an invalid one - - -## Accounts - -Accounts can only managed by admin users, while the current user can -update its profile email and password (only if the user is not -externally authenticated). - -- `GET api/v1/accounts[?q=name]` - - admins only - - returns json list of accounts - - `q` allows to search for a name (simple substring search) -- `GET api/v1/accounts/` - - admins only - - get single account by name -- `PUT api/v1/accounts` - - admins only - - expects json body with account data - - creates new account, fails if it exists - - password if encrypted if non-empty -- `POST api/v1/accounts` - - admins only - - json body with account data - - modifies an account, 404 if not found - - password is encrypted if non-empty - - email is removed if empty -- `POST api/v1/profile/email` - - update email of current user - - expects json body with full account data -- `POST api/v1/profile/password` - - update password of current user - - expects json body with full account data - - -## Uploads - -Uploads can either be created and deleted by authenticated users, or -via a `X-Sharry-Alias` header specifying a valid alias id. - -To upload files, first create a new upload via `POST -api/v1/uploads`. Currently `id` must be non-existent, it can be some -random string. If this was successful, use the `POST -api/v1/upload-data` to upload the files in chunks. The `token` query -parameter is the `id` from the previous call. - - -- `POST api/v1/uploads` - - json body `{id: String, description: String, validity: String, - maxdownloads: Int, password: String}` - - creates a new upload, `id` must not exist -- `DELETE api/v1/uploads/` - - delete the upload with given id - - when deleting via the alias-header, it is only possible during - a certain time window after uploading -- `GET api/v1/uploads` - - list all uploads for current user - - json array of upload objects -- `GET api/v1/uploads/` - - get uploads with given id - - return json with upload object and all files -- `GET api/v1/upload-publish/` - - get a published upload by its public id -- `POST api/v1/upload-publish/` - - publish an upload by its private id -- `POST api/v1/upload-unpublish/` - - unpublish an upload given by its private id -- `POST api/v1/upload-notify/` - - schedules a notification mail for alias uploads - - `id` is the internal upload id - - is authorized by alias header only - - mail is scheduled in 30 seconds + deletion time (the time the - user is allowed to delete/cancel an upload) - - can be used when an alias upload is done to notify the - receiver of a new upload to his or her alias page -- `GET api/v1/upload-data` - - checks whether a chunk is already uploaded - - query paramaters for `token: String, resumableChunkNumber: - Int, resumableChunkSize: Int, resumableCurrentChunkSize: Int, - resumableTotalSize: Long, resumableFileIdentifier: String, - resumableFilename: String, resumableTotalChunks: Int` - - either `OK` (if the chunk exists) or `NoContent` - - `token` is the upload id -- `POST api/v1/upload-data` - - upload a chunk of a file - - body is the chunkdata as `application/octet-stream` (not - multipart) - - query paramaters for `token: String, resumableChunkNumber: - Int, resumableChunkSize: Int, resumableCurrentChunkSize: Int, - resumableTotalSize: Long, resumableIdentifier: String, - resumableFilename: String, resumableTotalChunks: Int` are - required to identify the chunk - - the `token` query parameter is the upload id; the - `resumableFileIdentifier` is some string identifying the file, - the webapp uses the filename + file size, for example. - -## Download Files - -These routes are for downloading files of an upload. There are the -protected routes only accessible for authenticated users and the -public ones. - -- `GET api/v1/dl/file/` - - download a specific file by its id - - allows byte ranges -- `HEAD api/v1/dl/file/` - - headers for a specific file by its id -- `GET dlp/file/` - - download a file by its id only if the corresponding upload is public - - access stats are updated, authentication not required -- `HEAD dlp/file/` - - get headers for a file by its id only if upload is public -- `POST api/v1/check-password/` - - check the password for a download - - body is json `{"password": "xxx"}` - - authentication not required - - id is public id of an upload - - status `OK` with either error messages or empty list of - messages - - attaches special cookie header with that password if - successful (= empty message list); this cookie is used when - downloading files that are password protected - - returns 404 if id doesn't match an updload - - -## Aliases - -- `POST api/v1/aliases` - - create a new alias -- `POST api/v1/aliases/` - - update existing alias - - returns the new alias if successful -- `GET api/v1/aliases` - - get list of aliases -- `GET api/v1/aliases/` - - get single alias by id -- `DELETE api/v1/aliases/` - - delete a single alias - - -## Mail - -All mail features are only available to authenticated users. - -- `GET api/v1/mail/check?mail=email@domain` - - check a email address for validity -- `POST api/v1/mail/send` - - sends an email (if configured correctly) - - json body `{"to": [], "subject":"", "text":""}` - - response is ok with json body `{"message":"", "success":[], "failed":[]}` - - message: some message explaining the result - - success: list of email addresses where mail has been successfully sent - - failed: list of email addresses and explanation where mail could not be sent -- `GET api/v1/mail/download-template?url=&pass=&lang=` - - download a mail template from config file - - template is expanded with parameters - - `lang` and `pass` are optional parameters, `url` is required - - response is json `{"lang":"", "text":"", "subject":""}` -- `GET api/v1/mail/alias-template` - - download a mail template from config file - - template is expanded with parameters - - `lang` and `pass` are optional parameters, `url` is required - - response is json `{"lang":"", "text":"", "subject":""}` - - -## Manual - -Manual pages are not protected. - -- `GET manual/?mdLinkPrefix=` - - download a manual page (in markdown format) or manual resource - files (like images) - - optional parameter `mdLinkPrefix` - - can be used to prefix all links to markdown files (other manual - pages) with the given path - - the webapp uses this to prefix it with `#manual/` in order to - let ajax requests do the navigation - - only applies to links to markdown files diff --git a/docs/search-account.jpg b/docs/search-account.jpg deleted file mode 100644 index ac22ac472142d9419f2c50c67ab87499cee040ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46691 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 C(FQdD diff --git a/docs/upload-detail-unpublish.jpg b/docs/upload-detail-unpublish.jpg deleted file mode 100644 index fdbc23576f9f331999a2db2fef3722ba3fbff1a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79857 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%0AJx~UgyFwj93(BhI#M^>*?6Wt0&nrT{WPs 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 z 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 diff --git a/docs/upload-detail.jpg b/docs/upload-detail.jpg deleted file mode 100644 index a75a60819026d808f602974a766b984ae7410029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96202 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 I{-2Hi1unerWB>pF diff --git a/docs/upload-form.jpg b/docs/upload-form.jpg deleted file mode 100644 index 43cbf1024fe4eb1d84f40d38d97afff507497bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 105940 zcmeFZ1zc3y+b=$Jh|&m1cT1Om(l9gvl7e(MNQnpn(lB(_&?TjGNe$gy!jKY535fU~ zP|rD@^t|`|eeS*g`|g>~UeEJ;NSo8tiFA^#e5+WiJItmIhDh4_R#x?Y7*RJ2d!Mc6}`^L3vSOi$uxOn*Z z_!yWs2?_8Baq#f*E`z`!z2E z_Zv-`=2CzoiTtMjn!pP*bbr&rVU_dCh5>*@;7Nw*aDEhooB(PN02#vv0QiCQm3t?*}f{`kOw}J5I-OSGnjjB2217t zrhEk`zGwJL3OfjHay-GTjJ3fUaxy;B#6jF}`MqGHSizC)omP^_8}_Hq9=ZndI)icC zyVDKX0D#j(H%E#4NRXv9%xc^gz$vz+R*Jl&y~ z9}WCY^ejqmNB^MwU9=2nu>%&1Ikp{5#{nqkdo9D-T zV6na#eklUG0pwdpxo+C>75v7c#<}-Z|IPlF#`~7ZSBUwFxbN|e_}=qUKxp0mrvI9t z_)UFN$S@6lF~fiFl)qU1NBEx__&=crL>Ux|R}`z}002S}OGUnTlkeU4rwb=Q{ekim z_~oHn_1Am1!KGpN-)FsSOdOWY~LXj7atD7?3IsYauK!9r{&&!+tu4+ob;>~sF z%8v9v#56s-^<8FiF_8rCry?o$Q#iIidwGkBj3|i2{Hxe%Bo2puD}m#ffwv;+((y!I zdTpN#50GQt$%1ZRrl%4e9OP4_>kDKrn~h>-`~0iW|3m&m4Nx%r!Spi*G=hFABfAx}3aJ@nhQmIJIzjIKF zoW33l_pQ*cG#G*%L~(_4-)gx^VY};eOIPBzGQjnulZ#|{$+v!tF6FEtpymmkoAxQf zf>DrV{2Q9C`YsB$qqK*%&y^c&*Gl-cM+b-rRBUXtup1L1-@C#r_`XtJBwY<@=68ux zPxrZYJG9Q&5to`G1~<>W>n<8r>^L2a9XB~ji2F+Q%+@bm;R>vC4ljL$NHY6LGri%| zu0uH=Rqd`2|(G*Fq{bx&_2kNJ5pU$%0m|@*`Gg zx#R(;=;|*MgtvihgSj!QQ6H&GaTN~4bT!nSWGBO?ZE7C_@4;{$mP8XDSPHiv?au!~ zE43R1#6i=IjCqLxP>owI69KLwPB&p9KntKX62k{(fCIy>uCNWB%Id1noCc5sqZfDY z5yEQ(!TaH7qThpoR3&{Gumr$>0g!=B!M<%$G(Ip1j_^0Lso(dcZ%kP7OE>z}^t}`P zYWZH@s0WXJHC{32VHL1eP7edJ*L$AUzIa3W^!g!}Bj^L7;%GqyBD# zlb1zuV}WCsgS%%XNC8Izg45LUxpD}V1uTbyPql`V2BotcBqRh?DK&MI2A)GP>Goxn zA4|6U*>d5xS>4AGJ4noYfN9k2C=5nx<;30niC}wH7V!_Turw(@mPipL5E_wnN z#yFI-Q;gJ*y8ys+QRua ztbc^yd@e7HS7Q&H58UN)I{_At5Lq4o7Y*o!U9T@o!43yo>#-XnzzmnUwMN6L2LTdI z0Wd(I!|=PLU2O<4!lc+WFc;(-2Ah3JFK82x+#5i!>0M0|6I!4eEVAk?^w9!#gCf>o z-?`O+3=#)(^(Y96f!E8pCnSdeWYmC)7FZ@IYzmaPN+zwkwzTPYL;{>pl)Z{C2^b_T zf<_5~eiS1rq(r@!OK*auR-hgcfKb4RUh#&(7F=(tKqTN>eTa%kcru5Ng=?m0-l_DZ zj_wXvDdS1tSA}lE2Er#Yrv>bI^g_;Saz-j$sRD$hBEDW#pD6c1Dphs-ew%qzo+1Gb z0dh{YBIediJ>px^T_L_LrS!4jisxt85PY+VaQ-5?*nl^A45(&90}?v}&I>B!2H(k8 znuN@Xn%ggO92nj|HluP_9|0oJy-5^o8(NFVOs5y*l6`2+EZZqZbqMWoDiJ`)VMQ~I z-n@5Ji^%9yJ}-rEfuoNMtr-MP!6#Y0X=o8u%?w-v1y9wq?|Eud3y3}tl5;mW%M zn$NY;uG7mq`hR$tC!BOGTWbR!1*n|dO(#naa#u5FeIc#u*beWoog-*iQ*Z}9|0Uz~ zfC}h@2a@PW5-?j7R%6>Ep49QQ<$Z}1adg+|+WPR#fDUCn6eTcIwUEKE&JS80HZ+Uxf7VG9U3x2 zrjYvPs)M{9?hW~~jPJqzIwce_S5JBCt(KZ;?G?GLBu(sMQX^2YJ)}aKc(A`6U`q$O z(QukMLC$%{2+4hjboj$)nTUsrw6#~v<{-*Fr`1R1PC2b3_<>AXab_bS?0=oncSI-w zC3;AhG7b(m6LCoA85|4&E> z0o|~+{Mux#i5v{(5L1i^t|zL*3G7WiKU=`lR^a3IH=@OOIl}{SGzShsD>t5l+dazn^d`4RPvw4vdu_(op ziel9W#UMSJ#+PKAiZk^MU6)<2@YxQhIm=Xb7Kj!}?;o!sOL^J9h^a)m{o(N8!}GSLQW%=33#{=$I$VF;?jHH&3~C9 zzZts1P)(QqlJn;Pya4|dfGDQ<=Y+qs!ePZ-VephJ#NE$V=>4=B2-)3))2{nK{A6qP zt@scq{?hjcfa>ci1Rz1{3r3b7frl ze(#8XTP;6;_<`uodCFHNc!8ysAFzK^5Fms}z<*@@2M7kRm|y2QzYoq1_;ot;dkl6n z!EZGH^k^V{eQ+=nPg>U%9Qj8MY%Kz%5p$>UdE)bD;5QpQgq#>;e;WK7ohRu}{b09TM7OacDE=J0 zp1X7fU_pHToB)TB@a>k)A8|xZgDWHKjD$@@|8#pH2Rm(%|DxdE&tz;g(;KLjf?qH8 zzYhZ=NznSO(`QdJyrxJMX!t!2Yo-)|=%!yTf+%bbffFr%WWg*{IIUQ5mE zBluqi`(MfMHOq?ce;HL)#q+&l7ZVXOD3*=4^i@OwN91rRLj`@~0!V?i;4ed2MVd&iP0Q7#^<3wGmB_ zxZ66I8H?YQO1}5gajuAj>=~_39S1ti^|Mtk? zvAM52VJ95>_m%ih=Kg)SfDM!+nab*^r(f?!|D-qIH|}`rJ>fO2hd=B2mG|p)zyQpR zpJ!nG@7({(QzryO)vt4I)GnWYmn8u3Z3+upga5k?`OgQ4pABMgIj8^EnZlxrI6AEl z1)2Fl_(KhboXq6)eSS8}Uw9~;A=K*vvm+Si@(_oBak$ zvM5RU*a6;K!5#>}ZdfpWU37eBzy_-}$76tqhi0lu@f=(gQe!YPfCSq^J8e)Zn+}y` zg(l;A(QwZ%^lt*}491t(e*rQM1qvZRgnZqRN421k?IBrqy&tKttAygi7T7IbsePh` zB9VlLKCjCq4ahLllYlsfd9=7_W_0?|N*O+XQTlL6b~}_v8*Z}xRV{WRc2DHW;i@5} zAG3f}Q%a+c!J3>Ct*o^bOUpG+JPiOtKNx2W-=rLI!HxUo(ya&CF+V!N?xg?aLKrp= zh=1t=Dl`9;}RK~x|z6f~r&<+4#B^dcbKl_JR>a-?4R}=!rnf!m?{vKumRkTo( zbKDt?<0g$dpau&f(6kM~59p}>p7;+slB$L#3i|y7_6OvuBF@I|foua~|HUwuH$IW! zBH_$f3w{0}*WbbL#YI;g3jnB!8@~5D@E=sT;uly~lvWN`SbBLwA9f$_YChZon+#zj z01zlzIAQPJT|U}?A+3>@5^Nm!yT=S(CnLHzeNl=&C)1PhP`^iQq|;bK9)h?DtV*V+ z0i&%F8maDB3*rJ?jRJ#BB4K-dkk zp6Fca$PgnH(;HsCI&sK;!6Lzme|=zH4I2^Bq_z3sI(VyE4ImejM+Zh5>wZZhq4xd` zAN`hTDq?mq=|I>6>5oOMmE+dYU8Qa9jiXZp{TgV=30P(6+9K0*$@=L)qEenry@oNL zC_8ZA_765q7`?<0D>ziuNd*Selu#x^mj1E~i1643))XYI^Vpble#10}ZdAB3l9{SX zv@tD7k~B#{NDj`Dy!h=EaF*u6vFlk=c+BoJ_#@e6kr;2V2R8!9r$y$N%kIAd`w z_7{%p#^N-@-O!OgUtIlVDgFoeS_8xpapY1gibC4}b_qIoj=|^wn`vrWL)LXT|g5n`MSvz%{33sr~zgV=Qq<&H45RJd2{#y@`< zW*($@GYoBwrUwa7OhtYSJ8inD4q7GDS0Pw8?5Z@hj+aae?G53XEO4cZ=B2IZlKkny zV&5=-uY*q~Czc;4Nli*6yP%qDC1^BOSDiRDkrZ`1T4hI=#ZwskgclrYC280vN5|W* zX_WhQ6#AJ=$nL?ew!t=hZ9zV?kkbATpJ!~=otCY!ZN{qVK~6C64;u;|<{xZ7W57t{ zdS^##DMM8vwLqqDbPjzpf z<8$lz<&TzV$<67{7bj~v-^al(Svhhf*Ce&vPg?_RG=f~%qGd&C*<{88g-32|wECf_ zdG$7=m3g`Jji{=$m+SO)LfpdyPQCyZ&wMZ99m3u+%Z-)IX1sE~#wjkF%^#G7__=#x z?p|JIkHFq~?QB)TE6NSWk3|bd!t-bp&gvuO`he`b;{)2(}e6dfKP&-_kkXi!%{Pp|W$ zvDbrl@^eF{VQix1<02_N*ZNp!)U(ekJf{og3TaAeAZ8$kU8N(i6T()d>)c2kqG^H{JO^*VXa|5<%WIGdK+H|V~=1Qx6r11;9T^vNWw_;!u&#Id%g|^cxvU6ga|g){*cJV^ct|JO#}usthxD)Ct-R3tISg>-(9|= zT>&qN@Ylmuc0H{)Vr-`-vQi2|)M_+4<0LX2I(b%gnh`skdUSu@q%sHL}5n1)Nb3C!DwXeVCB2|H0El@q3u}SxmeatVy$(m*jC`c@u zAT{ew{=lC3H1I8AY?$hd*J0nI!_`g8xN-}rp4>J%!fm~e%!@Rmebk%C^P29OPdQ6i zKg!5dRhbW0ygW4vGOv?-wv!WG_EtQRF6>DAoa;TaT$#?3cWb$?(uB}UB}|i~8q$Ky z5StT0W6r*cHh#?L{X9{22mE_{M<;Hl?ML2rUmNN_j>8hFk#P^CObnT?(muSCt{4uY8k76XP<^7~r zq1D)59OB;w_yYLs+US~$92w93D#8`EIB4h1rlY zOlaL02CIj^x+7GXO=pC+{fZ5wSM~)ER=uA6)&{k94Odd2CsCtmNm(U(j69>^(DT9m zO>2q!(S;JDJV%J?%J$LVrqlYn*2nIs{;k&$nD#2)`BldP>)%y4$lMa?4}P7(oyv91 z@M(1bo?0oJ()DLHq&gmU)te;Ntc1<?dphjyq-xKcbG*v>Ah2VvdOQ_ zSCT!0KWaO&7WM^@i}j*>yI`xt%u_}%=wYZQ<2~q(l+6R27cE*6M$^SX3A*}T^XacV zNe^!)%eaDDT>zQqH%e2Ii(`{@<7zI@gB&)MF`q&eJU^;%l4 z?SAHjAr4jXi=2HzBb)dYMC%J)w@T_I&=Y(tf66Hfi8C{~`ex%5P z7|w(n9RI88y(lk<|IT=#;l3%63$6N-hj|YJM}`hBVxEp~b^dHDHR93|$i(pjT#bJ-e154#-GHhfsGOP=f~NaA(Oeso2=deua)#zc~a z2lH(0p~XXQuh4LcqyU-iwAg9k9{eu==>hc-nc$vRIJPfVH8)8XpkDw*Q_N=<%vmABW_#D*n4;ZO8g>|uq zRc%)npVPeMxp4Rbc<}PU(K*Ca#Ei(kh1mkqxq!{dvKIul6*$S=a5bJDKfsxu^s4w! z>YJF@?CkqAkS-Ox%Ou)L+H5K|UZP&)y2^}Xxb%=^tC_oVi7JiCtEV(kJbKtPKcm!$ zEs;t6h4(4dt+vfp{kS5!(D;BVQ+4$5WlN$;F1HwtNd?vOt;t}VG_Lb5ul%D1K@(O& zzKj?#M&hD3qZ<>2N1;V_qc{k?>9*V>*j-II$ zjU6M?Vk%f(|8M`GSLaxi@^scr60hi5g*p6NG20gTzv?=P2z>qp@SY{JNHlb%#bJs6 zJ&D^5Arvx%2)HhvpEl50PVS&sjU$%V=66Dk964$U=R$2ou^hCm*m&ZJd&5jRD^|1| zifblxe>E%xs^EWq)@bLZq_cfW{_X?)XA!H2U6{r8RDe@5=ft18NL+ag>L{>VG(f&j z;F#=Dd~mHvnmUS}L8gK?j>~`iK8|efu+*4iV#*C~9FIk_?vGKQT*&NR&A~1Mk0Je) z0oaoWXzK1H;hxcYJVgsDpPCKqbeh%==c0ISaYou}#uYYDy(|T~WaBz;PiqT!@~Yzj zJ%s5URc^$ns?ejTS5kS%$8aI;qbKwT(wZQ@11BktxT zZN|o;(vRfxpAbCe53mEGWo695d-f@ca{Z+JvmC5am+c3%5skKD!i-L11HxRFN#|Jc ztj)*qT%fyH8j*-p*QD1#@gYKqI^5o%O;MI-awu=D!P-?ZLcmRdk|u5L6ST|XEa)(n zm|<1S@}ykWNKXgTnTnfBRI(JODy11sOcvUVB>`=Ga-v&)*9VZ^?%n!ha5iM(XS zQ|{4^))agl72FPZ-}KF5a#;)Yzx*pPE7+#)3m|mv^W*ev#l8uQ%1Y+|b44$qaB1Q5 zbDaIoFna+M)gX|-Db3Uk&vYRgPa1;k=K?tULE_S&Wsm8Zj|e%7;&OT1kh#$u+EOAD zgQYIvxp1)oJsgD;kW$LM-XuLTX{zewC`ZO#>3wFpSXu$xirg1Uwc9R}Lj9GgVPf(48!82H_gx>}+?EbD=;WL$oO~Q@zNAGn*yNEO=3qNaLw>m71E{h?MG>IiVxAS&AER!I-v03>yp5!aHkDgFtzArw?~o z%w7G`R+W|%7o)k``NcGQ=19WD9Az14WNF4gd(n=Y1$S!qprUd~T8u$PQe|^nn*Hmw zy9sgJhAUBn)vn`wB{l@;Wz2T%)K2XkkeVoTlEnx%GX252@G!sNh%QnWaj{J9wo&Jz zPo_ki5{=fN(LGY^ErnuN>$<4gcUC;s3R@l@SMCkyz2a4?V^q?%|6_D(O5>~ zPi3>I2`vd!B%$)B?|BREh(6`3zB^7$4(RWnS?Vk^<5JfKZi3aiqG!>|6`+25Z$5Hq zp~Rh=5Ko9KRb|e^sosFA%DyH$6R}fpz*&R>i9P4ml0%t3Y~W;fT`p$@-%e~_(U+y$ zeBj!+N>OD~D~uCXMl53*vgo8DkrW{^-z;EmFH5_Y#+`O^^7!>lpgh|rRjuU}3(~{Xd_6&t-_cWf@lxlvIEvJ@O zndGK1d~gjl-m<#9a7qcnR>FvHd@jAJqNt>Y$jnz$(C4>OugS76%QPapHrI=IyZ*Qe6~Pz4Izs>s_)< zWzCv>m5q!hRV(;xj=Jl>wN-1Tdj_IzRvaB^n))&@w)&N->|BhIyQ@u!M6~nqlx%PJ z)EJdEZ?J4})Q(hMK=d=9Y%7Jil*4;t!!295s(nY^PZrX>?cimVTkgCgBR;q*7JX269)}tn5@J zHpaY~l@&0vrkOu9HlfCi3zRYdePEQYhzthGJ|Jkb6fzwup3Sl41CsXP+?bu1k~6uc zSBRFhX!ii`wazeSJ6Ov|yKkW5jyjWo6>5lBf%Pj5REgOzN?mVU@tB>?&9PSp`Y227 z7(rAZnkv196tNE~5AUQ&KBJi`L%9#)IXp zC#IJX6%3Abu%^rIv;p>4sFXyiK3uS4cdIu+owUgy;ZG|m?(HR?EvWZAQHhVGx1pDA zex4lrhF_|08OIug{Md$WP4bo=NX5SjyC6jeQo^#lpkQGJYn(egFME3zB)~_9DL~bn zr?z|f$;KnL{@`d!S{x8(k#@;V$vYN;!sldB44y7Is_r)6)q`Y{`kJ+g9#$x=5l+0p z*`(^EkZmJL8fT4oEdq);L`rxYzs&chb$vFGxfSYu~T?<%cqTL|!exUP}7SWhyq zfTgwCK3qajqs5JHWXwtV4hfvCDv zL4|13o6L^~@fwKYO4+1XSEhST{kKmC+V>xX&@x?Yn33&3bF1Vr-bfV>6cl(fKjxI* zvnA*oH;0zps;f_|(vVs;BV4tLs=K~IhZUPW>yNCsFvx2d5(GBRTrrIbdzGO0%8O`T zA-(9jQ{wq(azVCBx-QF9CNBNj&GgyHbg@!e9XY*nDXSaO3Wh}0DhIDIR_O_QMa5M8 zt5tQwZ2X$Umg;s;HYj!wBTgKFvejLT7EhfFyr;~QX*G3JnVA`RPf_3XFL%T{&u7k0 zm0;rRl07k1*~gJm1`WuORnc~RB3e15vP%XjXu4Sn&egFj4n!7?hzKy64(xGt)<##Z zHuxdJL*ylZ7&{_akV zn(+Wo;@$YNbGTmSNXxjCd@gb8+=m{n0B^rrSuFijXxcolb2NJ>miHpOL$mL`t~qa@ z%E=6b_g|?~q^Yp{(6Uk=jsjag!)f{!@pO?ckPo(fU1I_r6j9(LWGbBVo;$ohc`6v6 zwuku`Asi*Z54QYNO}T;c+@62EE@tII#p%PrN0*PhTku2&vuS9EW?GB{BkIY=ee~4O zG1gXMvtXr8Ff~maHAok`P_SgVJD$WU57ztaJK1)|pq|v#ZhlZ=S^lSwdD6qZ-U_(N zaS6S_+nBKN8)I~kOniL6V%WN>l{=vEE+WG0mP5r8yf*ce0x~6rPH#);Ucxs$W`Uxg z9y5~3))rtgf{5JdO8Vhw9y{28wd+gB`HGzGNW=(LQlZt-V>>-{JucG!WD9Me>c!aN z=o7#VHeHU|BjpuNS_Z^@&cqvr?p?%`7{ydsNU_$-Xon;L6=eLTIJUdrRj~~+N<;@y zxp>;%*0gvrO;B=2*s~8zsZQS?`02l^4MA2FEeG=TloCdIwH^1Jh;LlL{E zYo!YU#+$sy2lq8Vkr+cXc#jz}AX4CXrQ?-KK2;|q*JUp|8tPe^Vxj4Z*+tiS!}&9t zOrvRr)xz62VzkM|L>*P(NP&jZGF+nNIR>hpM3}Z!!M4k+$sN(AzH)i!t@N~}&qy-* zk$qoE985%EWRDedA(Sy%;YcaCsR?D>n6$te-ZqjYCKD(uv5dk~4dJUT|TVQuK)? z_;DZ`VzmFWYC_Q?8so=^tooIFss6O@zsl%8L&hs%-q!d6Q2BsmNYO6(!Vepn3PXbM z1;_vYRfn*r26<)Y@Ofq1ct@YY9dlJ1CB}C%^9?{bnvF+gc$6EN%nunP88SsMa(b97 zm5EeimFi-SKKrIMJC1dKQ0vLEV9UiME-3B{TnbmxxZuH74$!ifRIE3iC@38Kq?-Bw z4c`Mi7k<6h#4=x|m!C1bU`}~08$3{#PqL=jDe$89Mp3X0$!5$J-O8?u@MU4<>WJW8 zyw&EX6O5uxG~Hwf3LY90#|dVdX96<}9o{P$j6&Q3(TJ)+iaqFb$MGcAwYW7Ta)4D1 z!SxE}<;kSg!22{tOls;9mTF)@b*_lov8&>?c8Rpby#G9Nb);VaK5AFi_vmTOFYixY zz}=rbM)&vvXkqfWXjRfbK~mD6Vtn@n04R9(2}$_r68=@uzSYw|dc&Rja+DS=Lrk(PK&ie+c8Tse(nlGNe<;x95&URJ;5GFY+c?ukwJ`qKJ|;1_^G4|Y84hQsFy z_oP{c(gN|BRHje~~{^=8~Ysh4koOUVIdSYvV z&fq(RzO%l>;4tr_2OQz=rfriWy5ekfC1pORc0DESGt}v-y+G&K09s#v_L3L5W$G4! z!GEI&$jvO6GuZ@g|0kj&Y6KoLd0Rbs((I`({jTe(k50~htUkPRO7hv_s#6AsIACJ%7FU&vTw`Ax9*5Jg?y50$~_}apNLB?R-5UZd1(D2O4J+ z6&Z@cYaQdD*jYR|{yL(9GiT(fiQs!kZktQgI;x&ne4P2sfCI`U!vBB$gTxq`cMfUF zoof*jN=|*1Qd?uBRr{2!howk?-L_w#`^cZ1k86<6Bvime0bD6=Jmg09*c(Xbac+ht^YuoFNpe9 zr=8)m2By!j!QF)K zoFQ|bDnVribwp7DxD{f(kJ(TSBJWU*%q{enWD>v^2=|2y!xQ0v-@!`8 zSH3e#(dae)1>o1aHf-2Ekr>a#1g?wh@H5NCUzi=*6Bd%FilcUIkMe#HnvLg)UMW^v zJ6@28XsDr{q_QEScVlC^FEAiP%V{IFirFm(6uqZ3cIF71Qs>7SZmMSXs4GKWXWmHm zG8?DE;muS8smWLp1Pxa+7>{OIWKC3OCXHm2?`<&jJ0z9j^+<1-9XcTwtBB$vjEicSfI3VJ ziCahQjOsBv3gAZ@1}mnBaXPO>DFBC21Hxvwd<|P49)4EJV|@4d38vxf(6OvXv!Yrx zQRjd6yb3l+!+49Mma}^YI5uNO{HGs0Qv=l#plfVF)d2TDe6X#S_|DZh@`1Kk|MbB- z6u#?2HaX3C0q41$_!Q81Lc*qzFD~pH`aHA(+n05BzL(3MYL}yM%Fqakqg^p@{NORK z-vg9Xb18Xa^o!K(W}k=WH-WiY0_N`U(zhvqz+5}dgaaBYD=FA379pQA%8s{`qekiM z2sM)(Rs!!L++Mob%oPz7|Nh#daqkHtG;=do^dCO=#FS&s^hMUwtM~YJvsY5s(+y*u zbVHyRP<4iH;}mvGDa5uaq^*nx^{uo!M_Xug%T_x=+7FORu5q_-Q?C>DB(2n{ z_zG3GNI;Fu2z!0!KA1ihmNpAEEZmN&TBjiu1|=I|v2LcG5+#=xB`E^)t`XTO@$yS< zjW@_SbtKL`KljoGb-AvpZM>}_ZFa5L4}$rhA+PkIE=M1p z>F0(J%lRGL8n7+uN$jmVlFK*PWIDs4rc>=9xn?1XVkR*%Vk+5jHnuPFvgYe%6_U1U zf;*rXA@qzhm1N9ff)1etQME=Sck1#Wb{(|5tr{wmh+Y-p`V>R!UcQQP^@g`bOhqN2 z>2nU{Am9wvBOO1G;c|O zIKj047XX^l`)w{-hdlJz-V%rz4&8G~D|bQ40%VOG7gl3F#TPBZs>Jw-TC+oJD?=}5 zxH-f5m&BTECpyjF7&2+7xSMzGpjYicE$Q61z`Jh~sH*F!BV~`$61`{|2P&)RA#5$Y z&c2V^lX4t8H$6IBKi=J`wVN3P7RF0>pxv#6>J*V&knSaPG+%U7zCzq?;~$TxGrXxV zw^LIGoU$x5rF|aj{WyZh!vdbc*2=wBVl!EV*)v`rFR8*`p;#){J|_7f0?WyB zri^-KcDR5k!@@bh$96`8UmHA9yZ zyHMY$RPbb)YvU)OMT@?E2E8wfRiz`%n#?VkL}LxI%Bp_VWlkNmZ)NL=ZY{VJrzT{rsds`Sz9MX#eujAd6#T=cqLc_(2ETl?|HIjk#k zWU+-$)2e5y1=m^YWR0iDF`T^$Fzj#Zj%qXSthSv_xzE4!wnA~lj-WpyuxggeHd`(3 zPECN)Ks~{3^6PNRAysUDylfhV71*QLJYiJzdIev}H#awAt8qSZnQPtfJiY#q;*@Q5 zBHNku-LuB-PK`%kYMGE@DvP1yM(U+`NtqG#P}tJgPzLq{U9ZhXMX9QWmQ-$l$KT-L z7;LU{dltg`X=cm3{+;Vc-J|RkTC*wb$ZPX_7=kzJIvgAZ=M{D2Bz5;jQ(PWHWcupk z(sOF3vqqZqPF`u)ob#+bkiTDBN|e6<`2w)klLR-LlNLzl$Y|J3c%sj8@5)zC&xW4qP2*`wWx3|5GSgd`jV55nos;o)bHP>3f6+G2($$2Z!5U>@)Un+^ ztfq9<)Di9c*2uA2-qNb3-UfKVcGYw~>=V|+Bu}e(H(ymLQf}fLyKrJZCz!RSjZFZO z{b=#tJ-rX+T2G=crWX68yXUuDy2DD7E2{sN$%*(p5sn3TfjE$^rXz4nrL zZK7P8$e+3+!l*@v<~@|1sy#9c6hGF7y}pC0lNv+umVdFaNKyLjM$c{41Bnc3Wj(jG zfmr8$6bNUC83|c?1qhW_wou`%Cb#`DWlW^)IDrK%Mk@-d7N22Kew6d{oAPjWG2tSU z(Fp6180wi<^+Q+P2mqBTh!b9cU zykOs8oZPH-9+^zFywC=d+d=f)g>;(!tk=a=i-7 zmM5v(!JIVKQ>L0q>j(p6aT;Sz`yW>Q{f5_rBDZ?ya_CZlfZ)q?!yQKULYL^?u$ps@b>#yl&t9 z`Z)gr?@#KmR~>_fsUClLuN;$Ee{%5v_Wm^k?C-4M;o%SgNJ!t`+J=M2M!=!O0FjdiaU8bR_fAgK(~cgM_&V|Lo#vGr};+v+Hy zW^Kef;k2Odas;Q38HZ18^u#O`wTf(JiY-Ib)Fk2+qXN#)7>PR}QY_;tg@q*Q=uG)( zw0BO~Gi2c$VcMlGq*2q`)gI*Pb6|d{{1M>|S#_1H9jU0@VX&3pR4C91VMR@I1{xFDf9cRvLtNd%RXx90p)G6?`>j`DFV*CDV=Bu9f z8W)SKn0_^>_)~kwbRXZ6$#}R33C7c5=xJGSJsOUdkd;y?k`~j2kY&S%KOnqDvf9SA z?2z^%b0tM%W0-kVCz#XlO_VFHXKn*VEp^mN2SJb`yL!YLr(`degYn0%h%Jwx{EraJop*)o8S=YTBB#w55>WSachkt>T9?PJqg?-fVe z?MdePxk(XR9@)kRwTuJ074s^#Ivfzl^yB*XVk?LEAHM*yPQ@khR3tqgRHHp+$X1-t zSS1EBdoW~{t@lZ0^-6{pwsRiec~HSJZL3XEPp;C~X&-o@4{Hz&EC3t=JRB-A5(+9h z?BD570PrvaA~p^ZE+q#iS5zh*m8iH1NbHfrvn*sR3hH~R<@oH}$_Dn1tu*%yot%9u zhTpz7a`B;+@Qci-lzg7uHnRNT+iwz(@4}yNeDa3S*B>mdem499FvVQ{tR}KpA-jA2 z@${)?^R(Ydv$7H*o_eh~`*9M`yd0G!EcrzrXYv&3S*c+4>*fRMozr>P1U0AqO~|#N zooj`*Q7?kCm^dfjBk%KpH^bp~s$$d*9wGGQ1El@A9G^;rGaXg>~K{}9^|56v!1t4p%9K5z!Li@`dP|9y42eNbUV z6C<}c))UFHieqb`33)KMgo$Bm!y%27-=%T7!CA|gBwitwu7g2_UZ^bi;5?FPI%K%B`g=I`J#ir(YY zFWrUa_Bz@wWHB&If1CP!|x>LR&6~T}a~_<9HRY zQsR|s_kMB1W&iOQKIVItlGL79WeogLN!)weyp_i%pKd}5EcHoNVz^9gHXpT5YAK}E zWrfFuKa3!8?(m;00jEx=$*@)3>L@^==|%Ya_ltV)j%+A;N3`Zk-?&nG^3hPnTD{A63>nzwz|~F@Z3-YIctUm*a}V0XF{%nl z3}rxgT@4v$?!kW)klB_iV^p8s~(Z+Dq7J>*Wym#vA+0S^7QlOV*T~IMul*B zIoX1?)xoksAr^aCJ?S)(Dzr4LibwZJ1TpHSv=ToNXoYRjPFhD!5$HnpYS#_to zKtisr?-ms2Nke$mamJb&obDJxi%=NUQ17eWJ1qA*lk&7Xk9`z`aR8ld>zLBFZ%nFT zvP`Tf(H*_R0c6`rzO8Y~Tq%~O$3?Anl%-wy4tpodu~l{5Osoxxd|F(b4|T`zB3ifU z0`ZI)%&$>Ar52b6?=# zuYwB#{lmJ2b25$6wnPO`vv21&nW`NZpHPcUD8Tp_XMMWObyssx$aW{t5oKT=+#=j_{k zI=wqm$YfyZewK0b!(-EC9x_#uy!#p-63kXor`x0+S5DXS6z32q_e4V{Log-7>EDFf zRDaHEJY?~YUM-9xo&!Vg%gghxVBf0e4ZB7^dlm}Q`~W^D*H~b`aymmzQ%NthH+ui> zMh?ip_d&QITIKwsdPwOPKyZE$q`F_~h<8xR!3=4>k#1zdWjG+ePHv1xXDne6@Absa z+by;6qu3Im$Y)*2g!cX+Z-D7^0UDH$+;(a*lk$+erp#Mv_QR`KK^gv8bf9#?)MP8Y z*2&vqAd$^$e$E47^dZV3s>=HmOV=T92I&{EDNwtKC;JpJ&d` zl74bIi&M?^$h$~XQ5T!BrRdi=CB<9VAxuwYP#z1=`p8C%n^woFjr5N&6-JO$ zup8KDn3|q`0rZ}ATs*eJ$EW4hg9{Lj^PqdGzo6z4Il0CeioF(YJ>IFYQ?uBiKB1tk z&ZX8q9NRWgedN&yB#9bH4Q76nZ?I!nZ?0*{B$f5#uIBJt+nWkXse|26X_|ovC;A=r zY9#tGjr(i#em6#6W!3o#aK7@0BNa_B<+Sajf(sS{t#L`lR7IE8)HzIFBlyBnM+OQ+Waf)1&n-PJ=6Lb&0F>t_gXsaNChWU zO9xgq6Pt2x8MN_E&Qw%m55BNk2YJc!wuV$r7GUVdN^T)0&M1aX>6KLMJY6d++@jy) zap8A}41hBwmG3_Y{NQz@R`b#!w>(IczKzDyNHkq=3v2CZCxu%9g%yJ_d{MCULPy|-C7<2f4_Q5l%!L6b~=Q@U5W z<&{jJ=C*H~FlA`2Ls;%=_uL5VfQk z59?%PBe>bwg~Dgb8xM;Mc%)Pdx(`wkq}W5Sdf+E;Mh2fc<|I|z&+WmImsYx;RIXFr zEo?KDUDku2%IW6ch7J3JaMGj3(ld1h5&?x}$f!V*73Y9ahz^IFXPiQIco82DoRq`B zhxycwk_sQQ*u2CIW! zQ`ROqJJ2lj)t?A-@Ah@P;udLNLu`IRxU(|3_4jlZ?~=dF>u-wjUxk2Ee{xKJ8%(zD ztnq)bg!-TLD%JXqgDIWp?U3ljl5cfY(eUdvng4(6y>(Pu(YGK>OQ94grMOcl9*VnE za3_IKf)gY_fZ#4|aW7g3?j$%t3KS?_+`UL~cPkV+{NDS$Z+)}Y`(xI8GjHa7>m_U5 zv(G)rUFYtz@3yn|zN=-QzvtV@2GNhC>?Ihr3INGf2buPTSRxj0m2*Fp5Dufo4G0=T z^uzL#3IIH5)gg5+m|}FBp6uSXt!p0jTyd13njd3s#~nt2;BoTrH;j6%aEa`@^}kr; z>bEm@1fpOgGH1WRqUGMc7_|6)S@2nXgR6eT*I!wRTFn9c+GA6SQXK`IM&$Bpd4w#b zy)YCT^-2q!>`I}h^7jq4NK$vfT}6mKua;L2ZX_+{F%FI#&P%>-HF?b%*2AfO_P<#7 zu`8c?Gepp0uZYe35L5o0n({j26jL2#&AmS|f(%rfE&w=*<{oz);-VC?!csXx^2Kcj zKR61|F%o$gLd&v4l&d#-YbCA5wYj-&BK=3oTjYVpHMP}WEKd2zNe>5!&;5jf0Ly$e zhP}U7^$_hp;&%i9;DoJnbmz^R#wj-*dh^!`>@~TI^dbFhz0~|4--apqxE8Mm9}RN^ zF`2mUR|HB(e5-|!=qPDgTc#1EbxpE5yeXk(nK}+isl1A>ehWzcu0lnbz;eCgRUoTWM>bG%NOYa6%&>#DbsU+ub)UL?h2|6$pE18aXkj4 zoGCFxt;jZQwde0UHDgXlCF{-S?hc(JsFy!+7Wgtf7B~8hZuIOaqk^$m9n-%)LJ7R| zVDT;Z{eM z^zOQSE(2CXFK8J;5Gy{preoBYYT{q98~CZ_E=B2Y$}Y=t=D!G$3!QxguuVg4G;b$@ zmbRoHY;x87 zeAhx~)8^i!hS`@rS z$t|_^;)H|zqEIW_MwCK&6=_}mcBn0vhP{3R20GF4#n&Q0)08^nZH=*{&RDmzgXbV`rm#*ez6zNBxYSa7uyG>J#rg-Si|mVgkzW~G^%qN;hzBgID3p=qF~3|;l+9&h)0S3N z>#;xXrkGJe=tej^F&;X<9Qd*y57b6)OoH-rZ=o|DnoNM(5EhCg|Bi?jD=QGznYg8^ z68m+0ew%am{kZ#5X8K64Yftt2yn!Ejq4Y0S*6xpiI|BPFCXOX-z|Yv}y#U6Ve@^=M zI1*$UMN2|@A;1-tAviRKkwP-eG{1l6<`#?dR%Gwtm0wBDWb1p`P3#&e2ne`_ABKkJ zJ9WO)mDZ*AKTm)aqG*!CJEJ!ILJ{j{T;9@hLcbH*N1rV$P3_2h;RuSEOZzRb%}=GY z-h`k8_CASa)1z;KjL=nwh2Osu>c`}R4e z@y2d%Zi0vK%eScE-+$DzzXV>?Z@Ta|XVu;X^6l9T+nZjC7U}u3DC26fx28uB122-nYOSZz@(azXABsKvcUz~`gOk%{z4c-moY3)Dw z*w#;e{fovBffRNhq1@H|BiYyLAw=}n>v2J$5swSm20qlVys(CjS0I!1cS2EIJrr0U zWcL4J-KoSA-udL)KqE^#eg))k*En}18d#&~^KgF1>QYaAoaj{bks|_k@@*$TU%wy=E*M~=^tc`}(LBM7JhhJsLX`LvB z@aQw!KX*y7+WxOIl4@Hd*}S~h>fhy2wNKltRZ*leei=zVp}IA%Bk{venk^&qXhrEh z+wrX7coFO4K5B1VYx0M&SDV2{kmYG;U9iFiVCckF@pgJMaQ;tAyG+lYQ{A_q(XLlF z;sqTu`FW(A4+mB>=8Q6ciNf~NR>PaL=CdoPY90$-)%fil8nGQUM$$;@uJH4%@f?fB z^u$Z_kYJP?WWasmFVZ zUY2qzV)OWcncKIueyO#gp^NE)cU|^8ehkC8&In?l*<%A(mwgube-x;% zc2%~Pu6v@v?Zr<1Eg@o2xeM`fr9R%tpjYfactGa={1g%*jsqzFVr@}a**nyyC!b&O z>>e3RFV|PJAxu6kw&FDV6L|lj_@6mFq&$0GzZYl*Pn99Ls2Iy=RwHax;J)h zR(*nh3;6cw|LX~=0)U+XE8H*Sb-=vErT-7@0N&y9uN$g9owpYyeV3w9c{eX|zLjpzsSAVwz+p`kQ}{ zoKr9N53edJ>=DgE!)ifMpz-=rZ6L!`ASNUac=zOutYG^9q=x zw{0W!Dv#QB2Zf?bTq&& zZ-_V*pS`=Vvf2+Ie|tXLuvoVIxvO?pOZzObIx<#HZ2fL>l;kzQ3^H zkB={}IJvoO1(Sd+{LxFQf3e`(YfoHYuc$3{43 zv2;|(FR6Uyh^G_6U(aQcZ3v?SjJfXFQCgaql#$i0 zOp#99xbkRUV(O|7bZ=jW{JCb-cFN&Ios@d7+L>Ew*apA?he47OUY#2uPLD(y?)R2& z>>w-XG0d_da|fs+^%OBn8@)>CSWsafwvb=;h*@jPjvjNF=hooDsh&iKpIv9QE97vb zH{wd9b(Y+aT)a?(b`5Q@}e!hJ1gQlo*EsLaDze8gee zQ9!2tZ}pAmzV=UU*CvmZfPrqv2RDmL#P7#@!Ax)3R4f#_$_}PR^7_c+u+w+Iorv7G zdjTt!AaUt!%L1fgQb^7ZV^KfvG*u2g+!)l+oLRy%!PXM}L7}QHU11{usd+y`*d?T8 zhaqLcseP~@r&CVzur|puGkwd}7C)!&Fdbf3V!QYMdb;ZVp9l4Zhy9rH+P|H3xh{F0 zr_R8xZq~kf-mi75RNd2Q=mHEKi5 zX)Ha8R5fC@WG4Xn1Xm_Os(Vxxs~HotT_qe@Hy0qBVE)W}8%#v7G&=GZOPq9vqN$i` z6-u>%%MYDCV@JpT{`z)}8;)U0N}W;DL;l4Qss&Yvh34Mx^9c&%$8uT>g^~j|RzI`b z0E|AV6lSqm+@+0X5mwX9R&`w(D13n&Jr4`Y6la#s7Mbc(%Su44AobqH*sv$y;hc+v z_;Km~oaqI4zM>q>Pi@T_D+-ZNTjvayN}}3N^Y5-MiICDm_Zn*R(+(=OuNGDOl?LKC48O9u;K>G55@x=z$4 zv}Z|gBhR|g$p3(H924?H7BN)c)X58}>Cwo>mfe1-Klxo4pUIFQ7Tpcdb9!AX=iGx# z3{KB$K57je;8UcXoPg3T2hQfgeB82@N;Z03d1#+a!5lPh#O@<0g)~KE2?Yj5x^MYw z5_ZmXCc$2Ooaq|;4~94S4NGsc6e`#@%2L8ChM>~{px&C<(oMCv4hn8FjLAlXS#-Wj z3Nz*}md*YdVeM==s)Ue6AQ2JVBx9SN^)Uq+WNF^=rRmQpkbuISqg&CxU-~cBth(F) zWG0WA{zho&wk3#HRe9`Zff;{KDBi`F@e-EkyaAnF+?b!Qs_o2aX~8-|uMTH(?!57F zah-~vJQ=R7oZsyI&eSu8)_>fzGji=e3LuRU%cp!!xo;^sIXL$ErR3Gl&SCC+yTTqfyR1%~6nTt^_8IHk7wj?FJED_IVDoKZ4 zk6FcPnsYrVkkTg8b@5;9M{D(+CGlIbBoMr>83GPz`q41{a))TxBA=9C+!P;q+G6ZU zi33ec%6wA@a|(;$l?jWNaPo?S>b`0nEmdPaog^u>N%6Yyw6=<}Kf3RF$xnJIm6CN6 zyEPiHY)G6DlzC`?Ud&4CvxtStt@zxK9PDtw?`w_f~O!!*k2>B)?@mpWb z(y<)C>t}$Uz@<&MAYK$5@h)j$1Lk*MxQPBbt|2;nUcFhBU0%UiyV>{XEuf*@gM!Cl zdh!6mmd6fb_Ofk9>YWCub9{-u(b~+XIwr+i^)b4kwwOcrDxd=k@Dw#zf>%UG*l$Y! zg*eT0IU=v^r~9yp#;2M@YlF+H_naT4yv=5-*^uZuL`{L90svu8$UsF-A(@W6I;+u3 zvO#u5YK)!6Va**k7wG$AwMX~6xAgM8q2q)`Stmt>F)>AKQLOI|gzw`kjN zfk@J2O4wf0 zHp3ucz71s03F`jb>E2!TTO}zRz4*muAft8{v!$8D2}=}+dMI%AB{56vnm1A-*;RZb zdCX$(G{$rG7)IMRDk~(Ms*uYEA0JQn6**m&nlU9eOp@A@WFB)O-8X=Mqfw}SQC=My z%?4+yRv~JI4;wUJEePdK;$XAAsWTP(;8Iift+rR;>Wwp5)4j^dFXQEK_pb74&!nf+ zLyLxuRQ2Vl6}4e6e2n+@`qv3T{z>Cui`Pdo?RmM$$!tYv7OD+u*K>ty{Uwq6J)r@! zJ6nb33V?oVbh1L`=K>pc)PUM1Cxu%^mhEi`m%8>_VRwh(<(PZ23l43osF*@^a7gcj z>}eeO)Sj74!vQ&oDv(A?p@j73Fx8!-geHh@R-aZcuNoQ^A`y4|CSjz7&vDQ zFab{YiE}-La@ej9>VvFe(ZlXK;y%)X>uNx1wUgKSYl9(kWtKpCaWS1p*ozl?B4ho` zvIJkdSI5ziCcZ7R(|i5NMV8*r(hv|Z1{H17u$xO$6^RA?rj%;5NF?mNMd1H70zPSR zmq>o*v$sTGg3ODjTOAzBG5=h^K6KvXirylO6w-NcPa#)FQmv%_JK;HCO#exJ|-&GU&W)u8m!DIPxrlrndy zhFL?5&7+&xkNFbxIg+35Xobz*&mAHVWXWM(in3nk^O2!k_7mGjiH;U%sTb1pd2!zJ_T~dB#5x-!1K4i+>ujJx>^G*HH()sz*_t!WxGz&9YUG@mtREk7!B8iuJzaH>lfR?oY*SkWf;h*2LyRsd-XYr;Jmh^u9vs9Eh%i zU^c}bW$`gAlkPVmtJcD}xJ=giAxLMK$YA?yd4I`$XrFw&YyZUEls>h z;xe2T-nPn|i4<9xbm*x9z;KP!c{X};b zGPEZ_K=t2hL6)|wB@Rtnems6zpgumG#0qR}IZeDDE3dBIW-WJAkPW6e1;vg}sFvuU zdvnz1rT>blN!UZ<&;N$0DKJ;*c7SF^FcL&TBr&&8vX)Ufc@L%b2Xg6|U#YL6ESw6S#|VTt6pFgr6QOrs zTH>->cRR!inkbNt4Bhoq1InZ-e#?9-2!dS5=gkE8lde<~VtScWO%fa5iY2A%rS2n$ zD0G0pO$S2?Qk8 zP1bvjeW?4283QJ?n!B-N~t7aq|ey!F0JMM)1;N0jj7J zoh@Epre-&QScSpHiXY{tUel$HI7?}0-WK_JPb6u9!CI<3m}aV3q$XTaCW#0TuW|Uq zJSI=#kmE}XtB7}bVeJMT>)6Y^b3sV5tpqxJrS932@Qjbm`jqN1=)#Dc4iQTY-ENtt z>b{8yY`~aKvdaS*c8{H&KeTdLUBCWoGB0n0m(c{RSlUF8{ zWl6uV*Rw~-0)g+r#*Pli{Mi|4Z|a)70u-SWBgK)s)-VtPNyLBrjRnlw$=E$GSfC6h z0)rooVT3AFSuvRlG`H5As8B-ll}nERN;io9O9YQLHmyuy`xKljDlI*YUnq5qyN-LM z>(@#jS4gt0N^u(Au!b(T=j%vL)9uNEmqA@)3=U1NOE3$TtiWMmOJE2>TC#S=mu6rf z8^2UHL?NzHrd9hoiCkyqG%+}euO)P{;!|Ncv(&!WGXlY_T{vi3UK_~ZdK#+na<-aV z|2j#IpXBo(XP@3uO>MDt4l_rt9bmIeRqi|~<587ap$&Bq@2}iH+VZ7(j@uy6SwsX< z_Hi_7llw#Dg-9?N2t1_&?A-gM4EPeOP~P7p8rT?7g|@Zf!V=Wm9!z^?eBp<0`xU)o zqv1}GV#ZdJJXu!blSq~es?nM_tJ*a>HolldDQjvG0R)~tf4r{++vVD2E&>4G0$Ice z>WU@{7i(Vup;BjYLa(NGW;1t%K!Z40r1VlTkA{%d_v^EhWA}npc?sJ)t%^vSZX)T^ zjDBv)QN}mMu0*iQkiF;c+x0m;2GlP@}cO4IL z05P)K)*S#=46Bm)IGyv2Rs}_YM&s+pvq+eVm^SV1wKndu>fP5Foy`m3;VCK!Ez7Zd zCgmLL1x-}G)g8%=u$`NW3ku4$v2-ZNykpqsQp*cF-6Vatx;2}*BO6kfCtx8r(W#zB z$=)>ouFp&No`dXblAkAtU@mtqIk#Dztv4P&beb;EjuJk1P5nGrXFXrKSm$0nAR9hU zno83ABmBInMBNBNrq3uyLO?WMZz;^GuC8{#o`L^K#O6&CeMYLbZZG)$qZ#>R!0wv9 z3=UBt5*puR;sWU1iEMa|I66tFV~z;ncwAMkfUttP_{40S+p{hDBkgWUAWlNAM(QB1OnEN5r0J#~n=e zvWHKnDRE5cy*NSF0x0o(ver_Ssh4z+#m)Xc1~=*V8!lVU0(X+nW^870Y2Y*7z6aVs zb-~K0z$b!)QF9eJ>Of5h_>IeU5-K`1`j0DSTPN{N51G(7;jiGc2EiruNg`mJP-2iA z;aujvJy*IVi`~FK5X`t%*rHX2$F`^)UiWxq8sSX!h*p5*V<3k3ll4kPMNC}gzKY-s z?WA9c&&2uOy+w{I3Y*0Ma;OvQ%Hj${yYiLG?4-zf4A0%bV4Y{VA*JVk-D9 zsy+8zJTOL~3hF0~l17XaDjY;~>4EFj$EExu8(6n%(R$0R~fy($Ej}jFli4 zpYLN|b<;F-6BZWM3V-Ts4r_YdbfgVZ56_D$J&>56%I#H5$G1+=Gh{5C`iu2#@+mvh zmUB&2r6)#zu}jrh&TG!;1+IN&T`jLdS!r$vsMGcAWQKR%o)Y0)Sk}enoXH*p>D$}8 zlSX@AunenHb<1weCg}Enfr`MiL6SGCQ?yI989G8ZFJJ{j$*xs0+=B2+|83*k{PcHw zfPrae|86VDBU}lz5jjq1R<<*yQSOzF%1-;~9Pu-ETtMQTJg`bWVzDR6jxw zeMof&GlK9cg`5@kS-vco9fLu=>hIM@SH0AWg1e5c*MR&N`DPCxzJH%$qF=A(CB z#z<7#2wpo<#1wniAxBEQ^D=f;?q!jprh3!cW{l|+By|h)F8Wb#P{%Tk*3c^+QSsfv*$$OJOn6B*6D?OeS)Xvl&nkK zAL>NAHXv5*189holh3NX2(T-CaBM{GT$tELcyaH(f->n5khDjeT&N;M0>$JM_Du-I zsRT>Tr!o;F^!!obXGo&EVacr+o!91kSzXlU^|m^()>*hOyIpPCpsJacBan3YPo{jx zHE%j-P9oJb_^4N#?$t5&#WwIA3yG=5*NJ56rDFrU=jsQL>_AW0;ax z;hO+!utc>Z0iLwgJL&xrFztpQ7LU(=vHGg>*1Q20b%**4ZVV7QQdEN0&s5|6*-a2jLLu+7w_#oE^-zl&9+p z*&J(Qb!ltyNf-W;hOd)^zDR_keky8+^=U%U81-k-&lahJySk1&{fF0(ck5uq#Oe%P&EhA~NBnx0lzxvSgi2HG@?=z!IZX02 z{EYK1$mbT<s#~pegJbM>=i^)`F^y zK5zy14F-IxR$e=`4J!`OMw-sr$y&j$N>K@G2{>l&hwKUJ(j^Y}bllW%079ucMTt1~ z)^ERN<1UMAf`x7Trvfx;#h;3VPi!wroZ#V0=A_mSCo293TbqL}CKs0)V*@cETd zvT9$d(q`{bzbrCd$<@lTh5L12Kz0AQ4me>dZR{)Em<>JQ1!i6)?=RNLQdsG^VQScV zw&_D&B@8l2-jKg0UeUfxy>L1J`h!he^CYFJZ^(?4(DaaY3x;UleHE~AA7#dRqRBB~ zRGhO-(#u*t+8{Z*KxC*GktpD_2-h?29=bS&XqZuMHz=G_`8ZxU7>nPMoR(aTTq#wGtlTnF zS&9m2XaF_HF77=MM-V8@UU8b>X#)qLYv-02FV7mP410_n(xh0ujdxM_ZxW+`zrtTN$ zOvon1vaYMmn?Hs}EqS2#r;bLdUxEANg&!%Z91p&v5oEh|-Ni`slk2$ElAoLjL=_|` z%?<4hT$r$yY{Xl0c5ElNs0)?PZRA>w4o3x)ch7jDXK~Tg zY=!nyuQe;Zn98_{A0YWTTdK-vn`~Xzm9^>L#C)4I{$Vq;Kr!f1S8|aXSJQW^*VCEk z1_ognU-GDzk;SRuV%O|lCsS=cjBEP=$=snq_68Xpy7&>5jYK6qpr$DF&;){6tl4*E zLaKcSezDYjdx_cSv+}<^%uOjK6*S{0H}i*DvCjs~ZMAlW zF7KeZyuX%ku|==MP!Z5JwZwFt=;Aj(i-K@fla$P(Ui!2`n)j+#d%sx!v}Gbm%MHZC zUP5c$t26ar$V-+SG>R@0p=t1D!Cs&Gw=+aK-1RX1IxCmXxn}r!leUR8GG@kY zZ+oqnC2znVSaYwnU>b&1r&mh!%b8NzBSd$j_lyimYoEE9$8spO%g}u3yS5E?AyjmU zzi59%Tww7t`7c&Nb)vu%E3Rz_CVOfhq8nqg8dE~|F_pP$X{JT?Y+y-oYr*bd==<*F ztZ$xFT3}9{sz}nW8JBv3dy$nN@hS$Q7Ume`KD63ZG>x)+-5*P!a-^8bm1b63Gj|^n zqyJmw>{`HOs$Su!PG(rQz+iNnISTVo;~i1>QrFVrE_)ZfA1hs8s_%O`UT)mpQ;15k zt@qo^j1GGBr=5*LTw5<^C9M8Hp1dch9L4@%GS2(07;E`SpR!S)WHqnH*e+-7uUqoN z(Ti7~d`Dnm_#6B8uBis}^%z2v2zVUh^%==J;iCBg5_z!upo zqV2f!bH79hyh@+d*$lXHZ%$$bAOqOLSB{$Z`Ts<0Ani0l3qT#(p}MYArH%aB zaym;BUqzliS#^R%&&}B9{y@!zq-L`>^&std4V*+o#hc8%reIGA<6BiJ%M0qtl+INL&YOpEx9#X-cXQdHx$0oveyXznL1CpRUI?cZ5jNTKbc>evbHq8s`8hp)kx6n4E=c%>g`~D z{{S~L`D*0r;*g>x8jITH4L=5bY7*}GLMXTYnWAi}CD;dA|^+GjU+9mK7h&ner@ zQB%(yDfXSFP$4osqpoAhq39_qGWAJE50CR~S_~Bhn=1|*Ep8z>>n)43R;*4sqpD1i z93r?}%AvkH# z+rjgXRlN+j`@xEiGV4D0#b_N{F?~USnVr|JcoG3o|D)XXq zE(6LAzivHGdJ4)Hpe|;$F$z9=c7ZwB$mV+Pdk5;EqcYJnxSL=!c2 zo4WLaudQ41OLhqRy6-{s-z8^T#-wN%TAl+Wghg-nK~h4(j^pWpX=wh+q>Q)z$zXfA zjnR)H_H&1`E7f(*A=TFH=HCZ+&eeD-@0tlt2BVk#s9QD3_k$mZeU+>|YNI<=585ai@^LEMo#Tr{Hv1R{k9+f7d?y+|~ zdc`%fQHWylM)4`Vn=zxcetdq{txOmlA&%3T)|DZPkxgYk(!4e+6)s?}#s`(&lfl0`A>7Vt1{v(*gewe;*RAmNprukN#C~^q!qf+RL-5T^Ym7 ze3{x0u5W+jXK~ADN2QgVn*tV1rsD%>|E!))^gb#gO!-*Vt!HA>q@BT_*T=6T(%&!R zc%S~NZlL#wQ~~j*s`II4I;=J|$sk>rPgR}4bvYTp9(X9|$=ml*LuZH?x-#wDQsN|k zUnE9n;9(cjcvq~b-}`s=zAvZYwXOQ(7RRc9H+x;FRvz$+ZP&Aj#7R3fv9L7~Gsf_L zlh}C9vGSZkiEp(Le&r=StiS9sMtdYi4o+v9q?amQ-iiM1*+k#nr%g=t&Lu<3vqnB; z3NW*4ku`j^h1(uasMv>b9$&P+>=`HEl!Hk1NF7%Op3m(~*}p!?{UJcm%%GaO<8=G$ zAT6>L2Le`2(qy+(q-Y$gqaEMVhKckO8gSuXb zvi+-g+Z>$K?$Tm(*Mh3kkvt-)&!PH-_*XQZ?Xr0>*q{rBs9SLvohPps@0E*t@$_B! z58^a-_v${8zzi;(Q7dsq`9H&h|05)qH~!LVVE5wFrWSb9#{Zp%D%yoxlk2{)ElUoV z#7A7G3yJN7Ci$0uRnYL(v;Ba^Qm#Obt%!_`kmnOD;i(xoLThzIPo|*LkENQF4u4X~Hs=$y;)NC$*w{XkGGH%WztgyZP(A3@`$Ew6f z)v6~A0JwX)gG`gMS34711Q;2t@Q5frnP}CjOb?_MBe-68qdnL<{;d0zgMUA#K#&{H zsQEneXyC*yQ;0@!I@V4Z(=Vo>r!jySq;mL>XiX4F9Nz1)`Acm1I}zTE0({EBwV#D6 z=XHLeu(7-IL~kiEBw^z0SH-$1j6m+^l6SH+pP6%u3NddB=9T|qE!gS_=-s*zi3^=Z z&Xb?ZUmZiZ2`!)cB2#msJggRCB5#&KptUMwOP$iG8I{~M!&K9PZ%SsVii)j(D9X_e zQq3cJ8NfQWHB-<#I{Hm;Ft}5F@md^pBD8nqEGO9g^0qoohCI2t_Du_4?v{A~#nV>d zr?JF$J9$>zq-)LoP4VSFYU5HYHOpf2HWn7&@qBSGq>$^y^ic~(Wc=J^jTH~RTNRBd zIQfF>>|tA(Qo-<;f7(|%lY6aK%UmoMO(&n`{%mrxH73|VM6M6yI?E+f&)QGW;#g7G zTRz20eEVeKjHg`H#-693rY?DG&fq@ArZ+AVQaJKK)a(mKK)L zEV8j>_qgtboB{>ilM)*wIXCE#S@}UnMrlNQmoWLnZKix%X;ylnQpoIsX75z(Dfy-p zC()9NlYg~qjz-hJa3C?nio9^FfSDK8yum z1+e(8xw7iRW;HT6d*k(Qia+o^p>jx4t={DM&p)az$2`NG^{@X6{9lg;ljoiGa9hN! zr7K#I;)?{!H2exJ(1%cdFAwCFTgUqPS+cMwvjwm4CdfYE>K)h(s9j~Zi9h`o%xdvM z%}1c2?)e3m?}7z;mWOqz{j~ekKtx>OV-!jEu}SIRs-;v07vLw(C++U3$49P4&(T~_ z5~r3v9B)g^oKq?l0N%=zuCC`JPk|AlPO+qtm>Y5&xrzvgDK>lk{i`Nlw6+p&pf>v& zbPWq9)?>sl_EbyL_Hdp=vQ&}8hwq|>JnrH+>#eJQq`srekt090ScVl=_@kn0@3@&Q z@ho$Dh2voOTq==5?1jS?vmgm28?>{fgUhv~+e=IxJ3=>8$^ZR%1m{jcEOC^WV<^7~ zTTE?*vapGAsq>_BZIw^5s&D+Uq|oCrW8{qEy!?HBryEyaOEg_lv^I+(XY@~d^dilq zr-qil4!e{&+xgJ7G@LacIP#X~CTwt`jb6_CsE<%RAYi~HiCl8P9vZh|r+Ekrn$S6k zvJawKfweCZeiGkiLh{X$MrVZ1G)l_SYX9m$c1+XrCjm@4YW-=E>{myY|=SjEJ49d%h~^-n2upua_Uvw$kOp z_K!4J!TGAaa`TUWWCB}1ksc!kJ1ORGf$Ybv68Z2Cm!0K_DsE?$PdicU!)ojfU5Js1I8(22+ec+uKZ&0F1 zdw!3{Zu39R8-_1cHM0V#4247}*e5D~aje(Fci)VCB+T-^enKyOJ#$oFHNn@k4c+yL zOZ?)|xi{y=(KzSw)rkqK3HEg8Qs>GQzJKmtd~XJA4<-s&`a>7&9=@jx!1=tG&zlkb zGqlT+FQ0DdOjP8-%^Zo2SmZDaa99v?EmRttxY4Q)n5Z}y$t+hKH+jJL`_O%DCzDr| zsDFO`9+#xHO`O*G?lFbp49mCZy2PRw7(Vo~F@L>56+hM}(e<#F#XgJlA3KyeiX!cr z8+zn1)}p1T?nv@|k7d@+T?h1Tg6zsr$?CbU=Kg4b<%@K|4*=f#APOsO`KKB*s9ap? zr?TzL{Un0aimV^LNerMqr9b2-`0SG6D!8?;lYjwg^DUKV9G*vaXpa1okfg)E=qtZO zJai+fu<{@3iaC%+ucfC%sxA>j2e<3$j@2~e9OkOrnQO0y!?CJJO((V@4i5J1IfH8j z;@8Za{WQyPDIMEN@MWqDYn!Lo1w?CWay$g2BvO(+#%kk~=6WT=KSQV5KN!ejFC=Bf zKX+z+aU3xDJb?C=TVlu+*c!a}lT45-0P?hBr<$vfKtuLp-)*GCSze@3`Nc9uFhuOo z#}*hg${&Pqgf|&%#g2AK5h`A$$)0GO9o1OeCD*THzAvC{TAcQAl+_O0?R4Zf!ORpT zn(q#N8?QkE3+>b{?Rl*(Ic*>D2sILxU+enoIVoK)9?UeC#-s_%2KszvDa11n@Oh`{ zQ@X}yCNgnwaB+>je``YAdht+mHJ~zfreps4n{v(93!d4d|G#)O{?#E+qu@)C;c)r; z;8nj~8MHQHiu=EBRI9Cy-cwqZ>Q?D@!O8#q2E6bW>#W2>Kf{)_I5}58{NHObj9ML8 zE|_n>hqmr19{i)(Qs&(I&>&HijDE*aGLsHjdUJ2u9+DBUvBayVtilt}9lIZ_3`$rG zo)&`XoLCMoaG`b~Z{AyH)FOeP;xI#CNW>0S4}-Mlva$*s@YI z5I%?`uEo(6WfE-%@Jx9eRZA)YB0+y7#{xn27D?D7`hH;dvVf3`U)WwG=njqz8! z9vB>umc-fwN*6Ost@u#0VEHaM98;5_rXF&gN>1?PEZgCmCu7Of)XtZioIm7a&~fK<%%>+j(d-UcP$^5duMv zXS;@qvWc})-QtBscyU@$2N@4L^qg1s$4!GbwpTo9p7H7#?e!N1%ORBQAou&;>@mst z7IA45^qL5IE{@DPsr&Tk50Zuza3=^d;(Ltll*G}Euk?19QJ7JA=K^Ybtvt*E)_zBL z_w@R+EAm4qRb1VxDSI0+8nzLfS=*L7E9+fr+pVNn_EQyKYVWN#Gf9 zn!7nQj)>%+Yz$5xs*=AlMiUwaAk_|-BHr6YAo_)7KIvOyR#oUG$ejO7VqY`h?TwiXvqC<8I zMSxOSPLkB5m(T0>l7iBr;JoMl-S7ZmZIzSPiZuLjd3!B9@H}BV#47+psWIiGEC0kq zl(QtXqilaQM_cucmFxbaLd_?_`Crd@c3Tp~fAfPCHK$*bb`)HdW=_t&kuZ#_18C0g z`ge^AMvu98{akXOo!hAp*LpF^w^^|TomGDi1mfusdag(LQSJd%GsAai*u=jJV;6p+ znHd6&@XQ$Z?1L1gwG>~vcM?}+mb> z`_e2fN<3446bO(nh+^2=%~OR?sSLvqP5b_x^jz6cmRWj>yA3e;tVBVUl4 z*MFeQWtQH-c+6$2rw*fZ?Jlwb(owP?3s5AJpr%AIYQo%iE&tBumzooYZ z(ye6&+sPr82U^rXQ{6K|%`r;hwb0HB2;GL2?XyzKw1fKK+xL(MD2peyA@7(y z7cU}-^>^0^h5`HumefCwn@osr;5wI-&zJ?Gvkss>yorCYR=NIS;hb>aY_*Q;z9Lws zDz?Sf6|sRrd*~a>hYnFmRO6P#`kp&6wl;RJp6WXh5S_y(N=#8yE)&&OeYPIg4MMz$ zp}|%4igrd#wTXb=je5?Ufw`vdLZM%cLcdG>|-tX-$QmHh4B;M^aImAz6$(4ZTbo3=Q zb-;R%1xq1P3dbG|KX*`|6K%-)QTAuMv#-0y)4Og-Z6*ya1TsWbj*z8>x_j-n^fQBJ zXdIZSeiiPj{cm2&&RIH{&a5ohBuWbmMsuJD4`)7n;b17tx3Qmw zF_0@Ai8OHTmL}eSW=_nqaiH0{jPzc^c@=l%*;3aB98FWfn7+K{ZNwt1@0F^RNI4bT zvVmsfKJDSCxu61bz+GHfAQ&caxVJiZVQNBub|W}KRPn)oKaizwl$3z_I-~kT*RG%n z_4G`ZxI=M_#D(ND%s);e%i} z<_FTjUL_AlwTh5E^xul#jxQEgE)SmI z)#fzJ)0yZa1%N~-QSn07XS$q;B;c>*N$;|_Fv$-=&C-Dun#xNJE zm1K|gYx>gBM#b?Y$%A_N@!`3A(1N~_6B4z{0NIZw)8-8(K7A$Wo^W@yT zZGy@1TtfHuBOl-WpDY&b6t0bTCf+V}qXF7fQo6I~dlS%{-D^r^^Z4!3*QVeRX*?y~ z@P5OG>SKG%idA7{pyghMR2!|{fNzCJ+Ds_Je&jQ87@v>8#5x6ETXFH1prT}Sd;II| ztLLzPQ5$%4z7~&Yh3pF>a=-C8+{SSu9mSTvN~QWty6s2s@eLXgK`ni|AZwHy1~2eS z*^)zrd=siyZ)Tl*`r58(_kcZ#W(H(Lg~$v$1%|LAsBJ&-xKfFei9#nawZpjaoqQ$C zl!}@ySYKPKi}AjpW*BfB9+0iSmdQYaVrDN+w49t6ZOl1rXVF(w34USHiY4kPddFo# zYU;6Yv6FoSbFw&oldQ^KU}c7q{tdSVqw0mRsJt-n3#qCcDQ=yKMLlm6r%ePy`Gntz zJpI6c3}Zhci$}MEp!5UG)g;#(lnhJdVSl{o-S4vP%-CEVvniZxyHk#@h$CyN5|_oyn9wKO0aa{e+=n-q^eQGL5%r`M2tJ_8JNj?j#J6O`W5TwchOTJ^ zC0*q(qFf)ZkbJ_>1 zkLn7lGOvDO7AEq(yU)p~nyk!`VVIibPH6OBp>KJ_j?v`Sq+xTn7LQz0eXlZvgUco4 zzj8ZQB?qK*5~@GPf8i@V&fGITPDZekHC^@#!FGFuenY- zfGv~FV(D)m-eD*Mlw#o;rWhV36^f)tkwg4QuDi5UIe-GF0UW|qubfB9GRiYF263X)KC4Tx?a4wU-qqK^tZhC$!Lstcy1qDiEY9gu&&=Jp$ zZ!5BhF`p!GB_*I%6e>eKi1_xehbA-ly~HY@gueHu$%&A+wsb5?Z|=f43K!NZWd%9J zzg53nPlodCjGJuddO?PLxI|7{{w%{B;rANTG6*N(;x%2Zgi=L;Sp*$(e_e!e=XC+l z*xucZ!XlNZ-lHdw*N$(|+@{UTrhG*`{u9IUdX@H>YIXu#vZIp=X-il6>$&M36^Ziw zn1}^aE80}b<1vT#*cR3WVF>)O0E>E0#!rXbOZ&F6x+Sfi>*)9Czk2ye6oC<8y)Tqc zli3lM_0}G4nUiv~M$6rC;KK6aloJ12MPD0Kfx_e>2n%3q++t?DRJr=_hxNhhT_|k! zGV4d8T6+yz(z382yDUy^i=LK+_ti~lIV2-LqQTpchg%)*Gr{)}-htEm%;aB>MHP;)?otmE&Br zU+H&GSRDfWRP&2q>(-JPu6HZ<=ZYndtK58M$%91e2}XXA3Kh2%;(M+OETJbXOU)@F z5YGO{H&fR?H|ILLXzHF(B#d*@$o1ID)R6{Kdi743H0vN|Q)%dVairi~O>{rZbn6El z_cHFgSty=)NNiEtj5jy9qnJ)8M2f?rsHCg3ya6m9!RbakHK+ShrGSlg+xaasH=APl zzHOt)VX{YKDw?VX9rNmNPH|=K%TWL29JjU~k`F40Zl$UUcO|h@h7Ux9_oF)Y^Vf`S z9Oh-nX45Y%GE0WRRh*_Y^@J6@(wJYSsv=Gb^~z6>9FBl?aSr*b+i3IEKY*|5a`Y-- zUXfivNuyD=ge&o{-9#v$^BpvrvXKyOZhYe<%kXTcP6B)T(}R(Oa;6^@Riw!d2hzX` zU7Ik*?{fo;wXed;8oC}KHOucezOHe~$RA}fdQ9SXdd(&NCp z)PN)w=sn6o`8U81lq(Tt5g_4W`IK7rl1(5@6g$mb#P!OE@)g}3>ac(}96q~`MvD)* z-|#(?VoKuMqog_ci96zJzUL==VSeZ!LqG9zbf?-MfG6n0Elsr5ub*&K(0S@-vj5~6 zt@_M61IvL_AmBh#FkRr{zypKLl!pN9)$Klqr*zjZX^8QU_$BaJ~Nk&gPci z8ax;%MVt$3!vNS4EHnqMb(Z8==d1E*e87{^FuwHqHMy0Ef=COe^aE>IP~FALf<}#I z2j>Xh4yRPQi-)((T*X@ss^V0IUb^u=08Gke;)~(A){{+&PY#d=EwA_Al*pPpIU+LV z)W((ZW~55E;)&OUbJ2KI(LWFTeoH{FJZ)`K(%CV^zK$hd99oJAIpomgcIwBGUhzj7 z%k{J>-^qCFj!91v)_lvux{|B21j*!wz4jbGaP$rz(-xG*dR$1;o9^TadeW96dvAy9 z=pFTn5d#|dlMHhN)TVnrDp&5rgdL<>l@~<9kih^87Z@^FFupXL2}@j_YE0_PjiqLG z0Iv?Z$Btwv>KHksE~TvE=Ovq-W5Gq8-dOLcj{%L?D=8=~O}daF0zklb{HO5WpLkG*GCmb(5{aji2E~m-Y&lpv|o7&xv zl-VWiF~2H>A?0X!)Kw(Gp=8Ap(l=f+eI7eFqc+8fSj7xmcrKGP>jP%t>O;WSg%LkY4h57 zV_U16ws8-;`^~$ZOa-B+SaJ++nilBZJ9?N&DKR@ymc6Mx`fzc#r>uQ_aZ)Nx9FBm= zR5g+8o6SB6m=O_kvzD|_)MEyUN%!6-Dfj8hkCTfNXk8lK8WtZVKdcZxVp|07+TIMT z^fvq;YB=maCMJ_xHqyRY79O9R%CRfe@*a`WyRP16Z#y!(c+y3!+e`g|s6Q#x)-*xws z>pr_*gK6KKA1OOT6>h)P7_|B&44%Fiz95$S1qG~LZtng3{XBH$3uA})0}#KZ% zIIsl{KsyZ&;9YJ!-o|CPypX2(QSe#ry6zE5b`;C_3kDvmLxxBw7*CRWEGM@}qg|NC zHVUq}Oc3O7g{HdXiJkn1ag+!)meNibMl$~Fm;F>wHj|M$0Df%_wG_D?gf@)`@-8a~?j-})gheYI^|(v`3N zDv3@A;GZE3HG_W;tYFfFdL*YYx+ErO#t7uQy;h0fR6DuC+f-2-R9<;uQYe@E+#-kB z6DO;GS#QMMP#43^QQ=0=q6VPFB#|y$1^p!I(=-1SY9x>U>ASIDt44iWzCLh?!Fw!V z6sf5%-k|xlu>tQ=dCu?|UOXmrRL9->+h1jO)77Bg>dT<~8~O%r@}Z%K(gdBB?^36Y zlKW$^X~gA;%$k(^yz0@rFtBE=;uy;FPkb8{9U`JIy3Y)L8YosciYhi)qe1ck+g}^o z@Q>rBJMd+7j@Qc+m{Ay{nMpe)#+OexE6x**xY>kCq+O$UyFbm+?TY?Y++NiI>pk~H z1(|Sm2aQ>Fk%O%wNvWk)oH=+NVVC|Gm8st&=7Qk!1;ga>-Sr$k3`UeRtp>@5@M3g# z-YpF)qQDWH*$Rt)i%RP{7q$I;cePGsDkyLgwDCJCj0x?W87K`$j+ZHkxM*lj(oz?Y zylkcEV{A*@&zbGA6>wbtM7ZPMLw*j=%BAiYs`6c8U$kDP=oy6U?HA0%x1Y zP5V&KUSCEKlGf7Aa;qtS(u8thuUla-fDR;C1M}60Q!Hre*)DA1n+3s>Z7sV+?oh9e zk|I7d3=N%%!ZUp&A&Pv!xj+$6vU>Uh0BK?Vs?e$2$!(B6`$e2ocjHQ4ApagoL_~L<8&oCM;JK6D$`Ot<2g zG^Y&do9jYO!`2I*!Ywclk4|3d$(cTYe-gxcr{C1p03{(Y$zaDLHk$596%yonf^jsK zvs!nF`!P$Z-r*8^M-mNav0c}sK5Jll-P^n-F(OTl;&2XpG?Yar1&E8LnR}BVSI%}=tRLy@oXnP? z=kF|uIj*1X>L?4fJkur>slYn4m|dX62b(t%Ja{Xj@_QqErH&zrZ1})6M{q(6KUXxt z!V=`qX08Ekhq!iglgqyK*WMCBMWxrHOY}KdS0pUtciR_ioGSbEbJu_l*fSrM$*}ZG zNkMRlvH^HKcdQUrkuo`SDk91wlsRvHQZ&E6MOCRY3t`&2x=CPe7ZjT^LnFpxcL1|{ z&~lyT+|L+_%n#2EW@_*#W;W?(FWdW!n|qW@VE+K>cuOYY&<*szDn+)}S?8~`V(r2{ zaCO)NELB{rDJ$Kd{f1HvH{#_oZ}P7l~_lh~pH+Edyezspzc zA76C9Ueu5itJSC=!))Njf^F%62ICd1FGu4My9@EvMri)w^7k&g^~&I`U5D*f{|`8!w*}bIa8`N=H-yMr{NcV zm}^@B-qOqW-4jNIt1?oxSoLMawzm<6obr+2Bd~`Y%m~)1sU?ql`E}nLwM@}|Ty7Ee z%^aa%IimcOBz$*&9==ztQg~u2;SRHHNR`#JbP*=+gm-3Dl2F)Cd+jh~gz_|ST880c z_7khZ>=^ZT3cqmyQWL2I^;}lu((AcJqj~Px7V!154Fb;@U*Y-%GxZt9!}63ML}Fnx z;Z-Ke%IsRSL4ul<_oPmI=k$HatEYH3U2`aS=zClnZdcy7I@_m{ZzmxK_yq8A-2IU3 z?80Ztv3hl^^&=fJoD|Zeb=za%0VQ}J`6HSNuQT4+XO&c8Wbe&}F7qvyzMo?r@Pwj! z?Puui7(h7@$7=BKbrJ7}yOnF?%_AB~ij7r9?GKB-+@SMoJ6!;Io8^PolG+U$@WCAn8FT(|y z_D=_PcFAQl0i}fDH(nAhAGnSKf`l{#BStcZjNQ+kPGU~7f5=KgnaLeyn`P!RKr+XZ zW=c=Xp&7u>d@J=xpX^D(5!DM`B?2^OaYGeI6#+NM>&z;(QE=y98^#%(=3YH@385Xl z5Iv@T^OV7d`*e%fgB=b;w#cAovD3&Ku$dvOF1lgSkOvLrH7|K^9G)0o{z~@f zH(=!R)&;%Z9075X`D^_F=uy6XOx`|NY?@gzt1)R4@)NvAs{@~Swl7kyvt5ym1Lf05 z)e&^OcGrk-217A&b{x9z1+niRdUVG2&KtiD&k|`WaGXmp=U&@qMr{bEHj5w5p23ZS zifTbN8W2{q_}k2ULF4nFL;8D_$Av}V`K(BvPnsHhs5our;4SN5P9oaq#FB(TAN0S#WN;8lctn8hC(+lWUmTt=@i>McKi8@KY&vp zjB?lHw&AnD_)AjO^Ee5Ej_!0l9GU$a%s1)z!1% zaVIqK2Y~!#bL&FriTsCOP{+mP|B-#ro(*EE)nCGv|L3yskBh^}BXDWjMrQH){SU{L zm%fWf%SE5f#;eCJi3#^-)HOmr2~R;?<~J+-b0ulb$G&|R599(Cg1*%!oflL7XL4P~ zou$8h!?MrrSEM{tc#VcSn0gJSj4;yFk=Rk2Pq;U@p1GKx6y}IfMXA$y=HlC$7&wf* z69*|w^0Wv~uDWK{+1sl-0JLWJ2hvM|5hQ)!|ePO-f*G5hXfDt7G0`g(u($NiGSV8jDL|G zV=zZt(U*6!d2_QTMH9&sol^@`P8cbvX^8yb0+IaLUtd)D2=;!+zEzC<1IWsHGg1fI zn^Q86ibRWLKb^f~&O=v;QWL=bvDi_)&*6>Y@ZrFx+(d{Vt&e96S3YX^P>RKjq~lr#mTvX`T&*SjR#Aa3noVR>cF)0xpDJ6P2SfLX;KDC}t=0OkN>o%L=JTSgQIuHO! z9xZajr|#S9$Ut;hoGJx=)5&x-)v|``E-hpu`W!)>m^RDDO5{$!>~{*ZSeiA4OP5fTo!<25(*wCVyY# z(DclhvCYRyjHrS9UN@TM+*1p_4nmV*y7{;A$Uc;u%R{``ng&0@$ro-JnnB~kV8+A* zjptyfkF!sKrNt9T=Brb_W9e^t91yDy4tL;MA75@@t2tJ0GJXt`cAtU;SLzYP6=@BS z{iuWq(bvAwDJ^BgPvV!Z&1ywQdvzf`jkc#lk#6FBQ}ec=N`!TUIzt-5HA05}Zu!$` z%Q#5i&!rO;m9Y>M!KSNLET6*s>tCD6`SZi1#}DL?6a*4nri$L?g;#f34f=JQ!piLr z-)bITKBwm=)QApmZSGw<{`3Uh!?U|~9s9PQKkay{ZIt-w|GnP-dsDr9?D|mA_D%%U z_zVMRk5htL9}QRAwTs^!+EjjPT=)&W@ZR`GKi7NYl&ehOe-z*YU|!b#Q3y$!gLU%1 z2mb(M{0hW=_+0@9YVKp(bDuR6ab8ki;>hFdPDU4phAu+E+&vob1o7_1P!2DZ&h|j;v6*kq3u~ri2`V8wX(SF4@ z*5PKc`#i$|GEsws_NlE%ez6D&oLVIvD7_K?nnBO@)lT79fg-%V!)2}?i6A%Uw%Szy z*MG?lHjHC4BT7BAA~7giM-OcvWz$t+Mw=IRD^>oIaNT{fCsr*>O3|WL3=CYkF@21X z_}EQ^s93Xd6Xx@o9PB0Pngz;7p`vU_t>AMuc1NWRCbw(Ls5Vw=&NDu{6A60s!=ArN zNyLdVayhbOOX0BBOZ=^IVJPw$rYXVdxB` z-I+)S(moCc(s!m>DdZgWVHY(xAj4j^S3!v96%9=>D>*Z~C^|Vman$vb zlPb)A#e-U352>*d)=&#cbJ7j35+kgNydY)hzHQ{yydDDzc=fis>o0hXFP3I?STkYl zP8%(_1);6m3{=XG72^j;sPJ>1y$qHL0mD8baKjmW9s3pXq}4lyar5fc`t~F`dtEdx8YOcpyD(M{um^br!bo=p{+~9 zBs)n){I<4n!ENCK2mK0flnDa+%F&-*XSVu)r~PvTHZ)WR;;yKoJ;5%C>&?Yq@URH9 zdKX$f#MX6RmE?c?jBz|yGi`S!({yLu0@O3%*2lr7j*ZzsR}lzi5s=wWs~101N2v3VD$l zy#w{Q>_4%B_BQu1M$@kJ=$=>&xuXkGS4pZG4jz87`8FsHF?`;n$SSg08i^aQ44 znGEYJ@U-j6_P9>#wqz!y;v?5fJ>j)w!j25w9}Qcu07vTnOv9G$OwS3|>yC#vvNnGr zFj4+$R&8ws|J#O#esVx-uMB5l^-ORy|JcoT!rRRRm;55aF z8Wq+gqRU#hrxQZu9+z)O9N|pJE^BaQ(TslbIGFHpGyylhRCOvNb;%ZD$X=j;6tObx za)*mT3#;Tn!0`aPLJ)b@>*)exX9ltAAe#|4tDsVH9_NUTX$bBuMQEy3+hFE5q0=&$ zF+R49O@G_rv>Uu)O>8EkdRNj)1 z=xM=bS;0+))H2?gRCDtYZqo%YDpeD5ZYGG&0VU#SYh&xd*>>bj)Xi|erUkmMTy9yz zXm#K|zi#;%n`gyxqMzD1b9FH{>H$0MS!(jj56dMQk-}NwE`#KD~y%Gp8reu&m%<% z&IIEi#flv@0aq<1b_rF+nT|#W!8Hx>?6yW`2xdb#%%fDLM&#+pJ6B?+>3L^n>h;iR z1aAx*2f&!&q zF`mF2wXP&@eVlnd>JjYmx=*c?e850@MNnf#Bh(630axZBW1xSKvYH{M8I-fV@u@S7 z=lcGhq0y_l2+0swpncw`o~(&&{dPt(=VQ*_QRj<2Oto+#YqX`?Vt?Z-q-z6^ zpmq+AI6kM;A`*H>dg9TIc4OApK>d4}rO659FO+8}X+pK|Eft^EWpzG&v5T}6^zN@~ zl+#=NqDiQ&wb4(V&QF?PzMQT#h=AxcQ0C9EaI$~GM!ZwD(+LLWrToHs9@e~Iw0k?t z)0LbQ#fE0n2pm-q?3Z6?hJQK>!47C*GRlz5vT6h}Q9zqQVnfQCX@b4upYSUJnN@?N zhKiG$@)vHJ&5*OGYs}KC-+!0p&5_n01=5!-NJ%=YCT@$(DR>OhR{HSK;FRFA*p%5= zyqejt)uUPa1K>NsUonG9{ti51hDZ;bv7Qc*`B&;`yVId(28X!u%n3Wts^d<9G`LED z#(70ma}pa2f`pZyE#S^DV}teM?8f@V0&31HD5lz(fDA?YwSYwENZTBQq&3BCzv%D) zSA%R+lztmYT)y*nR+dM17^TsoI2w#<;(OS%Nj!c1U#G%>e0;cELn=|9qhC#~&R@M*AJmi*Z724yusaoGdevtT5e zK=1pCAk?Og-h~e}VO3s%dC`*daS^-NFl$v?)6wzwg^LL#b5hod?nx2YEJb`N%!s9E$!sSF!y@DTdZWMDo+-m?S2y(;Q9(bZ-A!i zdH=|p&fFh$qHSxeBKG?{ke>rOQfA6$OR!x&qs|VmNEX>Pr*lCnnkK#8D|qM*ksQ0c zW`md&TcCexxhxdJmFOT8%wqm+gE9M!7P+f$&evlWax}I^>-*d1zm%%`)?KiZFcb zvFrSqe1E(K!=8OUbWK}9m`Vv-l$Y=~*?{;j_K#hLy#pPqMrsA+1t`vHvwEk@_uzXb%vc_=lI4b?2~E4#FT70aS@C+4 zez0rHM<2FS7Uf}_ckXiDRiQMe2-l>C60(ceXkIHywIT|nn1(s4rDkIoCiB_m>@+1S zRPPD7mZ7g+0wJUnJOOzr?3&cZ?cp1Uy1JRD5A+=MDp2myPh~$9RW%B#el2h!Sk*K>9nqqLK;NKhc)m^&?ec-RO-)~ zDbOLCoMJ7+sFj_HPq;v%$^|>oa6y3$;k}I8A=#GO;?_^Tt~n4zqLIKF`5Ob42e@(K#Thj-9KYV zW0I}n+)1_@+h)VzSurylpBVDQpx+6N+8nii_ggG1V0$~zYnN%JWI zB&$)2SAl?Lnge2s&c<_9kVL2X)kq^Biuf(Bym9h^otfefNP44~N10sAg)D>>h65zq zsw7N{5K49VKEeF%(m10=!vjZppvJOiO7eTlTJb~kh#|DOc^_M%K42@2M6sS0$@s3^ z7YU9^9*^7bE@sjXILdaw@_#I6Q|**7C- z2JcJ*lgGb*;ad)sp<66u`ulokvpD^)YIV&fU{tGLgctXBTH%eRaoUxgo;bQF#3^5i zymmz{@#ZP~3MT;2R&Ao!>aZ`r__do?d7;si`5~6pJWHWIcmt4Dv1%i9ny_!(23|M^ z@7TbvEFIqp(A88`Hq@(lz>$0vGcm|Y^-=xwwXOkaSFddYhJqDrr=QPqW^FBh``aCo z_Vgunoy97EoNz-(ZOzJQEiH2>LvP5`&H$#qBfdtNW7X7dEdLe#`! z^Jt4GwytLv`Nj!?V4W_Heui89&S8q5se1;?)^pLu#$UXm+~_hTMQJ1pBe3yK*VgQrn`M zH9QsZl**AZMktZsPXLx{NQ$?lnWJIRJ2AoZ1r1PI$%D|mS!nSqW)3s`W}@T=JuX)L zhhY4%31donJVb)daDGv6HzcY^Fvske!xTCtd5G0e%GX^^Y%7nvfwfauO>ZVvQ$*FR z%ccBMO*A;EHf67b4pJG@=h+GDMg-0rfB!PbV^Tpqzo^$M0I=%gQW0{*P?2~2ZW?nw zKk^38@WXm9m>6$ zkJ>sYQS$RKv|)6dUQU>Dci017rKea@aR20$0&@AKN+GhG>e5@5mMHfzOgNbjW=yXB z*%lflfV{$nPY4Kr!HbnwDyl{0O7Pb$A$T~2GrUar*LT>REW0-&REx zIEVunj0MGF7R;?L73IV2kimIcLAtCOfOUdxkCdzpUh3LFom33#72Xirq7gL&io`;H zC=J=pae>|$Ny004V|jovujs>@7ec>KSQpWJ+3K=CP#s_u1pB0QL-PZ=hRZ7$ecxS5 zZqJe1o5i*w&H+8(uNb^7UvX>N_{EgOfY~_Pv3wpyxxA{=eb&I*Hd}42M;qBRYIXF} zTg(qh3{CjN-h_k^t6>{9f1nlk;^=2xnyqz+zJCVc?rhf~-)7Wj+oO})`_PEEh^WAl zYE@}l-Ov)JX0ospmd(J7>%@f&hMi{G`ck@$7aEGO$*2anPX-9Jc~)gQs1 z8|6nFiEH{c@ zyf-TX+9Zl0ig}qyw+|WM?;h2#A#O0bwyq1KFu?D0-C#*Ll&M-oX7a5=D(=2%mgMNE z&mdtVR~RuwZNqTy!M@c(dy~p zl@&^tC$$h-| zA@8p<@9D=Dd4-KOoDvQ{-5vV~<&APQE4iH}*tsyc5|k9qpRj`36%Yw4Y;xldbr3k` z9Q>>!O0+>T2&W@?WgN$idBR6wj>HRfTnqeMtY6`7LX>O`O{?_^2&rUy9NM}TH?sLk z7j@m2S70<{*vFgAFOo%kq&n#;b@45gqL&eRPI1nU>^^x}WiCQm{}jlvurNZM<8xXHYI^cOVI zi~yx*<8I$%eTNt$onn9B>+~4;!}Fz)rj=8+7cat-}u?3L98tOGRPF&%JCgu{A(}zF3k_P zy_Ug~uXAzV(|amjW^8l)bFmMWm?&4^y@luL)$(?IuVv^Yd9KiZ@7RBS=Ko!L*;nCK zuLY3WeTRB;so#I_48D53gWLZuTp9a+x=55lPerTf8y2$JH9Ps2KwO` zFcIvVg@?Juaz4>2?oU1Duvc1CrIU*9*T8wavD=Pf#k)L@i33>KI5q$nnhzSb0Qta@ z{sqr-3T2YxHyns|mm4^effke_{Ln6mfwL=1v-9@bDD^9IkU*G((O_a`Buj~#X$We; zaVl6zyeb~-jSqx==A4?+mIfuu=WNVcg-+8+a%aximP6VorYd|(TTz&KLb9LfJ!jQD zUWy~(50;=zqG}ln=4&gCUlepS4sNljPu=-5$z9{rt=&jIVL2ZlAFTo1f7BR#2C$Y>rb`-hSOJ|1bBai7Nlg zc?cq!`l74F7c4nbYnFW;?H?#at^Fo9tj>xnYTi^U7+5xqFV3#QLohbzF+q!m2F&=q zEnSoT|E6XBZ~f803$ax?VdZY5xZ>26hYR`xh*d~qHDPM}Uk zTvM}RDZE+qx(}|yw3~I;HEfVx40M^txt70;L)$xwyR;U>p9To{FTDP+{^xi61- zTfZTdC#fpw(lRue4VHE1ncwuGe&@BRWc010CYXyObqh)b#4k|ewi0~W0kp_Mv^9ms zmb1sv>Vmb^gPU{ex84y?V2ujBQl7P$NPXW}ENM_mXjz(_tl@hct4S_~&e z;$TvQ7*@spU6WUu-m9TO75T`DJ-#z+^wdR_JELg!SLZ#f(Np&8BE8xdEJ_NSubr~B zJ-Nm^NC<2_nJdTHxMvoduE)3-a-4*jwc?|WIPmoHZ-<3++W_I~W{?i~OhlUa9Cy`}sd-Q}LzC^p5 z%ZLmtzn0TOCh}E+md%$72DQVs}esyi@?m~ zuSobuNa;frKg<$r${H6grD-jVJ6~Yhh-Knspzu!c;DhBq)tPhDnsU%{I?nHDN zDkX8Ulx@L(wK&R#t}VIWe*k`)ch6lPwsorT2cGZ#aa~7zuX}D#)Yw)H3U83m$`SSb z$I0N5IcnrFU?V-!4LZ6Xmj*>$eSU%ae*oQXiS@GE_j9w;s+DD{&+XmdQg#rJj@jxfD9cUl zztJ+Sjjab*u>ey_qM@7w=rb``R=Da+jS7by#4#TZW{!i)Lgv)t^a<+ejj>mVW#`CZ z6+NibKfsrfEnEw6y4%M{w!iouk&l>#`jb)#c^Nre;m6mP`=+QyA&fZ{H^;wBIc^lp zf^C=Ai#a5y>#)hUhV^HC%sT07dj(4s{n?E+A4!?1iAoLi{{UR3cY{8hnAl?_t*k2* znI|102~$a;`Rd>Q`kl%I?D|TNzhPUP$OuaELPQkYf1y3Au-RW#8F_Tg(P@Z<=s~LG zKEUb9prOw7%rMZiS0ogN!uZ_^^1sefL%d$%+)FvL2k8PvW1s|ajYj(FU zU;fq!1Qm^Bk)NT~T?gB~iR45ia8=D{M`t?UlIy@waCD+T}tYc7RZid?<0!`P~jHMb@uiR%US_FA;+y=qxaa_wf4S)%SLh{?za3N8ugmcXo_tf zR{Q}(H~Y31zB*kFL0Qo7ozs!;*G2%umFxrz=|=fj!(qdb0GV0R@6j0q>$Y5gt2 zbORK}YMSQ*jIZ8H@5crQ4~lmZZGxYg=7mXF!YrZj@pTLRN@NnwdBF(-HNrWT@)<35 zwccW0#*7wHez>{V;qeE6!pt-~{W`z8`^+uEcUSy#%hs_A(jqk$S2-b1|R zO?dbg+cEPxHE?-;y{s?@5#R$9CvPCXudiBex{s-y}O&QyuaE9_}JnxP27~0h0ljXx7cIK_{ch{oxs!{Bi;-x zQF!ZWe+|V!gZl#`ucBt6o}sAIwoDceq|OAk^VlF`DlbzH_QLBPoIHI^%tmaes(kx( z#-5x16Q%R-C&5I*&Tu~%2KkoOv6GIHsq2ivb~s}Gh>PjCdV;=AT2OEYKCT2OH*Lo9 zL@GCGf$s|QQocHSBsji=R$;{pW9J)N&-EWb*V&WNCfQ5*hYlua;!G2U0OSuqwc0d7 z(2==9e7<;$D_o$$nTw9)@^@5Qq^#lcf=P!d5XZ*Qwy1AL%3OSpN3lQ!F9Z}$bm`_T|SC+b(3Br*BC5W1A=q#*cYL#*+-&p)&f3unEmov7;=n0|KfhM4#g1V65tC2M0y} z(7j^Ed_RGpDtL6njrG?iR!$8~>J0<_LR|Sx=-nv+uhmP2K>uDKaU>~aV^nc^5>#A9 z3$>hIN7|_7KMj|MXqzs3@_Fz`a2S}=*)+Qok|ocK-o`||R2H%nN{vB@nGoP>mRx5y zSRz&C%={o^BZ1e#`4J<_rH^>T>QgtVbeaPF?qy?rJVY~sNupy*km&k5^_A+?c%oNM z5x}+8(v6BEWExp{wx#|#7@uV1teJJLc$3tFNMgK=xm6BhW`d;5@{=g+`O_#zw%*UR zggYx`w&`;TzXJI2NO@&ITu;|m-l&tPp@NI6i{QNiVN{v&^|WFb9IjT@*huk`CCS{q zIT=imkGrdK4v02{i_EM0NV!uLhmF<$cK7{e7ruW0g%4Ppw~q+Wa~N7`8t0#dHxt0$ z5UEztD1T&&FQNZ<(d!lZ@J?K{8=?Mv-~VdCRxAmCQQS1AM(kSpzx!uPOq#{y9je*M zvv0)KgI~9s)9STBE{s=;+<^B9OVitgB0|Q#jIByUE~qj%FfL&RX48MCXg)+n-~!sM0dk)J*-YS&CH@@9xIj{kqegxtRCSbyrjM48QKe z>xXbT6ytK);({k`qF*qT{q8WUNPXYdH3~g3*YdTP5{1i)N0_<=ND*B>k^Ply$tMsO!3OHkaC>2i|3r`z;-I`H%VRq7c(}1A0d}igOh|Zdf8^H8> ziX(=XAm02^mTymP;-}w1T~wc%(whZL#>@OM>{r@H7xp#V04(QXWa2=KYlvMl4!P`S z^I6<836df^%LtQIjJ4YkJl{KT!FY$rkI#fqS% zZ9TfvS@t<0R9+6t+q%`Okdem=?N+$Lb^*ig(RU8~PS2eO)Q9-`+e#xC4Wo zlrMQ@A+7|m>N36)Ti7g!<3w(1#;6>duuxvz3ICm@xV_jtBTo>4A<#;1vFL*=T-m~U zMTcu1(`rw?$y|!C-59f^AZm!#YFR;WXMZr0&-#hXn}!52FK)M@m_~uLKl8kKl@iPpTOHuWS_`u{$la z{Re!o&cbk@pN>P?w5GE{k(5wvVt7_W8bZ0IGU_$kBR=Isp1eKRs!D9iTexCcPJyp* zS>@O;q(H(>DV)V%wYi1z1_~~B;3oRZc_>Mslghbt0`47WdFu#9db*^tf&EOo#Q|2`iLp`WC8EhgD+; zGJQ5yz^pb}J3by*yjddtc>hMFFVKlBx1PkHg_g?@xgN0+Af3Ri;AOG(kfWI9evS_lS?}m^nDW!HGmaGYIMS0`@;{XOISS&}T*wg<$<&3Nq>z`9K^hGsPA~mX7mdf6V z3^3n;f*&HGvUnoR;77>#fGY4V&K+DR6+$?JdPvPc7R7Qq7dTN7GVsog<)NqFhAWTz z$gk&NXj-I!%E?~D^Ho(o)niGV3r;vVV45%PZKK|eDp4^qUNp%LHozFgb&*t@Ckc8& zE-j4`7`!lM%47GEZt!4u+?%Y#ZGe2LC^$c0Q?EzF3eYCt?H*otOHYZ!J;xD=o;K8U zxJi#bygH6IAqf!szqor3sHT=KVDuy;^b!z4$AExz5GjfmO{k$7O6a{wRaBbT0s_(n zq!*?4PC%q6RS{6>B8n76DT0lnp!iPkdMy|4r~g|2dT+g)StoO5cALHT)KkVQq`z+0 z*>nkGgWIwto~C7PT$gu*`HtO{pvAx*W(J=Y9IU*g<*4Indu&*{H|q^_xgE%Q#2u>} zmBBX%;I$_7D`e&M1SZN^UkiKaFrQK@UfdyB5nLGESMEtp%uIfy8*6NC(1)AP;fdwI zNe|DuDtJZPbjArY4n-Xp*=guuZWP18w&vk8Y?(iwdt;ULq{_I(nnoZTVyL9;3J-&e zhW7U1!^emTCoUumw?AGcoNoAAi zxDGGfFKEkQ?(qH$@Fwv3L`r#45@P+Ymb0FHO5Vt|Y#O@y?jfhlNaluiy&rIzpWP%s z&n-ldw&~Twpt{q84XZRs1d%pYVf|~7L9G?@IZ`NYU+b9o zAp_NZZpXVK0Y29>?KPsT{c(XdLhshthmCf$X4=i(AgY9D7k4oF-AvC`E>ktiP|WAD z5L?rT(qw+)lDJ29Mr2i$*#>vpnT>*}wy#8<8oua7ys7>fC}^G3WQHA4sk(H(eIFie}|%y!pJL8oOv+I-;P{pdY;;v-oS`uY}bsZPPgl`8?6>YpwaiH!v$Kg3h- z_G+K;WUQ^b{qgj9dAf0|<+vA}A}%_ihO^EIbLrjAV=XGmAqSl^+Z>g=hRy(%K#k%&Vd&(#exloHC71 zrk2af+wqIp8#hzI2c)S_C`7+5jSj#pcvtw*GJ8h9o-2c2(ktClH5^>(kw1BSV88zG zk%vJ%&AW@k2Dvo-#ZphPUFs9KoBG!2I^DF{F0$q1-0FSF|y(vTRvK;Z>PAymUXB&^@DYCNgfcl4E|;*2iz z7RBb?C2e0yDaS7Oyrf39QF>^fQVWN7+96S2#Z}hk;WIO(LXzZ+2s4pOUVR-cm^oe@^P?t68I=N;nYymvVJjA@pX&2H0>wDY`tA|y+H#PB2dU{KzYTPia)K&`G+fVC><~^L@K;`LLkxmqA7 zcz?mTEl=~k@hi!Xs_)N(U*@1C13%>fkb#TW2*UO&*gvGk{BX5(LB$`Z!Ox_@ABW** zqT)wr@W+7hp8|%I4ki*bU~%X#xiEl|1W%v>5E`%;02YJ&7nTN!0PrIy`Qy;2KuT1c z1`5E!0s(#iBtnS-FhC#%Ja4i7kzEW11=Rom3<|NuiwQt6VE_Ue7Kr5sASfsXBt>HV zvyfO6NIV7t#881WK^9;^Ku8dmKadgzMz-L=$j^vOUsAANv#7pk;0yfU+V~shdt9o& z=|KNU#C%WrE46=ee~SD7{5|6D#-AY)k*AM5^B+{x74z{+04u zbOL|k{+pNohqn0JL;h6M|F;bH%~5|xEui7H>L%iMfWN_z3BlzK7X94%Rr7^=II}j@BP} z{fiD^tAmR<^o_>qx9Hc{n*`!z+U`I>rXnv;xxc- zJAOSLEqcgQm-Mi&T>nPj zD$RGKKrUd-j-mWY^>6T>y&4Mq_ycvirOodsktitrbiLgr({_nJvESyB>ZgMI<|S+! zQokX<|5E-hxNrH+pK~PH@jLzgg81KJqX1C(q|xY>;lAU@^q=L50bnE+pc+BLVM%I% zV)$dINCAxhDv*4GlnYA8&qN9+0tP@pV9+fJzrq4pFj4YD!ErH2oD@(oAUp&H$_&-` zB`*>SER2Z~9KFJ}+#42yMKPgC)tG6k$iHMq1wg4twG$)`p26_NIk$-X2fHmUXn;f< zR3jL^$`e#_)#}*3^33_k$s2g6UGf`Ok)1g9nh5Eu*)05mHTC;)^X z3QlwYkR1%<2sX8#Br%lWN1;CO}KmkCt zBfy516ak`QBrvY_^x`Cs9Ge5h%gV835ap*w;2M zo$G%~Y?3>{0?{ZY&<`k^{%UYx`9YXpu_hUgP+E|}Z(@;j2nH;O@<)MGM?jP2?mNsk`VTX zLXyM-!|$r%9}R%wfdN#@KPkTz0mTCYNiBaAz8db&u>OB-IFb&T{@ieXyVh1m^G7Dw zG8_!#_$OGXFNXUQl&|#v*tNbOf@(n#u-jMd?>g46T)q~Eq!#R#x!TWJaaiD&@{=kZ z*y6#q1%N{SMd~X%CeUyI0R4LT13CZ};TMQh;E)6CIkx*zZI?(&17!olFLOaLw*8SL z1RJ7XSpkjOUU(2544_)JF9Hey7UADn7*NBcQg5FNib072$6EhFL?QleDu1CdEI4A{ zE{k$Y!e5yc#QL{{q!bj>R*eIh{!5ar6sljR|0?TOr2bBaZO`a`V37<*&;Shti~A$K zpyAL!3?-;E04(WmvnFXchKkgEGyMs>7?1@PT-pZ$LB7Aw4s@+wde?u^0ZX*4pZ`}P zC>2#4B%iM6!i}fLG6J7`)A7Es&1g+Q2$l@?eY*? zH7*8J%O42|0&iJuJCgsE26AEgQ$}Clsrch4K_Ov(C?^OHPTT;JbN)#n*$(q%Cio|a zB-;T@RKOqc+Oi$VRkp=K{If#I|NR=-+aI7w#RGY7OM>>|SG@JF5z_yArthIi#)N^h zSW^A?K7A{Gc=HS5$Mahe@a3G3KZ1dz0wFL`39wt|?+770vb`T_C>vHsL`zp#!YS(IXHZGNKq*Tnw@{tf_?GzoKa`G>skcx;yri__Q*e!TJ#X&u`Cf584A5@=3v_4v`J&5h4M^A9=O zvH1>wufPavPWJz#~xo^jv@5ufDxlKCBo?jXW2{0FkBQ3pv5foGd z04pF9xb}nPX99iur*4X5&u;-i5*`IbgRK+{0WOJQ_?giB;G!m!68NbKGku2@M~Q+` zk(RQcXc&SL zpp{`URIu#i!1&jm5Tx z1IMayfLloahorIjyW+XqP~O&X7$61ym zFnf4Kgu7G1U8V2Qha;D77#Vau^c=~mgZs5oO6lviF?p=W>{1VYD=BoQ#4v_GR@$5C zo(kQ_Y-Kj%nTYP4^AF#?rJVt_sOvS?4@0O@3?Q_`Dde<5-71;W?4Fx%q;P?g&i2-{COc zF>K76342&ouG2|lRryfMJwKU_oJ*ep2*-BHOzOQlYn-`Tu&MK7*O}CJtnYZ=y7gN3 zUc6HweO30^izPcwB~Py?`NOg_YcmY zxy5?1B&nc}Q{*qE{B)V~-aXoSQh^4L&tP8C^vGm^zd*>>iaN zMmJzUw#)Ef?A`l+`J+-0+P8G})Hl)wJ4f!K3TZ#?K>kd5M8%srTt@;)9elsMOV8-UQuG3UogR0D;1xFc`%*_rusA(0aC>D4f*s zs@H_rtk!_c%9g(VsVz5zlHBk!U|;c5>Azi4jnlN#O8r-$7^hi0*1(#?R6G!+PIJGq za%^t0R{wO;5r0XMvR3itI>j+ArU)i4=ArX9C-h{OO#?v=mSQ#ho$i0)) zgdetb>`T65{yd7ack{XG`gz-Ej%b=YVc@1Mq5g`YNz+eWSm8NM)DRU15q&1gHKVTK zDWXA>uDdlicP$0axbGw8Ei zn4wAymgU)|tRypop34&Yi*D}(5!3z|sM=9%{C4-W!0o@hb_(1mKgISi zt8}g}DmCH$OrMoj*#)sOuRxBy5#VrRlF!31ckStl1drQ?bF-J8OU{eAe57N^amq_@ zowYHGzFeS5e`!clK%{T^us5Rd+LHH2jyuUgxBNry554E*xY!lnw)+lKn*Dg z&4*U-b@p9ed7y%S6Jn+D5!!V5J^a+}*DU|=y23iC@K1wxzIUzbb&95SetaHN z!A>%@(`P-eAcmJ+ZYVfcoXfR{>DRkKEgTigR;E|@*BG9B-w8SFj(uGF{@VARYek$a zLL+f9=sI$3?Ah_zhm2>*qxT1@C2-XGbJ;wZb&M zjGC& zN)att-U839`^n?zDmrDekzI#9XhJmh2VQfFzik-2qqt$^0$J06j~uW2 zF0MpcFdVR26XG3SS2!QSBEelmn2D0`NqFc=n8@;uucOP@IkjHB|R{o6I)v2c`I zboyq?^dW`q>EE`?SQ-(}3-zjKP;i4Q4_R=8vT=nI1iwcwLFElQS;HNx~iE<`g z@QbA{VLs68SV&KXZqybnt))4nj+LKSAgNY~{x1}ei7W1FHZavb$cBJI4&?C(MS5St z`O`ayAaro;h~Ww!{=G*YnI>BrpE+4EgK&L^c)-@QxltM#4%dS=?#?#vsWjP$IUKbV+-}E=X?5`haZW<uc*G z0tK(sg6XhGW?JrJg^YL9)b|O?3S$?~U?ath=-4_+nXX=KL!e#UIN&XxmQ+GwI&_1> zu>ni#o7f{tor$HF^nzsR&;j!C$8#Ae+FZzX^ZH(txjndIT}HfdBQ@XODvu3GCYmi~ zu7|%j=6QWyhde*3N5|q+XVaddZU}2}84V6lSM7h6r-e z+i%=)&NYxGD{>@~?&9Sj{DLVFD(V@yrjT&Wr%}5dW$Z}Mim9B_NV$S6q-To^KD>}E$P_OPrCP0TE zZe`5Ww>`sx#6^&D; zDIFdn7ip)+=jm*D)}vfR&8XBm4e8%~^d8tzv%y|mg?-PhdO?+}^mg2(D`UY;NSW&x zPIGLhUR=lldZqXDS5^9zf^nsYd^}(wDkiJ~4(R0aOGisagCJTfG|pwzv(+va)!|pg ztGxS7$X+eKTBgatNeL)8g#rwEM@tkV_OLX32%xSsydyTB$F(7`(s9H!#=B22J48uR zpFTByvvS5YYRSdX%x`?0IM>HlrY(ogH#k;JcV*PDdBN$Db@3y^k>*7Pht0HsbLg}As153DsVt1UsF^69I^9-A zt8DRJilow;N{kD&c|O{MY^MU-vJrQVnU~&C?R)xa0r2dBDP@{5?l;Uh0=Y>Gn{=}J zqL2@y>_O+w!Fso*{`t&sT{J?v0OP`O-Tie-BC0CWncI6^;jHJlY-!tPz^T6PXv~mT zN%B5waWVb%q$3WyDox`i#0PoGuDJ%Bf;!5g81K>qYqynjP!xH%h8G=A<~q4QEsus$ zq{p4L?&$vA=z)2G0h)gO1J~&LLjvOACo@(0T10WhHx1sf+4fJT*$jme2TD&IcQ1z*eo8-=IXKbCU7_!QbV8LF(|vP}kcR+QN!}EH-2pz;>2`^}QeZ#Eu4gV%a*RxqIF|P$F=VoxlYVKc-ZorP{PN8YMJrIH#W+*;Uk!gSYV9-N9E2 z6S9o4$~KcYNb7RrjaR$Cg2Phi6C)kb2~hp>rYauiFE+?= ztGv9d{MGxsn7Qdp7(Sl+sF3imQD3cHk=HfDi2ys~Y~et3#7VuVbAn_k{t7Cp9(4;< zmo!_ou0MgfB;h0=@Bl|2sKa3o-n%-JI9i?~`?QS)a^l^@oi0C9pb~~sX?ZoSuPt-M z*4wxV^pMBxP#4ydpmQs-};ZSa48h|$6$X7Dp030BebPg^h%X-(#(9Kx-G zA8$<<(}By6(VhqEWKdH#Bi``%bjgET&Ke&wvHc8;5XE$GkFv_247&BW)Xosc-i~>k z@{nt)OS3Z9sSwY9koZFeEBW{azyGmc=KrsZi{hE*R%Qk^wjsR@>Z225XN--{{w%~c zkpDyM{~H*2^!M&vKB941{a;G@LvCJ3aj$cIiaINsMgQ9Xe@Gj&JSGq@=@_kGr~j0ENIkxz4j{iX@3DUgI5?8k{3q2u}jNtYkZQpHno zvQQpr(x9x2V=U0#on>`PBBjRK;AFUu=7JtX-9aRyJhUAv>at>ETij^Dl7yCZj`47= zuUIQMtX_NLqMtKt3UKaMZZ6EfOmTQlioV!QAvBRMFxfm`{JdWg{YG>eZa;kERJ^^) zZY6S)wNmq}oH2tkvf0!H@|A{A`PC@7)$ABoLVm;(kyNAyWU27%G>z6dn=WbayLJ9ogSmRU{4~{JmlNF#<*H)QLE=4TPg~$WbyJ$-x;bN4A@z)q_p=0w=5LWNG;wk z6{bz^Xdn`L3oRcZ@C-p7p8qNZPhJyZ4Nr-Y)em=TWWN3;9;Q0(y}`&PYEz#z>}{q% z&EA7hiCE=WZJrFV9#ZEVjh}F^ncU48aoyUz=7CYN<4DMns<_c~S z$`PCfS6j^PaP?v%#zxL$T*>aYfs1I0*HI00*)8Z{`jY96i^&p+G(k>9thYks=0tL0 z#q1usc)ip#&C4rOu4Q=2;cjRpLx21UwU5-OmYd;GtA=8hJ(l^kE6(8OpuE9R zv!hsyy^mj@I#r$r=b3E0w8nZ^J)@&cL+QbZ@m_%3UTHAMi?LAghLX^JvI{v`LwfM2 zi|CO!Nwg(RylU#b686fd6GQl*H0t65GtL%roS4>hY8;)rL$Gg>zH)PPSK_#yUE>41 z)gthK6K}gl)t`H->hbL+%~-bmIA&xqIc?$Y)>r58wmNrv_QHDfxbQmKu&&i5guK zMTi#*72(Hp9IxH}HjrecY|7m0O6mVE|j zI6n%buQA=n4EA|NgggW?jgpoyMyB&OWT;H3yNr~oSz=0q9YlHmk1l9Wn9P|R^1A;X zPt7cZ%Tfyd&p(;zIp(gpWVUmfABFxGEJ!ZLBFAcpxnH6*Uy?X$msu_R(+NTwA2}&v-)gwWqB)D5H!HpH4RqHR3%TDMs{=AkG=Qe3$we zn4MY-xzap6L!Knm@+jxkXP_hoJhgi*8t5E2r~l4+om-Jr;>v~G$ph=xV9L`%=FTH~ z$(CAEPRNf+0KH`|(=;(p>Bp+FM5g8a&`oWN{Naq19Lq2cNC=u~FPY+Q^J1q?r97pO z+m;fK&Jh~Gk0n^Wt2pE`Q7*~YuFF~abj&K1=hYn3O@+0U6_A|}3{|C=Zb9i> zazKD3YgMzo+pC>3!o z@m=w{do$F~hf>DKMzD`shB>f5Bs+hvYamWd45x3BZ`9zT&}e1`ZxGe)@dS()Q4Z=N z(!~kKj#)LWJMeWLO-V2Tm|LStRz9w-+w~00cwY?iKAIia+O-NRFN8^ zQa+U#uc1pvRksOQron{?!v|P*Dk6*8d%h#@ZnwVNl@II78d6JS*pcNv{E*q9%SijV z>`m7^0ZP7XyjzqF>y(tdA^Fg7N(H_vbXTx*j~Z@4c;3$|(o&Q>Z2pSFh>O_J={5mR z8nXonS$1yml8EwS*yB0S8_|@<3?7*jn5fi_w#jc`Y^fp{%#c_5J8#eUSf;Fo05G97 zwA(9cG7ZTpvz3o|&qjJSax`|n40d$Md$34-z-L9jo1k*u=H()lszMU}(6QZOzE$?vWiqR84z#ZCk>ytQIU0;z{&ogD0Vt# zZ@o{p4V-arhaVA3O=;<6t|%1snm9;Fzdca5m}-A zEmCrWZ{6rvWbO0|jg-1v3TkSWWdj;N1B}IOowT*8`73i3QiS-fFxBUk7V@T;vKE=~ z@LNN)n)o7qOv&M91F=!_xWG(EY)QK@(HDVe;5|xwCd>LtSfSfg4(DdWt6CdQ7}B{Y z*D%EHdRHAP+)^h)N(0 zV~oCIynEVOHpCut)hwUOX=k)#P!f@|gO6XSa*;CjRVHilXjV>)vL|xyIEEficO2wY zabfCl+k=lSll?eR@zSkI=~BoML%M$B-k(5zdOk>+A2i}Ve>q2KAFY({-C-w(N$Vfz!kE(q5i&`8Je`T z|A}08U=vGq?{n^9N|)z@>SyiK*%cHY#F;|Xbc$q+Yab7}qsYn{1ieD+U}YlR75?8D z>86LjCQ1X#CaVhA5M2uS>ALcE!I2UVBC?>Ss*s|rfJlisMq}Xdu0pz^3)+lsjZER( z55}m4M0Pwc$DnX5tX{)cb-crD$irP0$M|y(PJQqS#tR-e_i^nNSs^BCkZs}7NuIw%(rH zpN>XNovkH!nHF}x9bU|kPi$BguYJn>;j{|V9@E?8)ZTJ5d52wQm}Cq^i^RM8Vt^^lylFYT)R<{YlxIO-Qsh9 z^Y&rYo~?cXd^F~$ub|~gu$eEoSjTaWwaa&td5+@61jcKbTOfmjZqDPNUb~rM`Z?x+ z_iY@T%tVXf#dFLGnqvcSm-usYvkLxH$A`z8y?i3Pl+pd`hv%<$Y!-d||IDAo?ZO?a zi8F8ZZSKAF^#A%vdfXr*kLp8d=ZBQ){~ldg-<*-0c$@U1LQjgPVU^1{6775$Mb``_q^GEDXjO5uKn~MCdPZ8 zeHzumiq_h>0z|LP3Gx&}%oe#`&M#~6+E?H|156HgE)S%s<=CvakhZ=RF)RZAJ_D*6 zh)>~2Ihn2u;?}6ie7BgQK+%zrch=8{V#C(Y=g555&v{*t#N?#XUw!a?HTB6WymP&I z`sP|@gFpS%r!{}+9zbLnoV3*EseTv+-0LYOe@&4hN|vpNrEs@^D)3ZMsJ{(s*l<8j`2#iVDyd9lQ_%p31SccFjbfX*@BVOL|#>Od50 zKvQp{K6!|7SC^pfXF!FG%x%ozbim8xrdtg0RD4O${<{q21=q4W!7=e?fG#m2Rk(2A zuFbO?h{uasiz4M_YCeJG-MdTAZcx=Si+QG2;%%%C~^w zwbGzPs;SgSh5$8J_ft+~-UAMDglt!?!ck#mBZ`{XJJf^DW}_^pl0;^r1K~zec$X1Q ztqV@7UEw0sofw@{twig3y42$Ei~Q1;^K4YPIbFm|JKkgl)0Dx-V7{d#*?J=DJv#@Z1|3Bn=pMl@qytvQlWs*f)*iWRMBe??04NjAV$IotgJVHQH5 zZJ@>b-pnaj54?9(<*!dvX`PMS_G_mEb&aICv$}+P4NB5a2^TBm1e<0x;wL6ndlzM! zCk(4(Qh~L_1S|9M25aZ^T_cUubg2pGN63}S)%xii0MKaC%$SSHhcwzqN)MDgm-lB? zLg)?XTgvV+X^S6J<_%ItT=gASlNB8jTX#L}F9r@h55FEYiA$7trDMKexg0Gt_aNx> zT||k5jCaimb^^iJ$@{kwe9F(^4zpCS9;w( zul?bVmc--o#w1wh>0hx_1PdG=Y*U^$v>frL}QmYkVk6kWF zq4#^|9M7g|WkyQJy-79VHZ}`-`D`S+yQ;`Ji#cYOc|D_}K`NO-t7Yxtcb>`Aar<#% zXOq9ln-xuoYUa8qvU8^5;U#?yu)V&Kt8X4z?sh3#`V3H4m8W9Za>^1x0C=a|g+l6teRJeM**ew26q99GMGl>?t8s=@S7Zu;k zmN7o`q`7o|z)Zr(_vZtRjgH877X;Z{9^;gF%O19L6|b({NyP%9y6K&RKz3(pFMuV2S3rWe=<-)QT67 z5eZt-x~0{k7R>=kTllCEobv;UWNk(~f&rkO_<| zeITvdmvFQ?O7@9su}$`UMl}pZ38Ll3zeiI;3C`T0l_wvNJ(<|T)0oUXxc?$Fz&?Av zIEG#Z$q@aZp|Ws?2tO;ow^g_lxb3g|5WNJ)sl#FGN|w2st4$eNczDIe<2g*#++Qp`%_l zNxJUgd}bB8%qni-mSegzJkg*$HluBpP9U~^Amp7X$IS<^B^ViK?q4fial#2!)YmW5 zTASF@jsdudKBvk33pUQzR*>=`B1TDhR(lr_mZRLR5a-4b{OT*whxam$8VUINJu=mI zBlI783hiar@v!dSn^|#!-|T5qS)ROcu7ZBh!rErQb4J%HgJ8&T$+i zAbgGP_VJ^y7u>9Mxij<(6GC^mnB?~!BT~1qwaXEh<(Jv( z>HSAJ#6PJ@}hco$@Q;E7UdS4`C++ zJ!E_%Byq7o@IyatJELQ3p@NDNb^>BPI(a3GH@Mfs+h!^cozWc4ol94~g1vLOUv)1) z6+3teC-p*0L@K6N?@`uu1iAL)MttkRhk_mG(kLP~`#Z&o8KGpCvMR*RbDcUwRq5FQ z;Ph}gpIXt4fe1BI>uaZQMBTFGP`X*yH1tBqbWf12jpK#MyW&0pys4CcwD8(9JG%}_a5 zU-Jp%bWf4pD{&Uff+jZ9&s$y(nl=mB^V&h=dbP;ev#xWwWS2$i1MW%I@j2utWw^?k z$_hE@XYcP^P9Z}DLVJ`bmz+$vJH<6?cQ_Lsa_wZ%9%+e+V#!CnxkYDRkGCpso_2aC z1+Vvqs8L748=Ypxt4mxFRVTBDCd<>;sMG40FZJq3%3I^z!6DoAj#?f^A&0U79P$vN zKmtI=2#h_-yfddv?B`TH%=yj=o_)(1MWGNt!RSdhS!SwnV1s*=34&IGGS(l-qf;HJ zw#CS@9yPX4P$Sa_d-BE0lYf{hkRbaqsb z=cR%A!7;sl&uiC54t4t?giW)X0kOb#$1^THm|?r7@OFN;gz?H|S3x76p7bMH7jmV& zsxQ?otjwD&dfJbc_djONVd=EO?9cgl`Nhr7lJnz4R`g$=kPA zT;D95!JH=+V=5^yeV};N`0UPmylO@?(4L#!R7c0@P_}xs>COiI49}4K7c?&Gu-gtddbqO+wf zQz_2DXqX(|aA7H#QJmg5J~T5}HceEwH{RLIRPEv}&mr@c3?WChi$2!Ohgk;T33yH8fT|n=%Xb3NAv%BA6Kt#4SCFxH0||S=IJP z|EUSRaYUDJiL%i$awh4@P@~61HJRS-NcSp~U+qI<5zp zT`3)I7C$;)Yni@p1ZhQ^+l^^!4{xDXb*g=M6kW}NW@a8LbPJSkJQO$!;ju88*QcHd9us=b6|LdR^!%cwPD?2e zWzj>QBFfSbE=FDAtlTB?mUWCvON2d;Si?^gsyU)P^uXx8UdL>WiwK3i7tbEQ5rgC1 zW%v`Q_rs~Jy7(+ihbWiu5k58{Z<#t%4+d|$i?YhPRl0MXGRA>Q&uj>mT{_TVD!iYB z~NS^~fI>K!!dZJ|)x>{@kQ1I`46f05tWSGj<6{m1Zome+}IiCcENtOIDwzzHV#lN zL&i)fx)Ny;AhG&VWa!Ar27n-y98W<$CLUikZ*3Pb^~8w#HD?{d8R8*rtg#Ezr#fzP z+V5H=e^fDA8y(Ix$|ufwVSjvN?3tWBQct`+daLrIag(vtA<4zm5i(s>tyzTTo?s~( zGQN8(yNn8fogpy_w2y-#DooaL`ML~gdo%;QP(yPWoK!Se)R4Nl=P)O)>p)x{T>tJ! zcLaM)O80X)nnr&^hm-dG!TVzYa&-%?lH%F19Xh+=X0%Ir0=Kzi_$K#DVbXn)Cqgze zGm|C#7qnZ?Xvi#N0^BAar6Gls`)kjmDHpSKGf`qkF~w!Pf($2D-3^63(x2EDc!ZT6 zekzb2KOQDi?Vxp_-cd@L^+=by*vb)s0CJ2dJp3`VbROUREI|Pf#lBYYHo&Q$&T13M zCWfrRkYHsR9*Eyd9xf846c^J0o$g$!iiF!$3pqL~sFF+3bPz_If?MK_BKwERi%Om- z5R_vGmJ!sQJrQ&a0igkz@Fq^4`KO3>+2B+$9 zP2{aR{Utfn@&s`W*J3>jZ&=I9WwlXmvg_tOj0%_UrJWjU%ebSS-V@PT8D?fFSot)B zi^0bArRIXv6<(e~IRm;EqHZU5XS56p7MGWi1Jn^G*jB-{)M`tKr=zhK3@vK_<7^l4 zr`Mn2h2m@TLIkGFj4YWQ(_m#{)gjbPs5A#RLZN6Q}4BIQ0(jnof>J{&1 zPfi%Fa;gj7g%5=l8@)CpJ6fdYdp~zi7Qhm>VnRnuHtTg)iVQ#Am()7ynLd(1S3=Yb3X6g8FKGxgAc@A+MmQ4 zVar5p(6PNuyN{=3cr;9$F_PwF*DNde!j2nr)e zT^^R~RQdcZCL#=OxxQkRD}>-H)I=E3NHp)-bN2Y-Ld{SEGm1Uw?d+*hkN|l!{(^>J zadgzf9C@dj;-~=uNtan~d)>xbSg2O5IqYuIfu*NjFYM*)?1TX0B2l!@C}lMR126P) zW-dUmeR##k+v0*y*xi=*PQkfpo(KvP<5>xIR-HLvKW4t9VVZzWN7@mkh>dn45k;93 zw=3KGuF}i2!v02%%W~7=ne{c=G3+(|XrmZe<@!$f$U|qc;^iwiT=y+ z4eN!-$rM?QO^6D|>0avAP2Sl2oJ|`2yx8Jq!D5vskaclnOXhRaxkOt0+PXMGgnKhW zKgoJsEV*55=X-<*xX9$Sj0}Crgj;4b2hKeZSEh}wHB+_}Dep1yeZ5IoFVw)?HNaEZ zs02Z%rGatQ)Pad;@dg_}1vy)VwAPz1TX1&RML}U2_1sdnkkvWb?o4h#(Lmr}N;yJM zWwp6>HC36hpbT}1Z<@XSJ@4JN!WuIz{PF&`JNfN0f*6lN1`b*as_4u3Je#HN^9|R_ z?q}=@P|oI8T-TsP|(gxALvHmN?! z`+iiQq%gR0AW&DT;jKVFIlWdDolydYVQF-#Cf9FxRKb*6gJWFT|3RK|4$K2t<3eqc zi5~R`BZ_8E?tSB0i(}A|#SRHi)JwoqD_uAC__02AMk-6GpV68h*+ zvQ;P;4cP(<1K$tDTZQi`71EkuQ0W~9iq%rx?QircuvHi8lNXy(;GDEsq=d9C)8!Vv zoFax(>y-)+^A&|N=4I2#*I`*GE@fJ)QgmFn&9pvQM7CnC9hxfr)~*)^&mK3chJy3| z5(R(i;0G?Ln2^caa;hb#576BR#5BQYSYuA~?2-T?cX9+~aWhU-CcsZF-3!%L`{a2# zK=oiuOJ6iqwcVagV`u7^)-fEkq1LRf@v**YcdHv7nJFO?ijR@iLPO`Wjz)2g38AQm z#B}5g;^v5K`f9J)WQcm)9A{|>yR_n~ZY1?vo-q`4hf+W?xuNU6$sVZ~UpVWD zgmjBzgcw_E76(n|mXS0ppFF9*mGTGRTkx=QCdvC;+$M(RnY2*TbU3O2n z7uTJrG%zgXfxeLt4^D<0vKNCbS);s1^hF%{CPl=bEXAcB6pOdlcNG#r?I+`+WA)s- zqJ>CQ?Zb)vwI@&eR%O(Zgv5!9`?D4${6u#R$grt2QBE(EZ4T}*qAe0Vv~R2`;@SSx zXL$E4d55Hx8S+^qHA>siKif2Pe6)}55Lc@q87_3R^~HRATh6#NOE5|sXjd`p6C)EM zv0D(rA2P7S|(GPH@nV7iwM4mvY^hotcQ}qj# zQc=GCfyXaosng1&XzA_y+HMN5Rm}I91?ldk3I!l&4rZ;f3G*TXkjhTw^susS{7T#) zE+HA5(CL{O#p0FEEpWM-y|h%kU)x%T=P*R5;n)uF^k)^zDy_X@LMY({o?d&kbJ+l< znk`U&oHh%vAqNz*`{3Y1><3K93``QW^wj!~BJcYl$W+7>g8V}(C9Z6~IQy{hp8Udb z4JcHfK1tH%nK7}Nqbp&6t(ZJuunJjxpi*w>n59if>x~cf4$RO(sn{Y``U1HSG=(;$ zQ~9KdaTcVgz|`C#(UI4+Qz9d4hb*tpvGq>bW4%m(5H;B+{MSeEmbn=Dj)Av( z0t~^|D4@i%5=#&q*yPVi%Fc=_jdMFrPo0bDMlTR|z^p%j@0_6uMa!%RKYTv46h8D}v;JU@x)JnYM;I;VHB+aW2z^7Q+*#{VC zm2JsG9!HAZNpA`B-s4kfDc|W$W#WkLI7kR+DDqm6!mKaWT%hzmsbv^-0!0f@=Ip(x?fUkzjHb0@i z&CBz-07Yy6lXymqwBmC$|Djk&3)~!MfqrXlv*27JVV=Qx#g2M>)`{$c^1HY`Ezj`G zn&W+RWSNK+7GKe8ajH=wau-Sry;H;E={UwUYhS@-eOBLG!?|Nbg(%sWPYH{mglcnl zj2@{&N9C7RUbmoAlnV0~r<+x@jffdoSM{bX%YOC2(>cZ2c@H311khMJTdYRyiAc}o zN?uJV|LDm8$#f|@(DKmMnW)#-WUf|KIIEDQLm>B#Y&6Hw-1NDuRY5$ESbqPM@#xS% z^{}I{A4*ED4bK|n`6RMWPX#tyyuwT#*&5=(u&RDoS>J&#B{5)Ob>kMnbj;M$3kkrE~(^QwL*7VV(_EE1I=2Bu#<0`^*U+=Nv z1+;@)%cfR0?)4k=aHf~8nCc+%N^2StB=^;2M9Lsu`1Lz7mw4Q=SGU>NeR@gQtjDE< zOM%KGLP2;q$e3z?zyXIwiI^U5$4}u|;hDjADJ;s0=@*1?ND5n(7!@-ImV{;4uAm~p zyQgWB6S*399UG|ymX3%4S!)(ZFPd=db42fMn3i9X@lo?|m1GI71{YP)IuEvFE12y6 z)82VUHMQ;gJ^?}ry+aTPRl0NpMF8>uREi3+U-mxxobm1%_q=!SeRsTj#(VdltTpCZnQM)?)|$Wh`_1p~Gi4Zza-U}1 zcxGbh_873boKca@`ko;0h^M6@j)jx^hGf9yFxCnoa(T~C^E}Tm;vCuM%RVp>Nzc|7 zIDa}a*Fkt2&@w9b%;Mn5zcMZI^ z6=xUptnge?3x=uwMx~G)cR^W2^Mu+b&5E~VVdv}I5KSz$Q0jDhSHlg%F+H7lg zlUQV8-_Mvhx{uM7X4wh~g}Qc3?XpR8id#luAIL+crRs9j)|9517?n0U1ZN*Kw+glt z-1Kv@wsh3y_bdiTplEcN^aogce7uonNj24)eHxGKSnN&Q1S)vSt*60L{`FcX0Wmwe zi(JTIIFMMxO6V4lCA2Fl*YBMTyr7*MS00|Po$?#86-rr+65|OAiE|S&wrSc8#^jgw zClh_JD1LO2I}a&B_o=J5O$s*Ktp)~to(`^FlUhDHR&(@Yeo)RaFStWm^vcC5zTYRx z*ww7rK3yBvK-`5^R4M9HAJzBWB7F&Ppg+S?6kfQ9f2;88#D^!|*T1TM$bWVH<-M)j zuN0o#``;HndlGs0_SbHk{2xQnk%xTVdkhh0FHN@G-$e%8xV)$Qgm>%hQ1_cBZVy<$ z7EL;F$JuS(`gdO8-+nLuq-Ulp1ma?UlBPFx*6dl7JhQ*g($zUF4R@Q0YzAIoO}txZ zG`#6_ndS4<+{FJb{Esz=a++g_i`o*|0WtXK-eZjohsh@~m8BC)$ILqzqTZwFvqfw+ zVZW~2*`QXaF<6OrY=jt_k{6O=G%{&r+(NWUi|vg)<*pFUckEB4reK>P&{i1OH}sTq zln07a9Je_-?$i|%SPY7HYfF1UXL?DH?p5hm#)kAE36Q_)#L8wOtK|S%l;P6FfTBi^?V8 z3`Z*;^1Qpme?QA*oYFWWwSG#{?Lo&vneo@_bqT3rDr|=kfk`8oA?d3^V7DYr>5y5* zdv~z{RCeV(5~AmG;~%}X=LDGrOWxEQbq7DVy!x%RxOk^-)V|z)W} zHgD*R_q(pN8KjJ2ZF#PF@d>|n3y~R56kii{KVNw<%SW$D&>qp~1PCa3msD4IT{YuQz6}Inue>l`|&M*mkC; z;Emha{;GUG+QG-&M=>t2!;K6_0OsS%>L1b_K;7q;nXdr z*C182m$Gg6nulvZyZWl6`avb~3lQlO!#gDGP6a;J4xnVk*y|3@x5}5rv(FM0v;xS zrhJHr4nKkZt!pBDH9Vrr0nhqubwRCNy?On2xz8W@IO?D(O6ckSyp6hKhvaEz6-V`g zeyVLE>q@JeZe?RH@z&?;l1yTEz5 z{G0-csgc&YqF5u(pq811lxG%fQ!5~G@$fmrf)>-1TcBiTWdM7yb?^&1OYcXd0RNEN zGp1r1>XJ2DAw#>TZzYnG@%l4r z93YSnP(4t!yhN=ryT~1Vi{DO_NhjM4Ozh75YAG>@1+jXvs67_5-Hg&FijO-VsgRsR zlm<_hO?#R2xdL_@)KbV%!6ia46?1^VN=j)QD!&R;`4#g#SC9=w0OkSGoB?mo8g;X~ z(Jo7w;;OmrPAxT_!RhA0yBfDlfNTHyWb|&% zwBXf@b}zH}@>*VLJ*%}>U4h{3n&n_Nv##wIlwEinxHF6vJ|08_w1fl2ZQVP*7WRpcfB9$paSD6U9=-+9vb~Y4quHh{xAf0= zlYcawDZgx{#PYye&+nNQyqY_Aj5Y4rb^M2*2Y;a}{0(-X(^TA$oi-|W6dXfqn6}^a z4{!+oNXq#qtl@9f{bh%iFJoOcIt@pCD*5dL`O5Z=2K?+-J$(n>{dF2Q<6x(U z2_3%yAk58GHfzG6a}7ZI*J>{9?J5)eoAJ+7B( zvyGMb)+$9K<6Fr4mo~y9crS1F-QIqe;wcrXR1))slmskwtivMitmv7xS6yvp0BF-I zDMCDA7{FW92-*9>;zfeR8k1j}%!;)_xUD;KSP>tfm7?jJ{`!fgtE44Mx%5i&$X9$< zE$|1&mZpCl0e~PrI~)KcKb$P4BkwoBd%IW=oph7&eYc%QE@eI__f!4dD#B1HEu+a1nIwrAA5u_J z<#PnD2v)~1^69gjcNl&!T- zPxz9Kr8n_r_kXz^jRsvk(@v!pyuX!y-l%QU0?zz=LlV=ap}H7K0;sW-k6UtG>KLMwxcs9VsRKi^YUj5f zDLbs#nu!1rmgPuwK`sWD(pX8XHxTmds)C z5rmc$&jMscZ#5K%#X-TA0^UJflHt;k$@GTcy*%8_Wqo`Mm#TS6c})Z1bg{3#ZVu;C z3FrNV3ov--#lIvML_h9{jvX3s3)Hg|jcUpfl&GE24i=Ff2t`g>F++g?a}C9w-F-E! zT;*@1E9r$8GEQG=tgfn4fDg6#q%|>D&wpgT5IC3o#U!E1 zo)IsVRXswKf5Z#Lt{CATC1%a7&xvvvg z^h1?_RG?2u7_^$?iW{`*c>!m%XhDuvHnjvLXkG}P{N*4OXod2d_j)XPF~h!E0i%~S z!?NCOa$1u54R9y;h%CYN0BlQkT#aezV<9csBWZ0#uw5wz$=k2PPx*E0V}E;- zHtC9$oEg7ypZ`Aaf4@n7I1h=_Vbb4{dPbH}@OHF^1AjNOF1hx5) z`p?`+$k9STz&M(}xWw?1_krE|vtTF8vQ1D!-})cjKgq}1u1a@Zg?=fi^-`*&lh-R< z8unbA<8GCFC*^RvbrZZ=dQOhw|fo=fpPuJSkKxOGw z-Kmmm891tCFI{+SZ|iDktepM^_~ow#y`18J&LGnq(V{HP;o3x{&O8I7^RLJK3jL+c z&?4JDqWstq$VXB&SCPb zVIK5ZMpW3xDg@FGt1!LR{(p4iGaAt9g(O>jx=b2!8ut9%pz*){O=n-&-&P}m8`MG7 z)(E8YxGZft%*U6EgnT2V$z-mM1aox`6?KO zU)TS!$B^MQ`w^4szK1D@wWe1H+B4^g88+RZ6(vhQJ-rD-ODQKlZrj&-#4^K?!oG-n zkt0H5#|89kk)zLHR!;V5ZEbJ1fWK?QLjw!6>dmR_63zp3c?DWH7RE14%nwMXjbEBx zDie-3|B%Wy=9DCtWp(>@}~`l#79y#^gVHggK6rz;*Wb+3?i zV#CRs?CVv|{QmBje-=Iv{JG&-53shQJg>R@cgOzKKm1YX`TEK{r{^6}`U~*R_TzCk z-MXeewW#dmm4EgKbJB|gJa@R5ZENvSi&9;3^u7QF>w(n)B--P=+jH9)_IdvA2IygKYc|N5Ed{ASetQE*XD-_X%lNzSvd>-95jZ41YVCKe$f zCKt#7j##IK3yeh{(#QD2`MtF)IMos>L799ZLIZ5Q}%c5N)C4E5OFsTo2bc(0tlD$yhym^<>dQU~{!bU1LIVU3FhKx8TjB12c_PK(iTom%{}2?kHrEACtVFgqz-I z*R!S&`-0`e?)loez~r^*GLs`Jl!xO8oT3jxPx5H5P=+S;8fGRAge?zV)BPSykdLE( z+bxB_jk7A_icLR%;7hhgEb2C-7_j2&0!r-^b-LE%QzA3Y8(A13U1K}9Ua@$yz}W!C z#}k(_7w34cZKk)aiG*5^V~k4X+`FqSb7G9N_PY1JY5eZBlN!$u4+_HVwoHo^(5g@K zS`Kzs&}(&QndLwvp%%t7by}MR1zavK&VOKd!{&v}Ff9P5h`9tuu3a}9aMRXCy%IY$ z_N2u$a!f!pIL$mF<4j{HyEF9U2hoymL_)Eig&7z*I8v;re=mm!pcsRgp9GqJYI2xV zsrSmWD3yG^WiOT;lJm|)s46c7K;uTOh0N|^^bo&0 zS-(z+FkE1=kENDX)1BJ+PA5EPJwE=}+S&Ww-O$qoTXvb%dIC4{DEL(2^YMppfy#}B z-(%7X9Ls{Z5Wb9FO_9^J=(m@7uu+IGZ-a*P*pF<$yE|9<$CYMBw3nqjiBu&H;H_*7 zMw5Guaki+|9B-D;P8IOH2eF$k8pglB6qtf3PA!%qzZOW7uF7ot4zo`-+JvteP1uP% z^PdOj zs`iz)ZdH}KrR$&>#_aH)5_}hf_ob)vah(OWiUJAexoVC&8)0wv*`86+Jd_U~6V9X@ zp^0r+dm~4CIYFskmls@Gk^kJF}(sLv2;bhSV$uF0=K3{#7IC|YwZZj~QHRW!h`|w-7zZPoV<1a%&RFN&G&=NMD z&uP8~s?HDp@#%kG2cO&-+_!-;=wABE$jO&4bK9X%nDE{$VJ{e`v}kMB8ZBv^;0wK#MFnQVcUIMy z-;u(Y?*R`G6`p{#(ju7^i@dn2(d6IvsC=1A9E%xtyJonhY(LAZq}5o&rz&Lb_tCj@ zI>}xUZ4B|A`}30Js`*w*_}Ld~j@Nz-h&31kP}f#>He1%|(vfWr@dbRxpquwt)@>gD$I(rGU$-SV7z)7~&8CrHY zax>ZS)TYePGO(1op2hnGW%277)c)L13(JD&%uYz{p%BGsZ867Yy=T2H1~c6?o^qyp>wLTR%V}zNkaD=yL5^fO6ITmH8L-omLkIserjrq zmh$#Azx)UQ@B+f0kmwe*WpfvYyz1H^e-E7BTkRI(A{6ReyIGOa(QQmyoAK)J49lUQ3m&(;z*eScuA)c zvQF;Ab>zT(&6Oh*>Zy-?jX%fsGXu+J_1Zex{WbH68((^V22#%MMrgG>-e0!t8ZmSX z`60oP)5$E_eu~9U-C~?WMIrx?3*RJRcI{PgxkZpr&pYQh>)u*K@crmn*x77PZ!NsP zotPiYtD`gjnIXOC$sDjHmcq~{&ASZ$08Y7}Y&G&r zbGbQiP-Ock-j1JIpy`VWFJj?#90w>*+SPM*I^c0BC46KeqgMY$5U7wlx>&28HpQ{R zYCGBtPH1%&FmcCW-HjIl?6$EU9K1>BteHY1Nhm%iI%m7QuBOAuxl)ZT#*%`-)CTq{||-b_>AHWScZ$G3bpP#Uyx<@*<*&S=FrjzT2Y06 zcBjGm(+2D(BKM2C8Jia{2~PS;<8fNZBEx`Q%SRqJznKxQFvwvPZF$+odI5J z>OarCUss*xu`zHO&ypO=BI~DbO0;v}D-jJ7V8Z|-`H85g41EsCvuTuj`B8=D4~EvB!Jf+VZ%8(Ok0@YT3|8SJV6 z5>C}fxq`|~V1*IjE1ildiDQOe_2CZ?5^9dF$?wBb_ow&wCkgT zcit~}!-_=aEjFmJR$xWW%qwISWnKLOGCH$ed`?MuHh$&G){B#$JGBuLg6!%fl>Y?Y%fk;&(SKp&^Q3|e+SRu}oN-u}n zzygf6HvN^TiRxz=Q^w5_T;=`q60FtD#$va$?B|^>M^QX%yhpBhC)$zRT|x{_!p^_A zYt&NBfMDA*BBs(rzboLCnPjhBlg+%&^3uw$*m@T>Z*)T@jk+W$zLD9aLXF9Son6iy zx#BCPunnKl-cBj2qo-ZLDk-_*gE-rqK6_wu-hZq*l8-c`QhZ*WPn_ z1K0Ku@F+?tsp9(VD*(o4u)1?v)=yMG?QP`ur`;nVD&I)}tgGMZvu!!(qo<~+YVvRe z4k}vDt#RK8^dRD3uxQ)_WI)!sA?p?g-LB|Z2177r*FGifOuNemMC|moQM(2cUleV^ zH3_~9erTXrg8o!JB}hB>B|DBlo`ox`k_;dKea6^HS&kDL6bP2$+wRzImT%vCo1(#+(?3(B2u5W8hdN=oc1lEdEg>#Ge-Fwyj$lmWO5$>!P}BJNH4cSOid$Z!x}=B2EW! z)jF&J+`!+vXqHHiK&4kn%=Dn8c?X}e5a{C?6zz1)Dv zny95UM{;>-YkgwWg@;eE+B-~8wV>VXJ*|5-o)aT@fF=wWeVsE?I)Ea%<}`~D#SrYB zno3$W$Ti~|IhQ6L=fJ@`M)RGD#$CjVJ$N)D6UPaJ0>G4H77Z@=E^o6DFIU%?xK$|p z$c^#gFZ5;8FH@L|UHlW#i-C>xa!ln7t&134x@^z6(YYDh$6b>>YhO$D=pQb*^5jYL zcrw+>EM6&4kB_W$QSby1vvP zlOUFj%4fKW=2^&FJO7E>HCf7*9xtI*xz!Pr`@!_uReGM*3rnyxoaShNEwPlUdY&Sq zn4=YDG^sI#gZUMt7{O}`COmtK+DskCZJX&+B%XFH*njabTuy9{j93DJ?tJKr{O zQ9ufKpoc6k6C_ia8jOQbl2z+@CiqsGowNxDt_?A4srgF*uBdQa;=-2wF>T+v@M3Ai8BWJC-Lk)ba{0Ty&8}3j{*3atK3Pz;B1%jU6GF- zcrn4zZ1Zg&t^M`5ahe^sY%3#BLc!9)mzauFArjch1R)=!%XlqB0kcY?&%-^74;YbE^MU`KzVlN*INbqQhNcS4p zKk;XDymVED+@8Ac4J-(E;tsZUwWo_S9Yvc?W^cX;i?RLsA~<6UPdH* z@TB*OjS2e{*JJ^90N~X$dgQAjP#k$M`eOSr6jS>u{tU% zO5f0uCv%iC=1{flmww*r|AYbM3`0*ZMPkz(m zJtgtT4oYieKBHC!^~!TARC)f(LshC9Yqq(Vd`hsfT4Gf=%gB08t|In~Wr@;HFhgf9 z#O7YiOH@@$Sw>6XnuD?9_7J&t*&Wktss4!-zpbx9*!NaZI&7fMjijqpjzp&Lhd=YB znVU>?3;ZY?dqU*CKclDOFc6UHP_?ORQ&`tQ#N1_{;^u`62r$Dd#pkjc4qYG|1v@qx zsh{8xNmw$gh!%jhYdy|jT`*J{eI)8fA$fE_k+BfeW)Za1<645Mo6WSFT1|@gtNJ7g zVVYo~0BQnUzzL#Ghclla+#FRBSUTLAuZ3H0r{(9(vVYOOQO-IOB&=F2xu{zNeaDjE z#Q9|Lr3--vs6O7rKcXTuMPBi_zq9nAlGGl-pp>K0@ojI?0Z+K^5#8LX$IExEfu>fb z(xN8UULxyQ{hs<##x;Z><)*Sv49IFM`>lLINNKG}vt<`{#T{5oOHObTLr&Cp z<}y*6kF}3a-H)Mb4uZB)6bLk*ngqP0heM z(7B?;7-W|Q1$v_Q7N4sxrqf6meyJw%fUD-c=WXikXlXMGv>(OdiHEjQ(dEi!fkuN5 zlP|e(13ajEY`ix7AB(KQgL)6O-sS*g3{2xQtgJ#_>ONShCUYU?nfc4Uu?&^-71(^I z>@#iiO9Deb4f<(e`&{Oxa?k+VrA11$wrRStF~j+mxwM~~)p`2!*-4ky*RF|p77G7N zif9tOd&%Wel4@u7f)RYuQ!^GR%(xogF3YJo@+hVNqk|K~rC{NdON%+1g_0s*A+4R= zA?U~K%~t_?p-eZ4yLB`@mgmgHfz{=N+zzQepDa1tyw$sFo$_hWI+iL*Lq`+$hi=R! zWFE-AGWn$fmnv7&GA0=Nv$S$~NE=1BWm4~KHI7?bT~Pb!P3pwgYo5-@o&Pr2@;{vX z)f45ic}mc$IvZVhq*2)3!_zFEdz@5qdA+PwhkxNTXZz=Y{AuW&5AT6y+G8D35RAyI zYB8*ME@Gjf!BGjSdzW&KhuOKW_?j?eoea0AUg<;GXEls#QnhMWi<~4oC4viv zzz%nYne8TrJ7?R1?CoVZcloB^D_wIS`{qLV$`>R^DtX8dEyQ+G1b$^@wwgeym%YbA6NJvNkSwsSS zn*&G!P>_+o--rtpaid|Pp`oIpVPjyRW8z}t;^JWA;NamC5#Zqy;^W{DkP#3PlaP{< z;@%>^O-6E?h=i2nyAmW6gbXSg78)8B2_6m}$-jJk>i`g9BB!9Hp&$_gkO`4c2$8;Z z0jL2;03@{U=KgjeT0%p|K*q#Ekf{(9Bml}E$jCqF-(~^0C`bTg0u%xO0O=w-8X=D) zTk=y2l7rrN;Fsbj?$^A5J@yxnvwzj+S1iCbum=evZj|;HCAWaFn5aIwNdS~Spbr48 z>FIBbzXHe~8vz932qNP8sfhsVI}AXoNF$(KUYFYF=2^;i=NfniVe<|7a0^2MIMJTT zKW4@i_6$>#7ixr1?w3S`6wL$ltwx*X9Ps%e{rik;?H%i#^i8HRyz!BU>BCz_CA!Hg z^y>GJ95jKQspp{&I+k)@K2Db8GV=k9MYL1_DYPu~sV`CmMJ=gA_M_^Sb_y7f46_vbT#8Iq)>-Prygb{{j zJ4uS@P=+ijikU>F+DOmjWB{x9I&+dNu0RM|CWp=31yH0O)S{aWsqOX{0r1WAQ$N`$ z^Fl*{g<{6``9r`>Ixtihx1rik%VUNYZ2J?EE$3L@?LWE2l@6k^P)>3y35UY z?vI8XqvuC&jxg=-O=;jlk{^+u(em9tR=vNP6rf6CIiPySTz&-c1QLB3xEW2ZrUsUA z&z}O&o3%3)9!|?|8X2ZQ&L}sl5y}X#(CCW*cR@fO#GCP-j*;KI@Y`s?q>U8=P;OTJ z7(A?`Vn1#B<*9LoeII^*yvWv^#eQPYn)LpIEbep9=XZ>lz~5DV2O^>R{H*;3AgWkA zv_Fx5<$rnL|2_|J%VfJSq^F%b0{|q7Y=#t_rULi>RV(pi&s;8FEPaNr`*sh)TOadz!BDMdLTJ(IUl@c048qHMWHY(7;=rLX2hnk_=@3Vw6NH#4$ z^qh$2#CpB*Om-vM*`)oKH20*=G^g(`L~7_!E3adSBj(!MW6^2F&K3${!>JT?WI-Tq zW_m%o2A_XPD*zQ)3_u|J{q`06*ChX+=B6e3o9_LcbN-IumwCHh_-`pXnUKFxhP2bH z{6`e#WAdLZpdmN@kpkc(?vD9M`;CBk%DL?GTkQvc&1m$aM1K8qqXT$Pwr=*@A_G$* z6Z=j^R*;=TtaQIzhRzE=p$UcblV6d@AzDAdY|ZZ_fe9{B^8GbQ6CPS0B-Gd+B(eZt z+7G~U_9^SDCc!#i4P;UzaaCF$1Qv;CvFv+^{p1lpaX9sz3%z4;KrAMZ=tsLG;CBcb z0PssU^R1X(Oey%pnFIZ_c-D%Sie9qE55(?#=MXo`wEJ#9lKiLABbPR#!Y4IY6XP%S z`G-D}?YCUH4|9R1R|{Kgu09Hrf7t8$E`pr;QO@nV2*$vZ57`uwd#WPhM>%g&B(;J4 zxBc87eCGkMB>4O&vC*C)N+hWfyzEK&PfsnCq$o$1iqzQd;?P%nT8JTNsAPSPmQ~-G z@)DnXfM2udF-<_4E1yCAcAkzmb?-&-w-1^2rEw_=y}hfLw0=?hV+3HTH6cU*m?HQh z*@8$%?UNB_aeYVUHK_+-0)CkKX~ttd-|4v;-*bdHr0>2L?UV;e+&{gH2_y@uS^Cj+ zyTlWZ?^Kkdq9)#I2N#BI9f<;t2VpzTWny6|%HK(`=}n~Hc`-#iL;`?^AX>x@lt>IC z`#bHAT?L>LnBwpn{W44e0FJSt?}7kyUsXVVniF;|oh%^R2Z2EPqTBtQfb0H){vAZj z-+z2?fZy#xejQvt8Gq!zjjZ2rzYVK8F3@ktp8zMe+ux!HHyy?P$c4!nmi+^R(r5Qa z3gGW{OvpdC-T%RcW>WMYmES{{zpo(RA1?hH++Wpy;DNhD&&+)O0qsxGM63Wz=^BL} zG=kK7a^0($qVJ_b|CIM1Ad$s#V+b5YqDEZzRJScgesDQEvadEdMjZx<{R5#tMf2X7 z-@2GTWfrdBHq;1o3jVZZ`BEfkL{$8O${^LgwM@CM|XUj_1FCa8C+!y-+EAmROd?XzCP^ zmsUO5^r%(mzaaUyEU0%aAl)G5_`69H*?&v>-&sfOFi?NC7yYj_%e{6VfHp(>T}T}5 z=TQAGE4W>g4M4v7(I8s2^M6_F2O~O1k+_Zc3!Fo7^xJ-X;*39cPPsbyC<^g~9iTOX(&226*G9mxE#`h{(ydbFuW{-Y*fDB!B z+UI{llNbQ)oc69bErBc$dHTot{hv1d2O=kvS|XW%+>n6C z*l6$M6f9caf*Dt{$!0%)gmDyQPWr0hU@3lpT(YXfu5#C9|5IJRGF0*V;7BcCUcJ`l$BV*D23HApHSr#!H)5apvB0Tt~ z^Et8-Ga`EZfB^B)2L%NQ9T7Q4M)@g;2wo$hlMs`V5n>P!-RBjfl~guj;O5~MAg7~$ z8lBDezy}f8#zX|XkF`~zY|8TkX7$43Fc);xJw_?2b|EMV;LGP*`#m$^5FBwoEBism$;91 z6>o}VHPN(!9;vgAhbL;U9)~v%agmzo}- zGP=ILT&n2KUpMIE2^3N(8LalckI!PX zAC^^`Y4KCrQORuR}EbdzY3-vkfmQAmxmLBF_epZ2%kF9+VqToY$1|MXHO zqwA%8FR!A*VdJM%jn8j#;$B-?jlE3%?xhCk?UPq z2JOf%uW1gbpJ#fm-+%hi`+bBuEycqK6+g>(Yi3|CEXKb}Lh#JL9B0N@-KNazv21nl zb?K)j?-)ZaQiAkCf|C3hbx+9Ojvdp9_Ay{HXO*QU9T@ z$);o{>~RK%mLRq`5Bq0sJnFYiX+rK;wfOtTfO-f zvpUC?HrI$Jj$V0>lOMO1yq(J4JZS!UHTLS&U}k07kN0L*{j|c%jwk#dCHj9z`J=>t z#`mAm{;1`Dwnjg09RFWVB*rBFW!^t(O}bg+Q3|`=G1IE8x4y;oa;CNH6IxNTD8)FN zS?sO>f9@!Cp>$ulyS_yomF{6(TJSf3_%XIG>)GVv2QCsl^ z?j)qOJ*#OD4f#n>YaTPrpuB*eDVD&3SC(~!x}(jBF(J_fzb-xn=~=M`IGm9V7D+rlCP`2gu4o}>2&H53AS8Qd!@B!A1nxq zUkRbKKz$?kxH1FExx~`-b|)YOUfY>Vathc&+>r z!X=FTqbzE<*~L!+STQf_R$kzY zvBaOiA2-MSvLs>ABOPV&p=fgFa%<;?cX}_!Z4OIsGz#K8s=LK;sG($eNFXQuCINQ4 zsX2G^o_&L7OSqvmffTe5za%MQf$I&FT|3_O8vy&db(cP3>e)#}qCaQAmCToKfElk+ zg*RrhZ)Bz{@n({Ol1?J7rrlE8WiJ!L-l$wYq>yvpNm_*9f`C19uvwjMao26391k9u}*)HSF;)%E;psB1gK$V2ob$R6--vA$Cz5#k? zfs|7J-3ecnlW>gX-;wN6?zRU^P%$!mN%gqfA+u^qN;h?R>336UdgM7p1Zq%UjZL9y=F6KcV%G?rJ>SEL*|qonIpKM2d-2 zbf_g|3v@C*VS#0tA@pw>(sLfuCu}QmtM%7Bzh!wqI8p{-+cVv{9sEAysDebid+?LS z=oh9@yJZc<$h-{s+zGFlx5V!8cL2FKEMu{+9KBR*)(~1ao1P;2K%2}?PCSpB zc5XG`w$~q#k|8^^yFFT?V%@4yTgIg^S~Vs04d5^NvE1U$dEvFe`}OnCLTS|(ueB@U zYtR+8Q-z-05VB5c3oD+=OtGeAkg7{|-~CdcU$VfMD9x)PII_m-66uGh^ho+KEp&fu zP~+53`U!mSOS07*rCluk9;O?Jcu%{;Rvm~L@pvMBOfg{dbAxlKw8AsF)F6|@QQId_YL6>avsj1LRK|&;^iC7E z()kgWGeLa6?2Yf)=4YC(FKN;~AK%hmC#nXHpW?UPdL)OBr7l{yk8FV*|iJ!}hzp{VD2YD_C zul>mUp1t4UmT7 zHl@JzPHHnb$unt6&|~=zdHInp3gEBm7pMwCrr%j!d3ynCf+sYw%O#uCC4kMr*lZqm zgSZuQ3pDEA?`3x6ehTKR^_b&PtE7m%V=at_bS5kNsBcBSgWKqE9&jYl_9nb2Elz^|Iwg92xgxHjTLb%)LA!cuh0J%j3DAYe0f+pRYs+2xjsx2d{ z5*nYrCt7;C_u;S^->=YH@kz=nx#<6bU>n3@(LVv&a$o4sWV}$Gs>29 zRh$QIz89vg7$Rurp=^^NT?cxC*Y7d%nUy5hwRpp(fs7qy8iN2C(!-1bKJ}0Z7Q` zNXUpl4+`4PfDsZ3GAaqF3WSh|4vm1A`zgJcI4z&ieF-NXM+1ekpBmm@BUmI`9umhy0N$-z){lAaE#z!dF`=>AFvuXgI2S6v#$f21bN zC)*t3{lvSk!@FOzZRRY!f8bq)Xe{eY!p&jz^>~@LD?80R`28v5ugd>%A58tQpd9f? z4CldpSzVTaN)K0x=CaIJTH&aocf19Six>=6Ay;ji9UgcxtpqQF2k{CgA%zg5P~ExL z8xYcqTUgg0Ma@^*X0A3tF6tqK1S=s4T7gtrcfQi!4bXF-kxy0+pbaGb!c3j>Ie|%M zbD5!|?fI>l7kd{*hKDYdZAV3Vp)@AU3{msauH8E&606G0m>yvh=$anJWZPoY0juC6g@H!J# za$*oS6(`T~ONtMVO1`|~M9xedzq#Y`obD6;E4-BfzbGzz(Ov1))z8OAYkj?;&aQXT ze_X+B0M?IcYQzabAs^_2UrC=HEuBg>V_{#OJ55U-GQYcX$6H)=AZqM=5)I4uNstq9 zq#Fqp>H7)uUjp3##QAPw5*1`3I&M?~aWSK(wDi0XC!b&EKjdHLzfVexLVY**3llri zN+S3Z`!BA@6(?ILJjF36iBg zVH-bM+}F#@%6O>2zFdg^*z0j^iDG1%()*_80kg*&bt~qb-Urc$`jvhI+_pZ61p)s(H}luN8=|*X>${l2U4p1Pm+&250_4{m~QO044~}Sf1SDy(ItcBoE7}1d}%D?U#@&ugVB^ zgH_ei{Ed}?I&7y;;8%we?2yvJcCDOE@5C(W?G~rYy`b3E6lRL;O1AW3=eVxVI*=-- z*YRIGl-3GIJ-z`*F2AIgO0<+h(zn6l;HfAZYIUako#U*5V@35@lH-=`r7r8>F~R}{ zd70!0Zb}or|HrGwwX4Uy4ce8nDtk13+l%qkXBkg4O)G-5!5@~kPRbIl-}?#?XhuDY zVAyvdc+%oM8-_~oWHZW&VHT6t7ja|5MQ(~AK~WCx+xJ!5RhQ1#cbP*o!Bew!d%OFZ z*CvQbLV*CWQ$j((Lj3jw1q}lY3Gt;RVzNLbB;w&iBc|hyiOb0yr59ImA|MenevMAc zaGzHK;#}RXY~)J{d{(p1Z({n?B{o}9HM-*y{Fg7u&_$6i#?LPqvTjw}WGyq##GJR* z8R}(;&duC8^Ll>#4L~R|7&Ww8avoR6PzMar*2FPfu(j@ZoVU8|0By2lzEjIHy^B<; za@PL!`RuFV7I;T-4Qf-WIWLB)bi1t?3FrFA8-bl-H33g!G-CNO4kF(KKPx;Je`rbp zH3a4pgjB{DyM@wEiZ{DU69g6UZh%TX$22UfPqd_h=QD`03dYkzbkt$Zm!W6_V$p%y z7H^ELz;G!2K86}A5{OND)h}O0D^^FDGH%GC-!%mE>wQJZ^wZPHY`596+B1s}N+&$FRm~kF6u`aexX-8G!%;Mw+ zcAKG|tg@+J>jp{&w!p%ATS}J;XUgU$nXIkGMsQ(6kxB1w0GsK$8g#GqnTk>ys8M4b z6fc5NYQv{KU9L#f9X)UCTC__E3f?E^IR77Z(Vkw1CcK{{SufrAsCa4PUx zT~ZZ~vVKcqYz-}5p06;lzN5Q5Ix+E5)>S7O>LZUPa!3Ih)g+buK(0)A}M02*5Dw2a4QjLa>XD^Nu_$nUs-q zIm)|cCzRQdrj#jDWrB36-)o6T$td;J4CM^2gvfVHoO0^l^}q#+T*}W*q-!a-bx6cV ztGgBIu~Z#7B4w|S<1swGBW{sUj~^=Iu9(9CZ|W#vwo_CBKMcaLXSGs>$H^wTK2Mxg zbMxGZ;h0rc5!i};qtlJ%;(=p7$hQ(Q8DB<3$LfAE3#kYw!*18svBR^e2!?eQxr=a? zRAJWMI zD4q)YUJI;|UxySWoUut`l&v$C(Sfd7yzH2eUpVfNo)H>WA1AWi23B`eAkM#Hr@$+& zDx`YO9MBjFpR6rhp<#CR&>ia6cCi?-&eIOTEsoQ|yOX+`>;JqyukiZipgBj2_)yse ztj-%S`AXP}_2{~l{V+TvacxAc$zn&Ij`E{fsp8PnFRH21DSev-8W8W}xq1!;%Wd2> z^%Jx8IS%i_frS49q)?`~0i6#jcP2N5)ntDC#5X2KbI5 zU!O_@pqbu##LF@8`BM5=eN>0}Br5hR8-zGs)~v^7H(%aN!I3nnPbHx^B82G$D2j#Y(xXTXMlkV-I+wYOyH$ z6Y|Q;K2!A$BvAl^c$<#dYcL$e4#ItoEXEw<9>cPnkVRCuT+wD6cOQ)CD%PosL3jui zO2c-5P16xjxkIhpC9qMRZ=NKU0^#cmjulHGH$ZZU_^{3xEas_9N5sYamIN zQ6;Ak8I;%$6&mJ>x%&Nyp)MznT{M`rDTFBmtdm$S72y6c+2gjOo8M{>zoYgJjcl34ih_FYPs zuF&ZO%c}U|TUulx1U4!{wuKC*!+`WzwU6oBeMW?O z(=dK}ZmvN;2z*N}*b}BAvry=~IZq7l?<-%OnY6R?<73t0udxwkxmrjs{ssW=oy(h* z)pvs3vE%Gh>eD83EUPMCj~;{v?@Xp_mX*wnVSfX>fa+(_@<|;s9tx@M(MQOO-p`JY zpnMH?!#uwm5|aVW)REPELFPlqmZG7;m6Sha&sosRr<^YY!8q0SajW1#txb7s&f3YA zL}~3(6Jw?>)6B4z-egV`ENN|63M&PPb8Z$C#eM^z(G(7!Ke!S61{feNv6jZDNnjQ1 z0Q)?q*D+dJf?WsQrnu4m`SXo~s5lCGBijD* z?vyn85T|#UL!K_X`DRW)_-$Ui<`jQE7HmKf(7kI~)RmWZSIsk0HC*76YRztJzD9AC zi@SubISe-IN{8&@Da>}B^0k*~-gX8OD}W*!=hWw9BR>%a%x747obyOre$t+E-7n#R zCu_-_o24}NO0#0MyAsVJg!dk$+#GN%Sl7)85`Q8(imbD-Fld6#3a56B!(t(YS&EMJ zE&$j45Nm-iH9lFQ#0_x7iVPRu3tWSarWsdD737cESribaJB+Ba$wb@G>&VkFX)7_R zVrwo@T0OqT{Mz^Qlk@~KB>zf^12hmAy2n-rY3U0uXvrQ@yIQFz6xfQht}TIyII+aO zt7Xfshh!jOe4;p=d9*F?ETXYs{K;$9`#{_pFJ&7$tDJ+Q)6QpjHD1QeK8GJ6Nrhc; z1=NPcQP5%tXGyn`S1P=kD;7SQ?8rBp=4z#^6d>+j%`t7AzXkT<@)YLTYng8_?^CrX ztWjzv2?&!_&cSGr%1t%%WAmNk*NKRBJ?$E=HW?#UB-a;L*=0Gsd`mF4X;yp^0ojgZ zwV`A!%X(ELS!^_cUGGm$qMY!;e=?fJD=rgx*r~3#j_}hAJ!R6@mv}Yy57M;7L3{j^ z#tH)ujM)SdARv_k;5K3dqjW&LN!uOYU(UKu%=Ha$EmeDuTWuhePhy-TYpdMYCMgMz z)oQ57*Cp!M_5F#lNsU^8&FDcztJBs_0AsDbEt`;HvV)Fx%NS;J4Eoc$>!rFBwhGt_ z!V-dQ$T*8YbnJ4dvR5CI?;Wo`hq=HC)W&@1D{J&XD%C-^ITDFE6$zjH5@TokfqXfx z`Vp7eql3Ws6caVL?;Kj~8NDau)IB%VYJN&+u6oy;JyeLZs-zSQAuqX<1G{m8y8dtj&WtXt0VxvHRPh z@f9u!tYi}=g>Q$fwGt#!Azs=76siuz*s>E~Kdn@2qIS+9Al(wlOVjJyl2#-VXwkxp zk8%Y2Uh>&Q&c-POQgg^<<%`=JJCqycZVo5BEj!9%ExzCdD{O_fqa zD!ghuEL=mo^brgZZA^u2``_?$=W2RCC@?ddsRxugO1*len!= z;^`{mpuSfymHJd$4eL?e!?}XMdLcoRDsx6XZ5L$ed}X#wg5svS8EYUOa{l{r@Z69N zYsnb6v#CbR$y%cKN_0cAqGgO&HD`#`1x-uI6=M%qkxBFZ3b@X=98)tnV zg$=}R(Kd?e(Ajy9TuPFbQ_^ilw!2S<&1RhT1MTrYSri@@_Fx|- z%Z-(46jHEbQjd=k)t)11Lz!XO@gzW&=U1l8=2A>q7dD6Vd8cz&8Fk0Q+{u+*ZwgPj zqYu+E60>%{0TjSWTv_3=viS>)Ye-eE4j5U%taxFD$(xUjH$gEP=_Gt#PJ3Q5H*JeQ zP=l8}6rE~DEzqn#VinNLP=e0olZ)^s!WB&)kHHsW6`mefXWfo9zabjAlluJn9lT5PiLCTvnqe{ zp6bzqZ-7}GrjX<()=5h9!nhQm=zPuq!ZgkK`=eH*6?$}AFUv-5>Y~*8ar<)Z>nOR5 zv3C9T?$5EwC_yHzkL{r1B4&7mkJw_=$#x$ob@4^PfrkuUM{e(Xe7sLWoO|DCqa5mQ zQt&=z3#78+dW%Uaq_n*uIbip8CA2269qMWH&|-|E+1h>=)isbX4*g{n1vc_UiARr| zLtWLI$JKG(bl(8nuWxv1a!nwL`ZnebzVXX3r^N~cgFD;3DQHMGPL9f&?~pDe%B*Cp z``sl(*$o1nBOM=hwlgc{=AYW-GZ}NP_Q0jpk_cwOo?U{I@($X(oH#=@ger@Y3Zfqz z`y17$+|jUErzCF`sJ~DDpj`S`d}0+ND(BvyrOpc+M!RUvTV7Ih)sXmt;bhg`;l83x zy11EX<9j4c0?RJp=S3I;Bk9@jEG|ZAYkM#mky6Lqgcs_C5amh+d{K^uk51Orn!$WD z0AXws>-e{$mnEUF;{mKIB(X?(oY>vsXEc|?sfYkpuXQoBW!hRJ(Cqa^umvcAQvtCX z`1<}NFLE#>OjbRKD@aj^@_Gt;M{-HW7L zX^CPM=lA}%^zF~wiN=3-&qOKax-Fpe%;@ZC?-mOju_Xu+kav1sG?;p7B(PE&y?=xIHV!Si`E3R5Oced>$P zozZ)a5<&ia<~Q)>*JbLT%+*hPF{&QLIooE0Rf=S_-fZ|c!pG-A_`z}6!C$Rosj_6x zg!b-E7%kA~8D$T7biAKWB5T}=984d*d&zJbc-Op;Le74guHSkLZ*{O>J*;ey<*>98 z*6`Ef$pmT%PQF<7iq>_J=-4(FZB1*+CAtJH%rEp*sy4L>-rOU_zWp6V@g2(c57+pC z*1juZQyS$4PkrM#h^(R9T=tyJaWe&N4-L&N+HW)3RZq6?gGbpTRVjgN6QWmrw{KU+6jn(dcZL{i%$ zAc6OjrpuNX_i!|?6al8~Nz3GfIhJE_J0RBC=i(-vQH?R`=&Cj!(wVFo75U1MJ3zqB zt~sL`Hdu2SP|C+l1TNp6Ln)U+e~FH9S7F03;{P*Z4#K0ha|{|pG~(l##cN!9^kS?U zLz=Yt8`bz!t8)W+bX5&tYRizt@lkZ~v3b7GEjIN6b z+AZaL73{i2Qb-wlM>O8}7HJr$w5eADg1!6Vxo0;WBy89QTzuIX|AuSH`F%JqN6G`}2pP#rWI=pLw}t-8jj^2kNg_G6 z`qic90%&%@89LBRuZE5M;{4e&2|GGj)ep1J1k!9Il$v=0;^ptG(062!u;qj&`}c|X zbQaaCMIdJxs#0`Y33qN=CX1C053|CewzB;#lcjdLg%lsNv40_y0@uWRv6E4>kkNql z>`WksOf8bB9>*zql`e>U`f?sOyrxYq`L^*55*(&3$YNd3gS%RmI-eNhByKN94`rpb zp}{;?;J?n|>t}NIO7tt=)U=2{I+c;{W$lX#e~aTjmFX~Gr4-?9b#Bn6>DGDJhgZ^` z7xZ9$g@Qo7-(16z!fZM@#%|8;hKT=tpX&#n?OM)ZG(ibIDF2AMf)3qz_&{cbvsd_T zoLR~AsA0vg??1j;;lax#Xu)Lub4m@wcX~H0VEs`xQgJ0r+X?H8iZH_C)9tUcF|*W5 zo00FPzII&#T!S*0OH7$OLtW+dBucF zH?*kia!}4&^IWN#RzS=ZL)!G#aAtMjXCI`yL;2R%YLpmSp*08d$02wtQ<+ zL4j;tYNB)<(ycYrVjJrWeEJXeOt1;u+9&X!2r4fHl{y-yD2<^uer`FigZ3M9hDEI8 zB=vl1N*4mpTUU`L7Upi0MC0Y`D@5m_%zU2`htXPj@<&;bnHRHQ<1KLF6puazv58y} zRdbRYg?>pQjT`qZbiYn%rKCU$Rc6_Q zuV?wZ_xB-jU|a5!!kbYV8}D7hlR~4YIw4fA;%SCm#daDSwqRh|c~^6^wc6EjNRR|cIS2|mlZfrCPt35U z^%cSR>`{<@;wZFVE@EoGCoDauyt35MTR%?M~C5a zsTRV<3ToHmksA$Wx=>D4d4ZK$_?OtKg#H}95e2^IU0r$i=;G;MC8N^0k8`cLP+JAY zZYuo1Xv9UyPUk84Z{Y+Q`GIBdOai8Bdnngwao}YO`wCf$8OHg|Zx$3qCxp5g_hej{ zHjZ0Sm zIR~{p(MnEbeAGY%2JDRze^O+`c3(OIQ`*IpR26(ituo7oYL`lt=F@BABUer}TkMI^1+P@Y~sr4^a^?6}z))SfxAeeC%9{P|_6ENpg@DQQevQ>I)L zyXzCUyr8(|Wkpx>T&{g%c4a=JPQ<5qq*a~aVtV*?!H~;-5U-;EY{ZRn{9(uJu-AjK z`Mm;XR_j}&toqq`)_0d5(}UPcV$I75^*yA(x))N{^maw5R)YA!R*Zv7&?Q?f+6a2G zRk@_369Fb(&IwzHDJe*d;zzKB=jeZ=zi3d(x0lq`lU8Dee3m-tOU5 zk+ov6)Y_0E4gg4l?%p4jDEIEX5~LMW<6tGh_RWtb(ol?VAFQlbhgRNp?efaiu-+Tt z6O&Md+N!V$@@X&;Wuw6o0C5Jp_u-SJ;`G_5mpQPSH5f6JCXhWtM<#O!m1p@FSVL^v zcpDr8Wd)%rpPmJs?{mSUvsu-WF%>I|Aa6cg%_9yy+#^7oj6%XdoQpz6ocTnYc|e?c zAf)3KS21>q*?--BKyW{&npRBN=;`RE=()GC zB{lSqCC)O9NSlih)mT#W#%D4NkK5tW`3B&$2*?rj-UyquQ*6uodef?H$RIbTEyCY^ zD%Phlc7oB|&yJ5TO|fToJ0u}Uph`^swB^b+U_M0I=U=(>)jT+ zg|Y}a%Gf}HoPlM5k1D11QjHHjaYRq(N{q%V17n(I9uf@L_}7CQJ#y8k9Y)DYBqS9j zw$wtxoaD7%!9Y~@I#qYEgw-rnjfDyeP#0A<_hon#@)MieJF|~T4hRI-O6W}Mcj(G% z4!G~?W?*c04NO$uqhRc{D0fm$AeddzRZqyisD7^*`Y9Mvd;7}(xprqx4A$18P~l95 z<9x-Zen6c>q2lLOQzdJahY7vqrUZW4rASCTlI+lOIl)B#7zGDwSAsK>jV4u>LD^#y z2F0bc*ov6h1eS3jBF5{SWr*$>gn4@N7Vbk;1{*a}js0S|&~$i`)J2gt$CCMUoGl5j ze`X`3K%bGAGm@w%K0#xRQE=2~$0m*4g`Q*{ZSz=qBViJYqhBFDdmryE+~hTXbn4|( zAfTBN@Gg?ReST z>X_JzL+8Ocw;!88u$pMo9pL#B3?lggNnJtnai>@dRKZB_XFO@8?46ht=`vlt5|xKQ z5O}MVh=@b)Txn|i+M^~&PmR@{T&_pmiVk39tviOC2{kkasna2Ij>txbWEagrUO%=7 z!Uz~q$`PEHDl$_fZrN6?i3fpr@72|9x@()Jp!v6K}was_-;(@Ny5 z6Lfk>Tart-JHdHF2^>U@k`F=yM;e2oOJF(bcxW3jyO(#F0*vxO@O?;?aj#ZT=E%3wE|TS2G7rw+4+R_^Ci z3@^Ps+J)AD>*|HD24hJHlnX*;p*Uk3VWaOVbkpRfU`BQ}Qtv!adCU%7^lO&$Gdc!i zAkAU-`-xNnC1l9CN&^#^mXrNgg56O0aV6v|Vr$m-CCXvIN*zuKhcJ}X&hv+-M2jb~ zOk6O`7}j=Oi5Z6d<>h$g&2^2CnaFBPt&s5+}9uoB3z*+c*Ifa#ru4ORU3AyW?> z*D!1(cY_#~)>my)r4VkVRfT(?eNJ2%JPs30mVM$}cSxLDaz@uHaG|QsCe1_a#IV*9 zChCfEkh5T{zaaCi60WoZ<*Ze4Jfq6zz>AB6T94c=AkXgo7xj~N3X#mO=v5UX@T$kv z9RfiPtVC)c30VnlO9c$31{!3>ops}e>@N=Tg$kw$c8|3RGH)csb+EJ>NdaHNqdK`cAmmYy#scT^^@|jb zepo+{t~uvxmHwpLGnSD_{3K?Lih4bkm-swm&MC#rCiH%T&ffA9igZ;Po%$IcddT5^ z@^$sZ(KROIoUu^9@${y0kdIvIoR+}sMFnCeWmU1D3}mY0&`Oe`L~^!;lE?)_I1)_5 z;c2erHPe~&l*JJ#*a4*zDHPDr54!cW=UBL<3J-|ZCMGARE6O*EVjV-50|j19419DU zn8a7UM@lW_lEJ#swZe{C4ofhY{8FA)bmJIC5ffb~+0yD`@1q-lgCs+#nmD8{sQt7i z1s$%ejK`)DPRhyLtZRS$D!7%+xz>h+pRJx$iS+?CQH9i7dy*8WWO>C$S@!_i9Y5!Q z>elI%`bK>Fd!hHiIw7x}nMeX8t9XH|{IbMq3@qSDhA%SjQdMRpM6MadFseA@!pqV>MYwI{ESM)9}lSM~h7L>;EL(B)GQ> zpYu2TSvoEqI=j%BOZ_*d2rE~E#OHnGP5(TlpHl4>WBh~O{(b*{k6B}Si}=>xbLKWo zDp^7{BGIX98-G;R_3V*UtkX-9F)?PF1d-09rgWf2y{xQcM5@9ojGo|-2hI_xutW&iyK)1Q7!>J^j#Gslu0z}r$0-#j2 z9VdedFH~RvM~?9a8F392V&I%ClvCCt%n9XbtaK^Axwb9^*7JJ=Yn*#%<7U;&tJnqI zoLdP`(`6GY6xD~Qt&zPhA4$L9dDk2D<`h+L1TWduQcQAv$(zNhM>c7RxFH zi--JKZaFv}&(OoZP8bOJlxQ`e7o!$OUEY@66@>k1X{^LubkEa)mxx3Hit#M9H8Rj_&lFTMs=IQDa={w61%wL!ymU z(U>}RD222!(0aG%!e-K+C4&^5D76}%UR z%atJwpoggA?JsgDEWI7`bjM1T)UUNuyofejX!>aKfyWoRU3JfR&-r$?u6?p@#;qLfvg3hoNQ0C?=yGN9sK_eUQvEBXHp;;?U!+FtsXhk#|FWEtkBu zbYrSbb?E+%w$2oI`Y5YblAy0iy;!p&*ZDc&Al{R3$%Yb?vK4;5(byJtJ#$x+`@Vsy z^jT`vnVcbr-$TnV`h~~iaI?NGK75yfhWosLjmI^>K2c4UO)>PAZmqf&DHSj1&Bizq)W@JBFs>n95NJ5X8lIjZhVe?Zy|^m2oGpLhnI28b2xY zxm@S@r6ClMeyIn|8IV;VaY#zV>Ex4L!@s1P$ci*plm;Kf=Q8Xo<;N;*aP$!rl(cS! zF4=~9DRh#%bH3I!Wg%xPD~f(A-(1#){mD>Kb-(J>aR5{Oq{3j>eDE-ldXljq-mO4a zLPt#gFX)bv=&sZscm#ln)Vx}vwBpsCA``3&o>tuK z2%9^vIZ-j`@ZRPYGpOR=DFnMrN6H%H@Xb2(chkz^MC<4X5}L*Hl?0n?)bUkPoN5a` zveUAVH{{Y4b%Rs`6pQooE2``4swxX0`F=atxia%yK;1#-A&8YvGY)2XFzehMPzqw zk0O^6?p6r}xst=X3n}#0b*!W$7d5H$s;b(3XZMSsbs2T1q5aQ5f zx$u5wtbD~mK$7-0DuI|Udc7KneJ9+cWiIieMtF)7GOEk(Ftul=v+>j*0uO~)dFnbu zea2c%zGjm~y5vShex_n8B-4xY*w^>aUUsr@IIkEJ#BqIY)BYeSa(riLePyqo!1VP&WgC0G44(EL5+h*>ggZW?uMV!Z%UU$fEm<5f92DOOoh_+2<5)h;?Co)#RXK|zl7L|>-%5Dt)YGvvNGrD{|U>nDnfXlRuJ6r&z#cw_3)RiD#J%& zAqtu4aEEzPGT88G=;bY^v(^9n{B;>HZ8@KCt`+Aq`88MgK3E)REroiULY{)`%imGa<+@k zdKtdAbC-moIgpZuG27$!b#@z~bRF`YCB%&iF5tfQs%%vB(Pxl^ z76XW-A)|EB2>KRdmWT35AUDRqzoiwRdn(e>ldvRUV{%H1BMO|;{EG&`Ab#yHf_?|P zJcUvDl&SL4q?5ygh46QHb0!WA!i0WjQVB)0q&C@x(|57V8nxkf*fY4iD7fhQ(`f_h z35B=q{9%Rbdjg~kxMdMMpF|b*QU)zh*U_!STpmJ9Llw+Na*Q85OR4CwZh%8-CZH|Z zC}lqsN2o7J8;W>Te*RL3EJ~b0O&gML>~vX7Haizs5{_Tp{h{+XJBu2h9TfwKgz*9A zmsGd$dX)&StA9}YjdhdI`g&e6O68~bkKPLUXdQnB@tq34f9X5^cE85@S)+bQ{q`f# z?2dP>y6fe8wv9dflhn4Ff+J~Nrg1Vif?x^w)TvK>u~W|4+r2-7ZszUF1oxt2bObcH zxuY`m+NmVQHZ!bF>#p};WcXy|1;>sfpmu1o4-6UCP37yT&yFzg)1PR?AgN@>vgeiz zKt~&R@l@S(t+Yg$9((I>)JXQUd3^?bPd+!A?wPoDc+$XI^qTP74NHg`jC&eKkCDn4 zLgNXHW2?Aks}l>UG;&oZ9@J5_&Pl(?FK*<&W3C9|H-#csi(#qt9J_}@&^J-7A22%aYW&f4sP5!Iy>2WfI2DhE|A$&K0KEDMndbGk}ppgJoFVT z`u+G()lFdfKlyI-(T&3`PEP0{K=Zuwec(aesmB@Gi)$Al4)N zWjN2OL}or~ca$(^5jk6ppgiMJACx2fRzf_nb!M$$g==c~#hhW7;O7)FX(+HVb*bD3 z1!d~PM0034N;0PFytJMCYf#83*n)MgIcSYC^2DI)k|chXSjh_q<0z9QYP*qZALbZmz7<5m`p z;K#P~J7IxU6^PWEl??Zpj2hF4A2-9|)WYOwSxUQ4BVU(5=j$KAyCyU#fKh>yD06zO z;_dN+XIB_A zKXG|V=fr)KMa76^53tW~#;lT;vb~+IW>laf4$QT3x)%FfQu9VeQM|AWIzB44hRwaO9%B=aL>tsP!au55dEYP|0cQf z^l^Zu1aSLT`TX~ zN%hzZ1k-(k{|s87 zJJgJC{Y5CJYv)KY0Bz9k$s@*~p2waW_h0dAWhQJsJ^SWAJ&zSZ`~~di{Ko-8`HC*{ zYax6?{L%iU7=D2T2m0KlKB8iJ5X=7J*U;RPUS4mt(7!{wN9&=Sxp{A;6!I`#pTj*V~EC`~5#5_d7OFfgbAo0p=5bha4s7+hs_9 zkDN3j(367TC;?i3ha7DH@Qwz|0?)JdcXB6<2z0L?k-tw)6d3&eJ~?3G2*?vC>%W`3 zuP-m>6V1PqJAlwP^S6Zg9qT{jeh|gKkubq7aWV~Y(ugsGzh>%tPGe9n2t0q)6QQC8 zUeK_zR2AyJ1OMQ-ux3*FiO}LG%eZu>J)Sm(7n4H)fl=UcxmhK(iWockS1UWkW&;WkJD0wzfW`R?>H^yBcfK!lFf3yqnR;b^2FV#R z14n&@i1P!%{$2hF9Rt#waY>W1=1~4LD1PH=oWPT?kYZ{*54i)pOe|f_m60%cVUFcEO2^j&53`g> z_m75`u{XUiN$_MnBwnV_#>vVTGR164PqN&{Mp5YTHrol^ucUV5&8(WpA;2k+79Wi@ zviGU`g~@Y$aDQe#g922C&1ED?>9m;#HDqg`ab=07|0g{b``o63@iYdV3|r#I$k#ZX zKZC?&5`5iUQ(<=nM=iA9Z3typ)RyhLJ{+l?`%lm}Nl>h~6MY69MJgE{rz}VB^AwHV znP_J42UesV{b5Uh#B20Wm<17|h6f^9Va5~v z{LEqdY1HSP@Dq!(qjLd7?lcIn7SCya*Ki`nEwfnPY))o)OA#yez0|Q}7@@)0K~i#wh&AG?@~@BJm_oFk4dnY*4ymi6tJ$Bj&M7wcSPW&)uOlh+RWO zr4_>&pcJFRWLSfv4Z{&TRs1qo0IMm$1B@1ka9_2C!{HjoI{5=9LvTclI8_`em8(0m zW2!pFKYST1&h_Pf87wZ|dv?Abjb$fA2UcHhbMa56aKg>~rjwGhu9>}^1dcZc3h|us zJ@SS_%JR6*naL%rm8PS?XZ1d6mn(&(kMxCtf}-Vg_oXB5iSnYBN?C9%@A9Ttpk2+x zmJ}bmujzDojf>2%TsWbBV-$84Zu>gH)^szzL2>Tdzma9O8QWyBrJZid<951s$|rvs*}{?j z85AsW;l9d?_FDdbhuu&YmgszyI4ab-X8GyiW!lKPOcNpR=tG&4)n#kdF_kMK9+KGc zz~y_LEK|AZ;wP2cd;2%=Pkig1sB2CZDrN|}to;kDf$nGdK^Acju#M4L*3C%xhYCr9Ql?j>>V^%{FYm2yGW9;t>E6>Al>Fk7o zik}`oOfr_*7*E>R>4cQWz}PvVFOj=ge#J6F>?NHrO6KBRP!3LtY)&z*Oi;1mr%Mh; zn>J^tm6LhbPl5doH%b4(#UWJck>IvIU z{p6buJKJo&nL=bw&pFxR7^fW^hhGMU~Vn3)*c(>s)g~h2Thl>;9WODH^ zUY}f@*m%kkA>N@ zn8TRrnfin8dvLhvjpU9W;S%Iq!9V%GCGZ{Pj~x9^bCAux68kNP#g6Yg^xp>l#16GK zwr+bQ??Dkn2-N1CW6csh`^j+3^%NpUJ!L%^ZBXmnW=L|`r^dhV?RJw-aD~ZJYlx>; z`@7@=-wBd-q+*Y@*!=u7qa=;Y_R8+E^;4v?JpQCfg7KHYzLM}h5-+f&9+#YFoj52V zP^@dSSB_v_XMuT^(aN5n@lMZj@D-;XBV`8lj%$LJg0Y_(`8$fMa$R!E+Q+No#_F>= z6{c?n*3ODbpfF97Q=1Olv42{|G@$WVTq(5qM3EhrmCJR4hE9)*y^4XgSqoJ8Jb0FC z|2n3G*q}K+Ze8$7S<0s*W&3zHbk;#f*)6TvQgsrz@(nO$S3NxS}Kf#@U(&20O4Bj5^%(@@Bt} z>v|M|foab$($FVRwXvzSLh#}+GqKT=djkn}16TMqsjK<&!0)vvH3#iYji$OMr90~0 zw6j|^c&C^mK|ctfPExK(Q1G;vi%Nrg6QY*P5+ z@QLsmreQE>Qld9t*d5J-v|~O~rmUSpu=E}pnoXsaSPL?do^5&L#D)yp4`j zE=jENPMY8C&!AbV>*gc&dP%)CNt^-RvQ!pQ8I-207|pXP261^?*E8^L#1WSfQoRVg$OFqlDDQLkYiBu$mQ8 zLh?8l=8~1zHaT~D$wHh@Q4c9B#f6470)13Tiy_r&uV9>~M@od=rcAEZQkzkmxMV(X z`T^MPA+zX`kq4nmf|YfwMZRP)%jNYqRJPsb3g)4UE$dy3tFK=(I6|o-ojlc3F$~jla?Bld&ZNEJjuH^^`>dMk6P7_0KO^+hj68ufYQonLc_%m zzvw|Tx#SFAH##pud41W74ij8usXfn7`SKpp7Ng79t_KMt4WuNlR!<(ioRc94w*F{W z6A|(>V!0wLdw})cA_O?2XN$z8)2kE{jb%h4$i5a&WLrI1QVM`(KOBNva)Si>l7foY*<6~4)Nt=3VA`mcwqjBhc6TjrtB*BGTq2Ld&o3r~@WSA0 z);X@_<&5gUNcl4gpcxXd`WM8tDVE@S3kZ}DV}*=*tguAXu_3vB$Cw1FTq11+w*5MB zJ#;$Lme?zh$nCBeR#hYu;HpO55T<}WxsKbszLOl=pFw$iKA5@k?z`fgW=`P5Vis*^ zq_}SJJjS9jqKnbGbj@OMHnW6(`c*sZ(?(||BR?&18fBUWIfJZW6DV>Hs@JlZm9Lblo}Qn8kJ~PLAEADVR#DXMGv`ncre_&Poc6*HaR;w zA4U|1^Ycj4S2Rp8BaMhs476rlVQudMYgZI{ajR&F5UdIv?wf- zl;vORatL+hrBPYihLr?O9bQW!^ys1))i_MmcvE&hqcCnwL|cg>Onw(DHag>&<;E#V z8q4AE@hol0hSD-C1S``e2?ecr5(96VY1WE-N-gk<$QRjuJR74Nv%qDrO8H` z?2zUYZ};m@=<|vjI=Qd9TI$|c0Kx3p*RvYgT6!mLpBTgWOD(oAvLb>E@%hM@;nxCb zqZa27q_3A@;^`9YM%Ap1jfAUCT26{2`pMD0=^zK;%&HbJPe5eG|Z!*5%W2i1~IdemXz{IHO^sexhOnA z<78~r866W*c;S)7ud10P=GCC(wc3k z#nI^5w@6lN#aTI>FgpClP)1T}GOXhQQh2omd*iWd>@SR!Oir)Xqp{d%MXC+{e>B`U;VxPJBuY9(IM2@m0cMHCA(9y?{y9X;QvU#c)1xCl8-*4fnm=0*`e{AEUc*O&>+6wDU(5tGPBr#9>P=~OlqsgUXQ z4p(~C0Q^@1V}seXrb92H5)qT{+w+yE6WBq+N~5jYo?eUPZSGN3hwIg2u@y@z$+_Hg z8C$)uBpJ5M>~zpPCP3(oN2!fLVqR4ih3p8m&&@~uFfOL9l4Dh{L2Z%56z*-0pqQ1# zcE2bmfE7c|B;8|};@hzsX?FL##uPSY*K}{efxh;QZa#};4HKK1M5eSn zpn-0dWxL*kHFsnQTXZdd26?r2pT$fA8o1A2MLvW2NODMr74w(;1`M`Y_Bl;-cF%qchnHZR7E zx5@nss#X7))XzL>69~#Jq#ohXB(>_DuJSZHyE8C2U-aW+1+l9qWqUBPHu(HO#^7K3 z8TBARVpDgGn>SmE|LPwverwjJZlC^M&N2oM^Q5Iv zl3FRLlgSGIL~a+!^7moaHY{CP-#Y|fo?wreJW`k-@s(*7S6UO0wmPL>!xYY2pep>B zp2vF@?-G(ZVgDPDV-8a&;#Ln^nH~|1E@u_Ia+mgaWBRoxch+&@H33B`(4b3czPjF2 zN_g<)SRnKUh!dF>Y~QDzn>wF-k*p5rX>mBBU>Mq-242aSC?S(nlFKlIiBa!p`KR2Dd@I+En|jE7 zDT6{<%^eFuwgu(5G?EaP!7))AluZaZsi2Loj78tXlSv)YkF7blwvC(&Ebbi~()eO1 z@LIY7(_6H87F{tc5n!Gia-$840H~?NSgVx(`#v~6#xx8z`C`+uDy?UtAv%4nTwL0n z#MZ3pwz%flr~c@9g5#`6ZuSg1R6>K@EC3ww2GxI_dz86B7H<>gjjaR7tBFkkU+IpQ4)s5(`*y5axXu|Afa_BWlgvrx=6kh0@58`FiH|xZ>1y6c4A4wuMxMf3{Uzpguoeo2WBC}>$hYj6*Tw(x`8rO{QdpatC z46l-Pm*wW}C26Z;Nk7&NJb&U`R`WpQ6!-+Q7;#FOxU|`B|2yU~fogdbbxY+}BcLU* zfm5+~2+D(vW=SDIt{TG)_ioYSZ28Y1EebL^t@+i1Z!RZwh-5DzlGPMa3FTH8Xd_+S?ud$_}= zM-N{W!+(rd8>y$oTMqdhHyw2LS}qMKr`_t!ipjF4Heza!LWAm#`+Q^0HN;a^_$DZG zv3Zb$Y8TbSz*|nX_@-Q9WluDOQv}78<{YpG#5nPtOq__v#mh1XO13`ohGXvSr}X1& zW>aMG@=j-|y7-FVj3;8eYP^SKLsi5walk3!?Q~|#L6I@vk$~^s^2Cli2;)|szG=%d zF~cRJSgE*oHp;1UZf9~@8fJ+iHZg@5gTdc zp(4vx_o%&jbp~;os7$whnSy1Lmwv4 zRt>9w5%Ki0tEBZ%O3i-SPQ}b734(0NCpZr1T3t=3LE%|6P0-uZO`fD?k`~fhiqdis z_oo{@n0iep29Y`fx_rh?UE$Ni(A~Cr!y|nlVPNt2b%5|~CPAqre~(sG)O_vs!@ZEq z!v%)Mvo2uJ-Sy7-v~X7DiPQGR}ujB6(a%lPdNt}eZA+d8JQ9-G(JCRv`n zy5&ZiJ-F^Cz+=c*HbPOj#f(E1A1lILIwo);K~|GPUto5?v4&Zup0MLj{^|~szbJCc zEjA+}bP^nQc&?!42uqd7%V->T0u|e0A#oLy0ue89G}GwH`gI%+Te?al8s`)r6PvIn z9#_Oa_caDe@35_Go!v$PSKiW)l9KIJ_`@*;bU}iNq4V{Pd456zD)9Yxs*mn1 zmyS{y>l-REV>LJHcOxEN*1kD6&RONTC?6Oa0wE*hNC~U*^XgwEj#s%QwyD#nXw^#c6AbGtvaebu(@4r>}Y5 zQ3KqWYfj?xidYaD!)jaYk^uc6rfoTaw=Yx;FT~iyZG$q^v*D6c@cpm*o& zgeOxvkN<#@s@5rNk+$Zf9K%s+2c8{-ZvcTo?$|T5s?$OGPa%-g18X z`V$XWooWnX`Lud0|7}(kav-5Or|`q^t5gH0JsRrF`qn#}Of{1^Q(34`$M<$(F2ki7 zSuL<+3l;%Ps$2?ECWGOa?5E1cfzqaqTto4H9Bw0se2fIGl}QprN|@p8ZME z@Qx^I*EZ4NheMPnrLg>wSmd(R)(J6%omA??iae0tf^-``xfgC-A?%M9NYgC`<-l9I z=wA)q=!6pZ3*xy{u?r|#d!o&T5_{^EEaq6(*#%D+km5^3rNJ@QXThmXVQ}m5z`_%= zPWkYy(y^@HYS3l{v9V6ygPQfBSLf}~9oY8bI~&Qjnp{8VUI>GwHkVkA6Dw2Lj;D|5 zyNiF6R+nSGiIA(QQ}sLq4P}f+wSzj9G6VyoP&teVWIB(hZqU@~d+n*=f(VnDZ?_xw zB7J~CX|tfE!C^>dLnX zRb92YH!;|opzy=|UJ&vDvk^E;v=RbY)jDJfAvG+Wd)el4O^)sJ6h)-nD#ir)q6i-4 zfsR7xsE}MLT@cZ|RdOR9{t0kfU(l-#(HEwiT+6ar)zgUtGFo)#4f(mQ)+v`8*M$1_ z38k$*gVHzh*l?q6iv@XJLDfW3VKY_kv%e89|858NG(2O;-H4aVD*bW!8e+Wyip!X5 z^NbsOJSQJ%0{So}9WIl?r*O~4#J1K&;^~q{20Kl?M?)RtZe9EZ)>y}; zb%ROK#+eJfb)lKU{HOglDW~;4XWEa^*${;g=3dG^(xIDrUtzCI-%4Fu#d=e9ceKJd z!fT4q*nZxVxFHz%v1chcu6#miboZ9V_H7L1c7D28Q_lcHy`kC7590lKpr+e`0iGsWQS(mt=yq0_N_B;j zLX0~2x^-PT5Y>RHV($<`R0Y8*PFc7|duUX0IG#Ho}t{+QO7-@bP?LLDN-U7*w z9!3-1JtocLJq^w_N4sw~VQW|enb)mrqx--S?j`ri5PXo_^I!46hZtrPV4g(z4!(T$ z{@StP*<^d&`_2Dxhu{^RkMp$5wrxYf|4oL^GZ_Z0gIy7Qe~c9~xetELUoO^X>MpQ2 zdg=K??569Nojq>6+4de>JdW@D#1Ocp^v?zd(ga2$GdH{>Uk%+-w20m&bi&-F|n6OmpR|`;XQ#zASebtFDBK&E%1|2sByQ z;4;A4xy9VFbxf+Y$s2qP@3g0GY<3+BS!q3&feKKjxB0tcN$XKg0T~2M^^=G z=W5NLrt|;v7Wtsp90E#xE~J;V5Z?mp>`5$HmYIzR^2fRfCrXf~pB5BLE#NGX zNa5IGJit;+6TYgKm8T}pnb%%{mbYeEGT>5cpVupdTd1#{yaBvERu`YVI|651?QyJb zUaS?r#M$hRLWx?&$TzWkJ@AgQp#-q?53=>PiA_F9=RkqHQ<@m-h>Yd|kNzdFZI*Fk zgSM@)N^18dO7y}jFsu`A!*XDb+uM_a#VS1VaqTfppp5U;MAzV`#k2|Y2RV;&&8sKv z$9qY~3+j>!Q!;L>NfvXkjGKW1j9j<$aso;d2{rW5%@it1cb6>AxvN6gQ`G>}8dA1m z7l}s+Xkh1u&ZY~G?paTlYLx5L|BEb)JiH2o9sdqnDOC*9szNDq!!Nugsf$nh^CrH~ zyraMD{!d$rh|RZq*u?KIx@-td&aku;*WCps!A*8cFp7L)f|cp&8N zo}mGA&%l|k=wRn=8HwBj7ND!NDefV(@{(Ih?&b*5rjV$N{DV()$D{LM?=ZK3Dgf@O zjuuCRdDa4~t!EoM?*qp#MjY0k#BlRwzs#!eUoz9}({L1P|VkAC5%RiY^rSoCg zk>z(wuyvy&B@dVCH&Lmc4O0ssmXzhEBL&|Nm+Hv{f*5BLY<~<`<1ECxFRTk>$GQuX z3Iuh8o7TH5#H=kFvSeM}ovBZEyne;%YMDSjjW4-U1R>F(#NHgztM#VP4$G&;cJT96 z#jZJRj^47pyL>Yf?nhFO`g~O5{M}dGmKCT9`#axSVgcB{P}Wxxp-gkx)%*Se+H(4!BjBYV^u>*|UU zU_2ZC7>S^h(aEj2D$DVyKU5)d^0JK$)LD7yUKj^{66qs9%VsM+HMwErY!y#7v?322 zMB8k;8@{oyG~g5 zx@Y$kB+4K1CB<%gblf7t(Kp}q6oC_Ao2W`AyVxJK;Hkx7pJ>K7=6^ zmBQ+M0P&86JeZrZrdt~cdE6tUt%Z|IP>8Fbq-VqO_ys7c+$Z`{+t;!lpMY~T)q=CI zNfmlzIO*<2P4XoF4u!>X;U9c*VfHf^Xsxtp;gUz)N-&@%rvfh&5AfdZeCLH>AZqju^=))l%mv6b~w z_muY~croh!5qJ6%30Zx;T3>(SlozNEj)ut1+yh0wV$HfFn#%3gkC`+!wWDiI%%!a^Nfc_0?aD9C z?)5I0&}Cq>%5AK%z;m*&-VI@QJ~* zhuX)!h&dxqU(=$FrazuWb`KxlA!?vH>oceVD3^DFQt4sNX5Ju#ab$!MBa9R>A^{Od z$dnAe#l(wro@V+Yx*)wo_+%9<`P(UyX^bnNah2H;MjXP+V^+#D@Mv_#WL@gox3V9{ zCK&hL+QMhcRjn$rKybO*v33P^6;4g6TVJR8cFtXcTKP@jzDznqC;$9i>rR)!W<+pA zvn69UO7h(y5)$43Mx|rwe$hx#5fwmfAKi!QY$rRy0E{|aLg0ZM4`BLYB8WL1Wlxn1RmN|E5-j*JqcPcNA%ZZ* znN+ntMy!?3WV4Z3KhrnXQ$R6g!*q6V;)VWKQC_1iCjs`hU8)V%^|_Q)Z&e!g4(>@my7e3X()S9F%#Ay?Rmh0 Lf_Y!w=ehp}NR8NY diff --git a/docs/upload-list.jpg b/docs/upload-list.jpg deleted file mode 100644 index c0e3a0052287cc667bf3c0798abdd3b2e8c5987f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56223 zcmeFa1z1(v)-b$D0qO2;>29Q9(FI3q1560ullOJUjx*y?cmAs3@qY_fhWOM?=TPL_^0yzkeSS9}^1)7Y`2)6@!2f zAD0jt7Z3N=2n-xl2Oa?#0Rb5o?LHdrA1*f?04yXpcLZ2C7%TuR77QE~%uN@76aWK& zQlReswZOr{ARxltLxOUNpp4t{R~`TW0}CC&%`5;F4yuR=hY6)z%ii)4oK1d+!S>x^ zOq}2!&3}ZH3_mGYnWBFaLB6Y2`uyM_O4!_1P}c9LKWM*&91nGWHnE6kf5Y$*T-k0w zd7$GHvn@Roo9mJKD?Zo zTXFCXMgbAm{fA3vwy%UbRh(3$7s$pO@CJY5>~E_k!PO>b3Jat)Eh5PY*!UP$@&nxk z8A6@STu=|%&$kxIo|cI|M^*|ByI=&6!hFbqF?ofauojoH8rf|^tN{}mRAv9U6 z$Dv*K5S?Y;SHSH{Ngpcl#7iD4Wx-Y&u}WR2H|I6-3BiXZZq9b zs1)>U3E7(c@?q^3{ac%8%ddG6xIfFv$0U)f0Kz^Hn^!#`){v?Y)}(}sBmmebZ%kNc0DuVL#Vz$g+AaJSr5(oPClxx>A2m2>`6sBsKkAP} zepKKn>u(7NuJ3QrKNmtumY+nVcFMo8KipPfkbV+y?pj!kKb!x6V7VUtpujBkZ~c`A zN4HA(*Tx^OaQ$(WKQ;c0!2bs#05e2JBwzYODOZK|3nUo8Ogi@AZvFpZ*D-qJc9S>n z!3P|dI;!?=?&4@T#9L*|C*~yXA079@RR3Xvw+ew=;uc^50h;wqZzl{eg#r%)OThkl z=F)mx<#bNXiTPf{!~ewYRa{`Kn7g-_SzxZXD6!e{Mc7qFfWsuIX{ERZ1*{mzU*tN? z?>{jNmm@Aj!hQVotoj1x8_fp81P17Nrp2amyYAF;m;Q1 zLyM4khWdBu{}dwrkvX`rY8uu};141kf&uNrKVsyEEDX`#yx^VwyTK6t_MQX|db?(Bi?k^qy0{UeHZ%{vg5amNS1a{a@!MpXL2fI_H@1>s*?@X{~f=utBOL>#CI zNx{%HO2h$xm+pb`rGWr0R3Z+^pPIi77c^=9F(d^^!X0iZhJpp3U;H!&gUp${)N7~5 znC0^LE#Tip#=MYeenC)wAI%-gB1!l`9;tbOgEIF_Gqd$nM-l{OJn- zGa2q^Y&@HLEz;K&;mE>HH6Q$Q!T_+a!Q8wXtparcI>TBssqqYE_Ns4*sOZE9y(0T! zeLiI2nApVUQHZf+Pwc$_rJR?&5cBqu<9ZkfzV$86q{(D8cKHJS%`Y56B`uo*nDi(7 z#uG$|V2eYG_N|{Jq^O4+x6wsJ&7`6O+%gU=02Z*+YN&AZ7_vxFO1TdaF&_Rhn}0EU zm(0I4pt-zl+$QoC-!*>#+V{5v=xOSgrvdoCh}_9h)7>Gco3|M1*I&S2CN$D|w({9K6Mgzxef&1AsB|y#F&&Flvo=(m%mpqI=i; z%ToFo6RO*5-`~KkNU`CaAk@>mC%CY<0Lk|pR@zh&C=b;nL8%fbe+lND(CuicOdkSZ zkfF03@B(l*`k$Z&rRU+T5cG$gQq!F@^hcHCya_dNc$XzgC7U{7s_Sd6Fcu(gGVD~8 zn*wgk9MsBfG3gJb1l*n*kQ9Oehp9ea`ShpVZ0=e|nHo>DYARpe_Q;8QP-U5$G4S+O z4Z38IcTZ8_D4}t&LIzsCzcmCc%=l~5U-29cEd07-ob={WMa@f&e9OM#@(%mFV^mr2s65O5$DH0}r@_A#robQc&w z{N+P;(Q)(l)$S=(T(}VM9la%N`s}5%e*VyU>^yWE#Gm8v7Dx_s7#5gM9eS$P=opij zLC2K-V>|#rseW?!sdv3t9LX@5hiKi*S%AK{4*2=k!NS7}>g@-dZe;w1zFWfQ*VZ2V z!w!3GPXg{`kCko@D=RxGIh{FmExxUyzzOtqYuo%HSM@+(v7n8j{Hm&CZwK4NA5yQy zyCydtA4hU{zCa-)*fBPlJ0u7*PI}NN45#b7PSebsBT*$Tg`JQLfYBsgIr9Qt5EKkT zPgA$flWwx5G`p928OQT^JOoH8nevESd~Vtc`L+lav$@SBG=(5l>$>)XiLHpW<$36h$xmz7KbpQV^HIT#vHyPp@35h=oH1EL9o`OdU!kAISKpqDo3GR$Izo% ztqm7z{mql=+fM(!_y1_+h@{3pyfx*+k{kWknfJGh-LmdFy{+7ppG)%R)#$gY=KT)= z+`-@<6*vUghd*j}5U!mn_&3dcd6U}~Y9jWJ3zn=rv?U9K67Pjb-EyEM=Hn0iC;T%4 ze@5WX2>cm=KO^vG1pbV`pAq;o0{_2{0FoMXgZRZC9HtL5e!NM00!nu%twZ~xqB4uF z+L&Bmqn~KP44(tODtqdF#^gz?U+ufh+8!?sXb*p&AfoGrCCm~_n%mgNQy#h#_olq% zFaE@Qs?rptU|H@!S5Vqq^IT(E0WGbrN?EGXl4Z3hz&fC}(eV%T0TqQo##%b{6(R47 zg6_<^hJ9o86D3!*U+F(Gne6ft`Oxx7D0iLwi3{)6fUJCN=`U>a$|a8_{DOB&#&eY} z4mM1{eaff~Q2vG7A%+}ud!HW@00Re$0CNu(5e5$7PV{zn9|r~z3mcdF9wr_o2iHR> zHGC=_J`-n70y=(b+29xNp_~6m&{qOr5Mb*=2JSPmyr}(q^i;VdpgwKfK*5pjmq@;X6B7lgRm3C0;hMOQ(+pr^JzCWu8dKtSUpk zF&>v;(`)$gUZ-N4l})`q5;f+fD;bSBjOo=)R`e|5b7$cWS<&Q%OZ7MGd8hVVN9CP&UktX17d1hBFuiPSGi2()_LZUZ$B>2u+B z80hjxV?Jw{}(^m4U)&8K!!SZq%$ zAulH?xXQ6;w0E$|&uNau49_oR$%Q22jVrWP0vU`RI`Q;H&qtr=rxKItx!O+=Pd3-H zRK-AS$@O!w&vV{DZTM{6fU2R!Q+_-qbgq_@gx(j z*+^yglWL+?zRqEeLp!~Z;5Tk%*Z3I7hNfQSI$sO97E5Eq&J?6U}Lkw{i;6eZe8qEQMN9PPm;Mn z6$Uhoz`~1{<(HeX|GMkmN(0Si5PE@3q;?Mi8!J;A=v7H)?AVF^COx#7;fqFqN$f^=F>b=bdEEE?xCmFM+f>6y~2Q1Etgx z@%?Sv#;$LbXMQNlgt}Q+?`&GW>?riqH1c!+T3?mT2HNHkM6c<qt)zBjl3P?3)Mcx^?I!cTX!s`kMKybdrT>KjdpOE##_ZYkyA)pZSKv8?f91f| zYhF2Mcuoldz$O=qZy&?tg7d*a`OtIyUHGrVKUseid;RLed+U;|l22O|W%~0V zImLMSxnZAZ`-17)1@n$SKXk0EnJQ@)Zxx1;a?QE>hxcjvhCO=h&Z$c>SJbtYAft9; zrkh#*&8aL4C}6eSX<07YAhJ);T^i(>Qzb?=OM&|NWz`CxNz`PzAy?Y>4SEF{rI6Y@ovVDF|S;={H{rFU$!dV-z&+`0wd7#3AB7R1Q4%eBm=>mEd_IOoYn4{6Z*lniF_ z3rI!rHY}~0y#b@$PR(NNPmi>R=dZYn9SS#)cu)uFX&|0{%s{RU&l2ST520|q*-rPJ z0;0#fr?yoQ{$2skCz*@Mz@l1^m<`ef)sW`rx$UkgU+`-($ioea*bGsGKS=wNaRfA3+d!&dmgGM?aVBYZBJ-t;wMMaCif_-tO}C z;ODR+^l&Jd2m8$8M$&O-91dBQ)6OP6z?+rswVf#E)v;&YAX2yWkY^Lxr7}{D_^P<_ zdSb5=4aErNjivO&AI(g>$h60~mYM1R&tou1vl<&sYcQN+7x@v?MnQIL-61%dji(pKc z%Q(mRdhD`;emu5&qO)s%WRp62R^tn&N#d)5r+Zf0t^GRJwRX@xWpzYmaL`34+ zqf}z0FBh^7IxnY5qSl(pWXsmHDqm1V20qme{%$BEo5)t7F%U1>FUa;?Jjx)RE9KNS zq*Lq75uVOxp7T_Oyw*2po?!WGy+Vl!)ynmllxCDDgM4n;V#_ntiLH~SBTJdpW(i2V zn#E+XS{*r7ZMSE6xgQU~W=;AO1JZGhc>9TeZE7@O@B$qsvu&}tYUh1@z6!bLn}DhHvT|9LG4rHkI8^6DhEH3o(2E|;tQl`sfq6J{-iixpue~$4d@#7% zSh$*AYrpnHg~i&Xk~>_JxKOKYzRli+%6EpfRFFlp@N#$PD7HQH$vLA@R-+!*jqw;QX?WnJSw_0WV2P4l){(cpd)>*X!J+Qem=X7RA8S+?BP8!ht?Cij+hiITBGEt<|q*_7xF zm!hcx&Ds`4DZb7W8$A*s(u?P) zN!vcRd#&K==*Rc|xw<{)IAMPO;L(&p38#)SzS|_Py8eR0MXMfTw}V8Prhcf#b3{WH zkuT>JeHz=jtnyv1N_ykYM-3BuuXtW>i?J){Q5z~$boPOR3gXqg3gc~~sN=<6U1K@D z$~h%&P$*?)Wgs@+*LP(*oua@e2f9S++tD*xHwR9?k$x4~{cM!8^N8ng%f@!0#4{oy zE7|Obx^WS$K$Sj%kQhUvedeQSUS3{_U+V~4SScvuQ?e8)56{(AmJc~7^3&H|G{4j3 zDzB*{+pX7|6Jz!zpGq?C*5!+@3gjc&f9>P)e(Okez+MvrREV$rtb)y z^xj#WWKaJiiaS}3AU3&Ox@{%@q*}JW?k>hm+8!gQOj;bLDaTZhGB#kd&f}W(9}(^+ zEi(Pb%D-`7?RDFK;fEP5|I`1%(VAw~rGGIbS!{!L!+#!YjKzQ1=U<~Euz^u>19+{8 z%vu&!fxrNHos@q2P%6YC&pV^v2_X+cdRVMzZxC0McfY+WU-1dk6T13CgKlPHWKItO zfweH6N{iPa96l(VZfI9M9)^wCn)dBoHvlnT{>wP_=3c|1V%(`1k=?v0d4t1wO?!j* z))u;zN^_>kln;hUtBdD^%OM;$0K(PYUNi&8UYF+b-PLz#W6|^R#Q3@khX+|Ost(C6W>Sa8@>nADsSIFvLTYLe>C@Lb#`rY`SC?;bKk zze^K`xdDVswIQ@64aM(^_O7+Demr}O*Veu5RK0S2&Auz}p*jDtX^(>Y`MXEk#8bMp z7$Q$flU*aJF1%RT)k6Zaa9`)U&6x={^Ky49y3wW-O==_Qdz$yHqe=F$yy{LQZZ6gE zUCFHS6_LKc9*9~Wf6WP;if3CLNT{vITbu1onkXPQmYyNvKVWoXFhkdWP4PDVRp)_t z^U#T(^FnTkIk;`;m0_JlL0@0DkTgy4N*^l+N2@*!Vv6pZrbFybrg2;{trHo#TKpbo ziE>vAIO54#jH}v|SpdkvF&jLbdhG(!^g zYx&F@kFP<-e0?1Uw4P_FlPAJhQv?vP);)fu%IA?4JEsS4k{&Ra2i^eqi#(Vch49*C zsH2(m3T+yY|eQQ&U@UiAc?yN~-iLBvgY)$HgMIBI3s6i}4 zohT`zCts*>MR_%H!4J(a>yHe>AtFLQ4*XGmW|&ignudc*O&uPGQqt7f<>}7^!~RV0 zn7)_yWex zFRlk;p&u%sli1P3?ObGXoNjZk0ZY5_^J;5zYHgDW*jTwIENaGUbsLquXTQhtk}y-S zX`k^3)#~PWnsv<4#13d#s_cY6y#bhYGr3Z94qE&7wJ+Q!;WqnfXa*z>pqH~QW2PDG z?$?r&L9VJd#tknhQ-2r!S>uaYh!IjhOX7FLwd9X|>q0r|!YLzBu?l>aeYJwpB`n&z zsy3_f)zdkrX6e2k^8|gAlA2|>)V_N0>8{s^Jn?mpr!}_Q@|TgVxx|e3;QcBKUqU1) zD_HrODIh=HO}szaC`wkO>)707K-q4@=BURPgPwQKay&W5H#xK~e~jtd@VmIyWSX}- z3QRuoyDf&$B8;jjgGjX|4!w<)iOYl$sozYPQ^8a~iGf zTi+GHaC39*-PQ_g@s(jmOKJNwX2@7o92U)(-=vnz=;D{6UKo_0(8SuKekSrBcj+zPBQ~ic3<&hW33Rs9X|lB9+p#p#4=$UVv8LGtHQfN96F>tK`kp5|9Q-|a zM8tcDaLCX(aQnR|7FQlNcOn7~6(=Sx^+O4D7eo%zr<633CP_6Ku5PvM`*^f!X3p-* zQktQ49b-HmA<|mr!O8j6?>m3)H6e<_<_V$Ty!bZ&Za1BsO2LMS6@l(WVLfhINYbc= zK8m8muSm2gwyX%qqiWCp9e7Zi8z>pJ#i$bUzY(y)cxwK;ko+QGV(m6KA640@B;9ct zB>tNqE%$PL0q1M_#izOLz4Bw^BpFJPOa^6j&vG551C1j+Flt|^@RcQAbynuBu}&AYNUBCN3LBl^bO9lpR~Q67%zT2i&^<5*T$fqhVqGI7cXXrAaRx+W62?E<7!xV zOC@XKbpd+)T%SQqP7Y9;TeV6utpOV|DYMKF2}Cz-sQB_h(x@BFw`k}vx1F80! zik%9A%sVb)nHX2usBx^m#Kuq3WOH3?>ZkGgtZZH(eqhZRWNRsPcL5nDB_;VcgI0GG zM2irY>x;3Q>45CU) zGoz?2yIjc(q*_S|-@lQY30wB&6+aqB-bjmsulK(JLlKfU*2rM=rOv&Y!4gsmQ?;kqKXXb64lDnW$T=ET~!%iGw9dMQ^V!UUy z0XZ_P2b3!nHFZ(2eBYg-ogRi_>g+IrJiBhTf+mM`uVMm2>AQ zPI$4kKqa^;f*t;JeXW!wokgN_@a+Q+Y*_Nt_n*rZc0K7;Me@Q{S6j?U(~oz^(NyqZ zOp0w7FXI&?oawF0GwoNY4^5g1Z+wP&?j|nLD74Fk&TfsZWgDqu*`dt^W(V=Fq9dzi zw^-~xh;Y3Dw7q=#h06}349k3Hp>gbV3r?O1BnR=@y@IgT@a*@n!%Vq>_O!&#*88$cIh zzuJKKs2HhSy{HN{QBxXj+{~%h^UTwtBTT=wx~XrE9~CkVSzpY7b0#XC48zi8}C^^Z0N5Dih34Mtc?;b zcCe(E9Z@N3rIBDo*VRr+(%*f8PV}3-r|k?~Wp=fZM!X5S0<#y#;FTd;bo-zlA7 zWs4ROao$5MEiEG0HsyAt=yK@VJ=N1s8Q^3+>1W(cPv>kHrizFbw;IGY;C|nnGH$s- zxnh=QIst>dV$czZy5K}WBM#GGk`h*g=~v0jPO6YGYi~z{E`A?(P1td@1K1HrPqpNk zthPR_R>ZZ&nNyr=;f8es*!*<;wWz*Lt<5_W=LX>UIKj>4p`;Wue5^rzOC19l^#PMJ zRh@bri9|E;crKkZX;N6anBlOwJ-bcyfO=gMlM>4aahygXk-vYZ%cUeX5eL2PB3)5t zQ$I!28R0AkeF&`-T?3sl11PdyxOkQ(%%D;k$hDg!cyWOF&X$FaB<-7D5z&6<>T&Ll zaO-RKip2?zE_hFf6+%jrqAP~j2IM*MzWNrf*Si=29eZ_QxHBr>Y~jWM-g zpF=~3;M-Y@(q*J)U#Mhy6>b3E5UGd)0sP^3DH#l@rg~(_?4Tnt<9y-K6|?464j}#qdc~L zD(VV35RKMagc-acS{M`0bF#HTY7pfVMHy8`TljFd(BZn%Nvb|omZYBto7Paid03Lu z&S3y%AvZ(Am`!9P5=`kwBrM3*q?{u}qp+6j9V9TCy=UG2eEdg!V)2MHW?oegMR&2)HabU`!e`DmLT5qVAt}8chy# zK4%=xPfxH#XZK#wkS;n01AV;`hbWHSxdn8Sle+3QUfmN9ei}c6`k=DkSGI5>W$cgpVFPp9LmPqQ$X+N_~Y`ux-}M1%~$3pcdsMd}BnnFKC_FfPy*N z0L@YlCLVA)5pkd-HaXM6v6Kz9{-&7dkCVz5P=qJ2K=+xZRd~@cb;@8@r-}!82^lgj zC?dmSvNWgjfXxu%01DsTD}``>OjGn>)@JApo*Q%_B#GAW0)oZ5Le)5(Xs@l<(XhPn?sQpDR_!R;&U?zQ%uD4MRd zr1ZsX(y4+#vzYq<9!=AusyuUHKu239+!~+--;)U?W-Kzqm639i1}YgE7Qr}y=k>@}i|$zd5x8LY7f;a=u5E-FwdXnl8E5lwTR-EHTn7xR8rYc)eK66FmS z*M6;2`ot^w(yxEOID{J6PaKO%r71FYEy*Yo@(dEjV@|?y%7qF1EUud=+WAz0VY4TI z`Sv0{$1w)E)-p67q|PKAeI?5mbN{}Up_Y`2a`%yoRVKkc2^mVbCmUKZhd9b$VQ4RP z%2^sU`8ZW6yi|(4;~t@-Z943VBwB=i&*vw#MYw%Uv}dt-1Q@U`5IMRxq(J2c+M*tF zyFA7PS#i>m{o36cN=UJSPGo$-Ok(A3)z+D(LWdVgVF|kJl6CJHm=hlq@y*WA;1xp@ zg~doDdlAWf)Y#QwdIhER6$y}6Bg&keba?Z0wje>y)7?f-FN1{@MJ(DKjU0M67HNOk z&X1#O^P2k(FTWw%YZ{&@r5P&5oS~KMZnx7|i@#;4$y?aba$B-`<(BCiGE)W3xeBq@ z0sW3L7ft3e_39F}In|3eA#&D2+J1C8`f!F1@BJjZq~vYSHpvVuQk6vuahon8GM|NL zQD-`$9k?)eQ?Cv#HsCgDG)2hw-xssJpkOat(=eb0IY%+O^~eks^%$w}}q*%q|7aJE0WzT*1D!SJSO;CCE@P1JmQzp}yg3S*}kobh|?{J$kby&X=_yz#8U57_Jh<^0GLH+{&N-D}SWwODQvO%KjHKzR1%bDTFQWw1J zU_-iWZ+>e?^T9XtmgWA&aeMVEB%ut3*eO0utx?;n8$dfjkVSkS!>A+1S@@Jdjrss{qnJg`0>`uaT@r-(v;*i%dt0x z?p%h~2tt|1#A*4GikYQnXvJy=N?k-!f?T#8Iy0R0ZB}4N4}XrL{54&Sx}OYohmqkJ6c zt=nlem!L;NMAXw+PBc0cI?^?(zzB^S0NhMe`c%s#=myY|8}yzNbD$sCVbFD!Ct)Cx zLlYICuuH&G80RL6B#xP%C@nm5%zl#L8g%*j25^G(Ek}@!r2_mSK4_ONUk);I4f`Vt zY7u_BY!t{8T`@O+JxQ|DILD?L#+XQ*$S-X2){)ym^hBYdv?nF%G4txGDE{I!h^J$x zPp4BXxow*>@%qAa&dsmaLKx11^gM9Hxw~Y}V+-xoY2Um#1MkEZU4X72Y;>>j?%|fl zMBD0=A4|^+7FZl!G68|!K|LJ^k5(G@*T~;UKBBZnARGkkt7qmt9)aLwYcL^( zY|Pp(h)Y~knRS(p^OF=N6Md(lg%7olHPD#gkP!`BcsU>`_96Kb!3U8X=Rm6r%vR?4wg< zq&|vd(&=3?rF+d+5#O1grnZwVDs8r6WI6dpT490c%s))ps(R_1Uf z=8iu}e>@V%M8pApwE^Pq8@wzof}YwR@AV&F?gROAR@d@!zOE1rf2aDRi1Nd9Q$Q^n z^VZ`MPt}r7Vc+nBY>e*zFq|7n?xAboNMA(po@77HiGC#|J%ZYTk1G;k6 zK&8+xhy~4>;aBYCt6+@m& z&0NV+()5=!)%ddKT@U8yO1%Xd$>@fYxX$_2ALZZ~$ptXux83Hh$z|w<0|uPag&E#s4hOeo^#4Z1nfq`+af*zxMB!27bx-W$1J) z4O`wqXTtK;+ou=b;4h0V3%z9S^4EFp1$VNC{7vzj{NA&>*&BJdcklB&&R+Un;sU|; zLh|-l10jE!13eyn+K^F_Sa0yDW8;E>W7AGe5p&{$Xdh6is~yuB$iq}qsR48y0MqmE zO(lv4-CDjlWtVW+v9xAXmg#b0td+4D)oDt-hyTXBQrf37M8bt`4)uHV#y&Z$O+j#E ziXJ$4m`PprQoQk=kFo0U?KS#Vb!c=_k{4I=>A9wB2n3;LzXt`r! zMX|n})fWq-al?40;bk!4Jw`t<7Jm!aE^i_6bvf(Gj&Q_7|5kBtogK)tcmmy|aCG9CQUvRgRfuLrtZj zLU3uQ%ciOuu59swDsJDiYq`hzk8R&=Y@@wwX0h0)JN`q(|l!;SpuF%jBGw^eiYv_QQPJz}`)t;db z4Acf==t$2ypO;|cU{9kh``>E_fTnd$NfWF)cAE4UrgkElp4X|~Acc-_ z(Ya_?l9=xK6;AV-ukg7By9*A&WA}7ZV1>%e)QjNhS4~oKh>7qN-_*F4yP$ zdZ48-K242lBuOSDP^79RmnIg{dkZ(6NT4sVRJ=ebT45B`1FiAM`-A6~QkJ{AIyp8m z7hRHBTJad^n`Llx{CG`td&3W${qn`tYcv!^XY;15G?)DGMPGQYni)!|=3Z8g&zGnk zElGrg+i@ldgb^FL)B#D^MB=bVKBD@|UAJL7gyEC#h&S!ckrCau^fy0>sl>tyBC4(?S!x3Ydo0b9{pM19+@6jM|g{^(57A>=4G(33B%DQ`eaEN z2#MP`T1ew&8xK2*(FP(!ZipA)k^0f2HEP)SxwIH8hR)JQp))Pk*L4*3KQTkLBF)0qj z1B^bbkCE(r`kL@G+J{|+-7|H`r;{gfuutZpFsUD1M3nH$d9j1OsB>pd^w{E~eLHEh zZ%&QL*^2DqRE%~pxA&t+H z)3dzq%8+)lzQRQkWFehgR8Q*jWsb=K@`0x>vNk%gG?_qzi7E3m#vy!nUZnvZXfU$G zlc?Gmf7In?`Q5U8_b5?)#G$WeS^i_RExm{ZdYR zn?!}c?hE5}R)bgxri0p{YELpbM6Mo`Jj3x>uXF`x&IxPSN(0kH?c*@%(h#x>)Za5O z)5UQ~o@!kOJ+chuOu8894FDWGYdk9UX}T--OW_T`xh;u3A?8yrBN%LN#f#Ps54;4X z^wv?VVSK|CZL|&H75>0!s>+=N-S`Wh*{=>;$uV_w(ooLCab=Pp`A`&qX@F1qy;XFa z=8U!lY8w!VVbg&592`Dv@Pq<6jUxW2&yRvIP9(u^5Q_nnvFIK_-J1M--C)qD2e98LaG8!vJNI$M& z+sp4A8Ec*A1*VGZfYF(%-){g?kr=zkgYlzF8aR8O*z@{aDBin%WB7c`usYTmDMv20 zEUp>}{GM~=tN!Dn_YGrx9^*q3!vgyP&6~U1o;`~1xl4iX+Qqg5w<*N7s#JE9yV(<7 zb-YE{eNg=$po;%c?=4ExV4seuQMf1G$A5wD%^n>7OU51XspmgAt7G?%Lx4Z6{4Ym@ zK+bgawl?rLHxyTw`Tsz;@MFyMSF%iBA+kJ+&?L$U zA>z>yxJ}^{i4;xZk4thst&oKm8AtBn9Md{c#-Bu*c9nj=cdWCQe6;oWg=$GFN4!e7 zm&LJIhjojUZmSv9>LbLDdU;k=T*x+a9;s}xI~*&=_Z6rp87?`g@sWx-zvBEQTfIZ~ZfQEsA=t zsdZjBg%-|5(ze)$AO_~4iQ}(5V6rBdYO>8LCiO^v9<3BBUH9ndoH9L^L4I^rtD&rp z#ZW|~o%`wZqgPCe1?cP&N$Ec zBG$ZF1YD}`Tb`CC?PSm-wx*3B<`tGsS}hY5z^G#S02NO@Rukz%3oijn&FXdR6W%Xn2u#_s-os3KwV^AV~%1|Y8fz{s*6^BQ>+bY zQOxjv5sMtn(_iP7NRbg7Wo|1gEz3sLm@+rKqByZRvrnOiza};;DZr1qoM-MO5&AqyPY5tb{ySCEP~mwQ{B~{n zK4hLnLt!7S0sZ-|yTsn|?AbZ^eRIYfh2fgJgYefpl*c&giO$Pc@Tl(i9|GC!g^IuD zsje($W}2yd?J)EgaKCCzE;j6^HzTM_p+8rqv-@P)<;D&I8B%C}YRs|ab6!#HjfAeS z!mklDK-JMnX*6a=_|hgKa%2#Ji5I-z^=uruq5QZ%y796or=3E-F5(wU*i?p0cGNEJ zYEi=+B`I58slmjYropYM1%}PhwueUSUp0#HKhaX~!uokS9;C!DUPYUh7QQ0#o_OZ& zm}zWUT2$d4zMs@Q(kCT|TB~6Ql9Jo9?uz)*o0NKXCF&ok$%{pfEqJALj@IAud~JVl zbzLmg7v9(X!CQs`8;|h4s1=7f?n@0Oq$#Qg%cM_CQc{@`BHIbCfaBidV0L3tIEakQ zJJfA~SCBK75=fH^8oB7aAOW1a*qBhVi>g4rYKIwy4LL)m3Qrls_rV7BAgneIiwN>a zYALYAu(?AS{HytDNTKyd^!o52M=1sA$JW8--wF0n98dPr+3S;`PiI^j@FRxML}Qit zESD)$r80#+qfs$4QCN3^X37~`8>Q{Dl9D=%z;HJJ^?I+*3t)Zcfk2UFc;T=y%zLXFP=wK}afNGTn!ztWBrN8}eJR(Ej|Gt?zn5~6Cd1r!t_X2h;kp6L2_$}R zzNQPDsamAE+sBOPy#YX|ZUCH(6Qo~tJ|oV>WP!d{SNE-NcF9V2n_D(G5@>ecx!?-cPoZ;=j%+r~cqrG9$Xy9TS<{`tMuifhkj?4-zLBNW`#y04r zEuHE*2WMu6M*9rS3t|zylw`2&Q0}9DF+iA`5@px>EI4jPm2uGKb(>Q~k}44dG9a_w zn{i5VRnc~sgmD9Sa09rAn4zQ1|5V@uynmd!kL4$XF8;DthObEMFv&a3HRW8F7XdHo zT?xwKYPqS1qPnvR1s5k$#y9MqFWfGQLdtT2hK{mW*fTBPM+2ru<+>F%Ip)O$STh+6 z4>fxgpl?;kd!^XAGRdZ0iqNCe?TyFmH-6e?bTXc0d^X2vl$@j`odkV^ol6>;&DysT z`qW_^cQ+oV)kZbZCqqdSJ@GwXt;K5_L98>}&`VhgTfW(}5JzNB67nx%(%vm+@iuYf zjL+TkDHNz0t4rrIm8IQImPlm#r5mB&7Bx$xNC=7v#OpyANNWaT-iSR`=t}2SNQitw zr<}Jj2gFUs>52h~VjvcOz}z+k8mLk@2ev89)7o+Il*{a^6GfFxGpzD}_?BYXO#QrH z&Nx$d1VUG@yhCxFL|@qSsz8ei11Q1@S;58cn5DmVpXTDhH-+QCCM3j++2C_ zhO6_4i%#M2k~${E$QO@aM4Fe$yga5s$FUgKJQ0JlX0_Vh8|w6{NP)!qTRl#2bjYWZ zE$vAw@WJLzk7)_>Q$2yOH`%dvaMIa|r*B~Tl_)nzQ5BXZKZ{~K2S;-3lBybU^W(J_ zD&Nm45z+WA%6yD;yrtu*>gtkXHN*Zi(+56}j<&E+W{)tc%fb=+8Ai_a0agD}7qD}a zUA*YM>U`}^37^ss-7@#G_~yv=u%U0D(fez^kbv>)@xXxl(Cxc#13yj9i>Et_8!v&~ z+uXrmrRtURm>#_yt`YS#-tV8bq^Z^0f`T=s{RG;ZVN>@$#KDK(_xhs7B z`nPKq)g7{nsRGF0IV)_w*T7GS`7xqYqz911ui)29I zfiLvKGgmQKIwZXkS84gI^<~Ia7X_(6PDfc_87Rrtt>XY6TdPY*w=w!-wEGpWmuVmqMCI-YjkKJbXA*TW;Cy;p20jrHeA-pnqzcP0$mX`mi*fb5-HGQq(f-LiC`7-=)p{|yXokUVR-Ur z11%(h3XCl=*a~#i`w1(W*wl$W=*ZM$_1M?)1lH+Pf-Z#LY`ZtvD2p{OL-jsB@+68h z&G-}i-;M#^^KfgZ4;0Y%aM_`M*ai0X|BHdXK@WhteG?l7fJMb=x(|K#_5d@lrhSa^ z;nPG8wPh3M-~2%raViQ3YeJ*s%zcZ$N0bt1k=ZlN!)`g7f_Gq!ODJ6+VaOr87QfGc z>hFEiuz)CcSr3Lmj3Mx@Qox^wtqFe!oUZCs*1x5=k9NNz6LPEq&*W!@OT;_ zk%5cK0C!{|yP0k*$BS>hqD~qz0j2BfxV1SqYm|;nKO2-i#6Y0i{ z6(>I;>lTf@ODda*W06L;T%wfWk1OE5aMqP!E13~2rYWjH%_oJ&F$d4bpPlo9!p#C+ zzJ`*hj?p#dVf`{bCI8?n1qIWLLqhb*usHo`f&13JoPA0#658V9v}&7tTd1`6uDwZ5cD76 zdat*=zkA>BzTfZrKhK+-XU}AIW_D+GW_QoYIlF9kZ!lboW0W<#{)}nZ%Mj#|E;UY1 z=;_J$T(ewa0Ae(8e_}CS^^Pu8nwY?Ly+9o|145#09K#i>NwU;j9jz%TUkS)!**jK}C4c_e}HQUZTwikB+Hrcf@fZ4l@Sx8NUO1X=* z38OfIXf|DoXz=wQRwIGYA)1|C;29M;3k^3>+tC6)B4i?nnwkNtdRqsLt7W_|(M@|+ z1sl|b;Ed$9r=(>IGBt8ae1w->kD%Eq*g(tB^M-GXu2>~UGCfULyuQ~Lfs%Pa6t2~o zBcjxWnQC|qD{)IiG34@w&ioLF5(dH;1hkT#4%X@88 z3W4;w8jjb3-1F#14~pF^aVh~3yI)FItx=QBR^SwO;Bp{x*`^PDHFq&wSPYzNRTFU- zunCUFjd=uVq=M zQoZ5iO>Wg}u}@C}#~pLejZ7dnRo`B-(QVJdj>sFj6vy)?2J6~gC9Ty(a6^db?TPS( z42Ow99ao5jX$NY0ffJZ0B^a0wQQ&+A(=I>AbX7M}h^l#%lC#aJG&McSpl@L+aNZ^a zuOd&aEDGjTiwp)hX+^C#`GYv6h0X-orND$hh{4P#M!9zIRWmHMV=Go@lRtKhH<%j; zYTr=t8m@tr#$l_uT$wR-Wf>)INsRVyZk|zt5evmVC zW64R<7_+gapRS3ZJNc~mUv%fnF^=*}sOll!&K*VrOid_mH=JFAiUV*i)6&KJXxu!c zpZijHS8iA#U&UC|aiu3gspx*>nvpbQ7Q>GX>D7sqw22JQu?sF7;#8;Qz+0*hGRbJ! z!_=gF9_4ZRVDD2-=OIMJeU-?=gK|-A*<~7+>>#>Upd2O8cE5;(^q=!}wp zp7Bm*Tj5QJ%)`g%jW&$!Vv<(w#Oc7^c_$yH`789*te|J8@SIFCbf*Lto}9G^E8FGL zPMnG8k>uHiY{7h(>W~W)XFoU!U*VQaM(m~_<{}qq`Nx&X+d@J`?%r5BRJKQ$<4w(M zs`VZ#kp}5!L@12CnMg@33f0t^(I0#MXtwEXYkKwVPlP|^JW&bHCWQmvn>`#ew^p+~ zO&3`I2O#xv75_1-FJ?EE{%T_Vh1RxUOK@PNqN<>}A--uwaMkUPz=4&5I-FPkpXUED z*Z&rlPt01?Ni8_zf3nvfTM=;tQJ+a2Ufo}}^C#B$yLw%RNN^9PiRQkE zmKL61gE!Q3;Yq``V{^S0nrgVCSK!JI)cL(q&@}6u>+L9)-chhMtMLz`)b6dj@ z17~0U(SCkqqPA;W^P{5*qq4O*s-g}jT#Vx-6t2W-)?5SDLeE?!>s1(|s(+%=)ZPbh zwRPz)@A>;^C{v4Y5yv`^rRRz5@JLa1$%oB#)B6vcPm;68s?!35Y2#@qvroDsU zrt#%^i=lB<4#oj6v7)E)N|_=>?}w*Pi>W4l0407z{!B^gz^=fWb4IBX#<58OlOXe7g`NU(BA76avIEs%NFdb5**@ z+OboQ$rtS57etl4O#_P3x9@a;J&YN-__0tLod`5h7AS6L^wO^C5RK*+GrvLz4`GF+ zwsXK$gZkAg6K~HN+abxRaIH?^`tc;udI*5%2yl>Ciq z5}1N7|0IjB7FM$~PDV$H7__V~MK{p;B=DF4NSb#MGl*n%l_rTqWy#doEy^w@+@F%K>b@-TJ_S467rbmyszT5BJn8AaB%!8Xt_B6{ z+N6BU-B%kdl3E<)2#Whmc=noF)JHi?;3NAvOjbAHb;i(K!V?7;%>k#QoRXgHLR90l zMvDV>2HY<=3##Le3*1evH${(^-|r_T&bd%3+Q@tTEgxY9%A1O@PiSmQKM^F34L9b` zH3@-|m$RbbnJR1)k_Po*&S&`R-oJ$ykG5Uk_&EBIF-9hr=LlS?wVRpDnNO%gA~yvW zm&z-j;?Uu{%W;X^J%UH|ggKA$iBY|dwR@VTMo+a#``6ne#U0k5)C~QJs05hG%Jlo< z;o1Byp)3sb*);Ms!*NwnS=;0pF9uMm$WSE1m_}*@xg7%=C|&>AtIZuq&jLAMvp^4u z4>`M*Mx>zY7NN`|exIZpc2VX-FkGuXhANG5J}F9#bRu^2QkzkpPi%DLeF$grg9|C- zZURqGz8BBlH^L$Lox>gGmL2U8&gU$$@TiK95u+oYW0e>;;j3#Hagmi?ruy{tYfll= zBixU%hvnz8FZXMe=8H1fY5!i&@ZVcx7KgYkM??5BDX z4B@@paR|_T&i%~VSG4=~9e%;QMqM`tg`n@A@`O=f-f>-;Q#V$g&S4}ct)2Bw+5;4V zCoPBRK>`j<#B`KB&sWLmF8zJa#iL)kjr5n>X}LgX`Q7CT=|W%-BX1-a9C9?PEte{> zBRG1Q%abt?{)y%TYmmecy)dIFkl--RxfmHCNWWgHsxr_~YEU#v6{PzrN)JWS&O!pQ zrNSRMYfo51*!V0Iis3ZEwYAx+T8)FqK^;Om?ThikLg+DnD?MGhfp7Q9USaRGMcAr3%4DA+yoHYh7(r8e76o!(Uh_99=YPHRY#>t;tMtrfNn z(<4i3I^rVs#?HWuwM<`w2*!yH<`wN$r$YNu5_f=`k-5#%xMW$A*;IW9@*3NX$m4rg z$E$tAbWKXUkSJIz03r&b<>vueR7APH?7mJz7NM>|HcDAkImWEqO}SH}aMkW>zQ^0pceW*um4(P`a47 z$biy`Mu-*Bja7TYu8+ogUZ;jSnrnvEn-u+MyQ~Ap5O9 zJTW%7Mdc<4mpC$J{M<|@#7y{u>FvpX7&Kj(cOEJ)ZYj^)DYt%A=KartiLnyL|Dxnl z@A3?IJj>)?Q__gVOlg+rgvX!Ny6lMP3tB1DBY$EpElU=)f5(t&*hq2vH|M{!7Gx8~ zDAb8gk=B}}Rt8bIP?3{2X9D&@Zl9dmlnc90Si8mLTWek*Z~D@ixogw*a_dg$Fr=n{ z`Von}jr^h5XrHxeHoDG^#vpSl(z&@GQDSDq2qB27&&!?9UadFECZafx8Gle@;#0xR zzZ^A@VhxfD_!2w2YpX~+yUVJ`F#DzXL^b~!R1_$MS@NG>n)-n3rlxl^+PFqUJ|ny( z>%|LiBngM;f@+wQPbAq92Fq4gB1b3H5Dq(|?uqLLFGD%Eg^U^p&;L{)c~24tS&S+t zu`w6@usx*-5*ESvdPZ3C!ioEOT{OB@+Ip(onnCBFCZm*uH8iT2Pill1qbz?is6axT zk3m)9y#hRHtR~nVR(gv#z9#Y_O?j|$6JFmb6d~Uxiiu-V_L&~+;ZyI1kz9u2i5M&2 zNJO-unt9K!5~D}}@- zf}UqXd9bnvmM5xPgAI6w2%pa!NuYU;>|n(E;wU??e6n>Oqd6)a0@-lphYou9!4aWj;)97?M5a7ArgXkpDBq3D`Cggn#khfb z_KI$@-l(jaK91$0_x?oJ=a)Xq_+L#(Ly2*@cg^bGj~#&M)D1OgAd*C!;!s~?UTE&o z$7v;_ZzE?5lKreXFeUGFJFn`el_y@dc$o#gsi){!1MWtPA(XjdMJ1R;7mtp?1<-u zhYG5=fSeLu=Ah{aQKh9{&&`dM)fo;D1|KxZh(INVNQY^FTfxnGA{e1!C? zbt59WBT>1403X_Vfwq&#MKpbMQ_hA`WD2Y}s6%*0tv>?h4grW?LLI;|ZA-N(a}RKx zL>}HnylCvW17NtQm5Y(=FQt&FY|P}=V~x5@K5L2XLUnOwv+2v8;enkJj&zA(!qOB` zSe$jM)m=}MapepY)l5#wV}#HSX`ECq>%y~h%0y_BZ@`Q>5#rd_aTH>cbL#C_N?i*; zf;)U8qEg1GsZBEk41z6$GZ4YE$i;n3!bniFGwDHT|?(HdP}Xe{W35X zzN0=CK>Ox1Enksc91xUCTY8?Jw|$K%msZkgvzOJ5z0SeJ0Log_%S4d^l3Y#*fuTix z@@gQdo(M5?S$y%3G(tKkFCtY`B_}K|tCRe8cca4xCxPUm-kfy86xqWwy;mzQQxFqd zZX0H3TG+9a#SRpl<96YHO0652icZz7B{euH+||jf+RrD2!Z)?66f@kM*XkoWFB?u6 z|MqfaN7VX~7_*sIR3u`EWP;OCG<;wUPBccAk9;<3w7M=IU@m;%S3BF?mY7Tz?llM^ z%xyT;Nv3_+;pA@}co6B-o+r)l;mUxB;j|)sUU*d2*|w-g|L*?pogHw=0b7J1#|Au@ zB~p^G%khbbP?FRXcQ1rofrv`dsFNqvNq8_WWCi1R8`TY=;&z?fsz#*TAassS3T<1V zC0qf)O`f$_TEbZh_aO`kU9C*H-37TQXn1&9xJo#=RcX{n1Sln;gU%?%39z$IjR1nz zb+f8>;i<3LCHwFJE7vaq3T-5x1xnX?<(ztnUW+XxOme!%wL+S{lvvS-v$a@{I~_wE zj31~4!oP2quZoyV#2QRJ4%`b-)WO`MvK8Ewsdd_Y zhyLyf{Z^eWn*U+ey<)G8z_>#_K6O4aP-a0&0T{k10CN~)k|(Em|ABj7VV z2BP>`|M^40o19yUyQp?baJy6e4ww9_E5qzA(;AE_HPjGa+e5>8?zQ4agGPR_*nD#R6|d(7PDgc~XjQ zsaq^`oufWpa_qDuTtS9bm6+Rd(`my%aFJ>ar^ORTF}1hJ*X7+~ahfb;!%$OFmtG2T zqWYTAgeX@X2bh=(K+F0$DJY99LqkP7sa`e0FoN1{}0d@kVbg^w4n zQ1BrXy6fT~Ew=RHx9dz)6Lw-U$#AmedaFQlcPhI50iD2HQbNkkW=tvFrP zN_gDl$CL#9bLb@1z(Yl-b>Q%};NKT|fB_(2I2zF6Mq&U!3k@dWMiTa01wm3t zAXqJKFoSv6F`111xY|^LcVbkfbYnE37~(l-`$JxWcHi;)^jg6F2ZAKvHTO&Z zh2T5o&&@>g9ixTD9`OBJ>7O>r?~DE&2LC(EcXfWQ+n)o!)c?Dcbo9KHJf2%yncjR9+ z0_2;WHMt4B3W5aqn`S>~VhEuZ`mrBRs=vO8u+_Sc0iB75c)~<-{t*ZZsNb% zErV-ri|E%<1q#X=rNYxMgJFyCYRrG;+lIyy3L>HWDL9n=Go^e5w)X7?;ut>&Bu&NtR6+aY z0Nir_=|K7xu7ulr-FLr}xw!ciIQDCXuRzFSJ(n56Y3g0oR9IN%)4fmUKKz#EXQw|i<$n0L znO}j83sTR2jeU3RC3ot(ch^o!PmH{~dirq7UiGgD2n(S8yJG~ww%@A3Fz_ru{f--A}&|($9n-syfKJ13BpYf4CGQ45B|C z`;!HwU(#=*?EZw5@Z|GBkB+B+7;BY@k%LKqaAWr$c?q|M?NT+-smh*&6i>20a2{Mz zlc0a{MBrwC#v+FV(w+GI1o+!P0RU($;d&QD7|uh$go|~}4nHjj5WKIWCIkrpU<@H^ zzdjh&D{ht_S?bQN>u|T!V?k)75;sBW3>ob=x+*Y z62BQf6y$Uw6}PJ*VV4RJF22zSH~=PGscWHQx498o9D04+2(I>@bc6$h`3zyI_)UE+ zV1B*wvg(XaTa(w@6oP61oN#du0R!BGf+%RXBS^R}_Hjp0a@1*lvqppx;kuj~NwTlL z7J6U8H~epp{oxV+O9~+nU`f7_ftB{v|EcufF%m@W7nBO$&-#|`>v&KEA!}dAubTLv z6@DUse5=Vp6Ypb?gmQn*+OJRQw|4p4pPy=VAnI?Y`?dPpT>BRIQT@L!fuR03gZx{^ z-@W+wu@r)L{rL0m!6g3&ya!GE@0EVwc>f-+7Ub{g_^VQW@bF*Z|B@Y$f1l;&s{Xf$ ze>TNm0RG#=f5{<#vLwmhA^wdI|2K+%V~~IO^S@F27lQX^Z~Si*|7?oC0Q@(K|7Ga? z#_^DUhxj+V|A{CD6K21fgi8r9pafw4tZskO#8?2003LLNTjqZSOf4Dz#8>{Lr^XX5 z5-=?6k%E{9=SjW-MZeMYr=Nd1;X;E+VDGpl@UgUV6RLmAs|CUS`6M0$WI;GdRO|nQ z1kOizFJFKfM0g>eunFG5oB0G``|sr|A&f)~?R{%~!c+3mc5P#8Kkt5r_zK*s+~ZI* zY#1M>US04WsNedWnMqJ?b24sna^UhEBF_sV!87zM8fU3E;pi6JBS$|+FYii9`bb>J zYnzegTHe5ol#s&VuK?n%_=AP{jrEkN)_HvrSg^>Oi*&uT-q&*XDmneM>}LGdeWLdC zuO}>9pXGRT?!~6xlY-%;Zboz>3rAiKdx8&32HOj?T%+}})U{*n8<+PivGGmOu{wL* z3oT=H=W3t%Dlk1MN-BU~KH{e+RW*~naix@o;nF8bmaBZ-UZF2fCHG(OdtSNA(XMz> zG05-b-n-UeeZJxsipZ*wP$BA*&GxzmBh8;bz4^4gjlb%*_gE3py7LMD<&i1s8CXoh z|4i0q>*ZIV@lBGJ2=7lcA+0Y)5wTRN8}CJ;VJ`#qPa@Cg+k@VK4+o|YZYcDH7JYGQ z3oectIdtt@w9RGzt;%c9%m}Y|ixaiD&Q{fYYCI?VDe+>c|IK=MJJGEE(+)jxWY?AH zF*|WegZd*Tb|m#|uaBWIFU*0uE{SXko++F5UQY&54GoFfSCV$jo9O2T>ABi#{bbF} zyZTL++M_quZpP4(h+MWw{=6M@UfR7P=1HR~E{ob~_!yb1rV(b?a^s3hQE1f1_mm>y z9S;Og=S>^c^y-9ArVa9>@}1TlR?jRvgvf^ zL)Vo^PN5I3TWL;@oWk-5_b<8tL2ANZ^kBktaM_AAe9fhmlNeGE^oClASUd_%()tS| ztSWjhvn?F*joG5n>uI_qYAI@wWYF`<1}=jA>;*L5DNspyvWk8W%?~M@%j?$quHuj; ziBKA!p}dTh%~EO20jl>r)Xk};6CcG=YQmHXj0mIJI7XZEe$h)?vZWZd*Aeil^vP2H%}zwjXj-aH zNnT)R=;Nt{+ZQg1kJOu9_Iq{lc~P{ZNod4IR5!gPM+X034SlfMOw_Z{gdFBA14PnI z^9c7BB5bb}UYp1kj2KVHDO`+3zR^Zj1H3`O@jBb7<@NwEbjD@=4`a-a@fQQm!w0 zsXsRQ?ETT)i$;HkqBQ7qNWSfM`MsD9_GA;);F}XJ8oPGZ=d`8clc~XrG(fZJj66>6 zZOm0t{uo_e&CZCC+_5pq$Ys~kuI=O86ZIEh4u}cXqv{W;oOBH_~6P=A$k;c6+>DEnsGdO1F8> zo!0Z|!Qn`AN8`c(C3zGRABjei`Y|ewrrzw#n0SwiZubykS9L}CW|TFqc6-b|>ix)l z-xFUmqSOu6${RP-ut;-i3zU`|7d>5ogd!Ppv@cG#Bd&H8eWKn|;f_-1wr_h}TuIk9 zz`4wFdc0rAOBqU6=tU%1BU;^)FdIs9l50OOg%JCl{C;2_Y=pVr%@bB%u^;nIX4$aMnE?;C zbn1gQ&`be!z8vM*rDbBKIl=f-BEd@{l{bwkBHa4@GyS)vq?h%mB6gkM0;Xh!66Mg2 zL|+i~*db~dV$#%Vy1-uT)S(knmC6)M<|5}NMsfy%N#|ll$LR`i=@~Z=YHj>VN;+^W z3&R)pZEUrKfY}=Chrsd;o@{T(!{N*=nZ#3P(gbu;D$+;SDEx~iu6JJD*861MjrW-a zc~oOv9&*U(6oHJ2G*V6ZVe_P;*NJjp&cUUv7y(00PRV{+o157{&Va}b(Z02@BQ5OD z<%V9EcV+S11)vmM1~A#%h8R6Wf$>u=wy6l%CF2BJ4lCF3N2K-4uT&tORd)JJ^K>rQ z{!)-nk^_Ub-~%h6Kt|fTnc5VVetjBoF9ZfNQFafzMJI&B!dNe-9r4oWtQ^0T65+0Y z%Va!|X=vGy*esR^ms2B(!)1AycS=z}OM9)# z3R^E6ojg3vgIj0PzMC$Sx^fo`zLn0ZJWtl=($EH$mJ{_}vg` z&|0aQ)cbw-@w_845SJnHDvfjZ6F)OA%6po)_EPhvX#_~oLz)*Bv#87M04d}|v5s_1 zdzzi>n6P2*gwL>DA=b+D#BkY=x*AY2@AhKt!Q*U61*jaq!`d;qFTBR?9*>rL10GuC z_eGhK#%yF&*k1DVNgNZ$SyVTt3)&dH6)>@}=9qxjAOBPrO@0CMc%-u9J}|hy6$sZUg~!8e=%21nKLv!erG+=&Nw zg?e?PKVN*R$H{Cr>YS}qikKJi7*rHVY;gr{$WmwTM5HGxOT<}LI`%_rx2A0Pj@D5d znV@e8GSjb-@FhmG0Td@VDMWn)#XU8YtrEzD>(KVj<@{L%a)@LPVHw#&vK}WM_z&ff zNrN!twVaX**{KM%$ViAO?X&c@MpXJO7kdQEh8tSQ!eCW0+0-KWywhcI=yA%L?Rhn& z7PQC>r82iRp$^?K`M`5bJoYX)D|(Gt-C%5dMV)oMMGP8TCG2}7q38xH?NSey6=mTe zmdR%81kl;O`I7aB{cn(K@CO5rQ zk;Ks_NSv{;(rAWSM(NXYy`1m>{$egoM+@F_`r!|A?HX%NOBlzLVoXU{vyQWdi?V`g z609cUJtXt11a!^4C)NVD)&f@55?6iAty;uhmAI|Mi19SzY>x9sbC3!mYovNC&OD0m z=#BuZ$6E~$)=u&CBgK%EqstX!W%g`1ruZRJc{}kkX!@SHQh}RP z?YISbNp5b{YSPqswKJopxAvy*w&&=MMvA{Arg;`QdNs*-yEVa-SP7MIFhx4uK8g|MRe>EaTGcLGr9Od`Y?}4A3 z5*#xv4uS6O%I^2O>NpRsM-=|zB+mEgBQHcnsRM;)9yBVkHW&?wd>}?K;pjd4)CU6- z^i_!7fF{+lz_sq;pdOKYu*elNJD_qPEYjG5 z>=L7!PY&;=&d)C_n_q2l4aMFSegJ14rVw+nD>|a@s$+t^d)4HM0E7J zBlwo#DK5ske1mX@ZBsJNKr;vWGxp48-sj;p{CQcSCr!i0IQ*v6%a5e9Hbc2YKCU^? zOzQAwa*)+M%G1`?Yt|vdej0iYmDAA z%Mk8ZRtX_%#u)1vJ~!^B0@X;AHooqzoM8Pd&L5Ed-+a3#OZ z){Z#Ov!VtSki2_*9twyY53QdJ$J~@Inx~+)%H5-@@$ktq>+|xaBN5$O#IDOy?-v(mmrtv&)~9R(_YWw& z!EC+I4SM^BDwVO8ly$65a=n50RgT~O#CV7evB{`b#pm`DcFe8N_=!DW)m=F!UVE(P z^YTxa1F`>8YEEQXCe(E@;&DXl{C8OgJORGPOU|v6&|cpn{o;_+v|9b!<7Q1XuYyUz z#ubM2mFDYeOLB(=#?I*{^aq^yFY^B(gIsWuR2a=+chjS)=Z&4AQF%j>|1oOxv$9)A z{tp>bHy2#*uiEGwI+^cOyCC%$>=xpWlj$_gy%JJz&yH)*@ur{j@heK(JVMMILIQ&f z>yp9p-t8?$nH7*8tG7N6CN`U4{B>1CK`2ylRCtOpj#5MG{0TNiJ3Xq|z`K5Y?}8PI zHIzdPh4VXIYOE20ha&EeL_wKk^)BUF_+E^j>1{4=Exk~qqzKVf#O2*3KjD~L|31#& zD+9J3P0uG5zUG!N#7}d>Q^?R`x7+({cVu8YAQBx8Q?{<~xm(W6{%JXOih=I7A7{&D zxuKxEUCSNErq+zQx1~4%7Jgg;7acf}Nr~Z5{V7<&=C>?tYn`lh)<0&Aftgkva76 z)}$`Ap3~Vv^TV{py~o8St6LW;MQOQ5jyczg7>PH0ICOtuj*T;k^h1@O6*BG)*TzF~ zU%DVlE-S*0d!cS2=M^sdI<4H!Pw{VJzGgxyQm-pECB%%fAz`qTI&-N}i}J|HazxwI zC0gy^Al=o50D-9jN`CTMZ25igp=G-d34{f&lj7VSa{-sIlZTHW5TuOrZn;Ppjip}! zS(nJ-Qjt#_T;#N*OCFoys(7h@7Q((PRzUoeL{@jU;y4&}{>_AZ`ilY%TfJrK=yKpy zKL3jACS0G*UXgj!%-o@hK{R9fWE|tXDD|k43X}eAyKw;MqCeB%;oo2mrx$QxJJ)xT;52LTMFX9ea^Y7Cwbz{P z1;g-$$fl5s`+?zda;n-3)3!J*zU$_1%#8d&pH2tk7407j}DUSyJIP?bB`ck8j22-FJ`0 zrfuf1TgQ9tCVvhXW^Q)q3PY}AA#}6p3m-olgnYdE`OUFUGZ)^~e|qlzu4UqR$n};# zL>E_68dhtsZ1-H$`$6K_*kt#eYe4S0-wJEpEm;R1R)s1JrkagVf0b2Vz2_-k0k5_7 zH;N{+lu8hzW}y|CwItzEdt4uWJLRlrIdJ~rsDsQK1}-;|E9x1@oSh7mOK0Eq5LH$8 zkx-4jyPZAtdj?n^JB2EH{#tKR)Pm50ZI>1NY)4=w=e#dRM({|nx%&CH{Y5}iZ*3=S zeeoUeqN(02N=6i1uSeeDDSs_@bmxi5*~PHO&GHuv9&8bX3-RRfO1hig)=p1q(aVta z$~B`e1$}ffxm}?t7#DGDwEPq^bzqFQtwa3F@s@b|(Pr1pXVNWIjKqjJk%mmX?`0}J zg5Mt4_Z=16#0SMFL7AZ+EE1ZmFuFClOMT6JFF*TNhIpB~ru#y^mkCeUo9F!%)W80w z58gjdXLS$Fq2qr4Cp{dcLTvywSsr*Neezu0 z=b=l_JpWIT>xMBEUxBige?-`?D|nXjInCbHrN35ZiZNKutz-UwNw4L?_g?|~jC+I) z;Y}#t{jot932WAUxUBg34-J+8crb-d{C#VR#_}k|kSaJHxcnY{d!Gy&`)KI(J^Skq zWxUhJS~Hp1E$6nc6|TN-c&6#Qb2Rzz{13jVR^z8n9Q&TV>?>g5{vnBFNz!{MCiY=a zsO!qkp78BdRA|z|z}63rM9vno_H6Eiw!OX{2A9?kbj5 z5s`pBK;__7@245Wl8r_>e+3vmD6Uc{!0f96?vw>{CClZ$Q%P)N@2xAV7Jqwc`$Lz+ z`cHMGK4qgspE%@o(`sPIH^f)or`BT%bFznV^HfoDNg3g8NR@xCh>T9#=5uv-qkXjm zl9&Utn-*ZBQUO>U$>%N}4=bcjCHI_OjAakcsM52Lwk#T53lGb-csYEMEsUb)(z-O8 z!LVD1m%!Z(1#)j@gRSF}_m;C}v|>707cf zaL263U7edbQJx~Fho#d?@>mecR>8)G37Q}>rTY?>q-)PT1OoZ}<2RS}9C7&*5yQ6( z*jjt0W%-CYL@0w9IBt9yJiJPQ_7PJb0$H)BGXqaNvjEa3zDYL_F!LuA;3x)1+Njs@ z+EyP#Mo;-&5?(eGC*#)|a#V*wVN>p=Ty4h#5M(7hVGMWo^>MPz4Q-jzdGAl$w)xa8t) z&1go3RO@R`v=wWB3oUSt*-XF#M;Dl`Y$`8i;C0m7hj7r05h8mFW3;rC!(dyrbrTZn zMyp|D6lM~XTd19{QMqu-;uD!Jc?!f5;W?*(M zDNpj4MfD)>#vy3rg{z=O7v-G(oOa<6EdhHqVpBh6wQ=RDdyu&{dJwN(Cj;Y@tzo(G zOqWRX!xk2AZkdjdp7IUKQ<|^}b&LE%CaDk#TE@wWSY1!0;+X8@_Q*;QmNJGe_fDFP z0VJ~&ns{9{HnD~j)Inbl#`p7j={^7nMGa&1P`gLiPIgV7QbS@EUFV5}gfR1w#RJCLl}|lPs7$?aZT84woVL5ki7* z9UdUEGCtz@^|}FY{%w5evATd5XuQ(Q3HHn0@?dMtp4jz|-=Y;aO2g^T%(|YD^{f$^ zS_9_C=3Q0T9H2+IL|YWAn-!`{SC`tJO7KVBOq4-pVwkUSlppT|jY0=7m3O#4LVJ|djI^XzkQUtLw{S@X1@_;PAI}T-u&4!>kIU+ge&Kr+_K;bd zQJdGBc2~y#qO$yBOK>tB4lE_;%OY#dElFNs?s%Np;yvvc8L3hUbq$GCYlG;Uc3x{M z;+6$xXoQ!5S0g92LALZ7d30PSbK71=O@5lB$D{ngOZkzFT(u0eHN{EpT&xWIhGiX{ znZhO2DxM2wfyap%KRG^@hZax4VikuiL!p8+&@1Nhn^P8dt!|0>un#3hK)oF)VJea%xD(4B^SF;v{IYF#LU;cZ1T~wQnryt32M_R5mIST~ zGK!62X%#7~S9Sgtw+!Im3Gk9FE|WKaht1vSd7 zFI9C3K#MYh^s}&eQz*$E1EO^>cB*^o#(~pqA-%HCxr2ydvXqz$df+HUs_2aoPG6V$ z_3ek6D~oi&qAy2Gvx#+A^XC_q2pcEo5s6gvzXf{xY?^BUJ5#0c#opmRlH;Uuj;JI#7614=aL`zf z%`nL8&Wp@<6~cv^BOhKpDN4(8{S<~{wcce%!J5N1q*QN1ZVoiV4FMx8+f`H;D!;^g zlk#9xjAAH`P2O(RWU%yH%a5xN1(^m4O|18b&s=8Xnk!MXvMVz{RROM@#4q|$r@e7E z2a-c23U}=x_a5H9vD;s*CO%!4r@FM5PA7qls3c_Qk=12h!HR5FVKMvGhJ4H44KIx%h28 zs>+>_sjq;+%IzeB6$8R@Cxkgt~Q7Ve% zf4F8z0AH@(oO2xsasH70LSWc(t#YDK&Q~wa;~+*)L2v^!84tLC(&u(Ds2u zbFGlj*l$wT>nu0k?&25T@ABG!A9939Dt{ogS_Or_?)~U=LHt-Y+hDSb#!aqADc=!b z>xNXrS1N`a4!#QPH@+YiHVIR{57%ydNfT4Cl6TITXV!()B_loPPbNA?8Fu3_&B!;M z#FaMo=$zCS>G|CsB2dnm%Ot~Sk4+(Fn?dHfVacRx^&CEYoroUlMz0Ic$>sLTF#zkvV-|y~CE;ES>k^nKC&8 zJlAMGv_51GZXkPitccZ2FBwre9{Ef7;1kbxZf91v;;qfO;m>coxoU2S^9KSD* zYznMQC{x}!h6hiX+!c`-w^ky@T)YvicygDchj3wfb5-%=9?vP-#}K2g)nP6ZB#&ss zV>HNPER*Q4iiNTdRG6vsU2iaqGMWh#R4(YTR904Kr$?OjbKEg@|kkHktfxghmaNppN@)Ofco!!cOpdOUr2G%>BUJpS$H z5#Qya{x#>I0f}TMsWpqnl5=^P{KbcaO*v<$z>;YzzR>|~5$`DIKwg%y_hqT5`;0$4 zWn-~!vxPNUOe)^utIl~-Urtx4?oQb7;hA#Es*txqJb>~#R9GaW6MhG@YJpfh3}b)z zSQxTiT#;wgMxa%+j7P^f23QQp*jCab`l`&{C}AeVy~IUYc} zU^$!FolfNPcT1$OZQF|WR@i{vIIGE@zb(;vqxsr{$nW^8IoszXO=u{Wt(e)uWGJm*w zSUl3cJVP0ak$yUO!+%hs=Vc&To`2Ni>V! z@|a$hFH1HZp3teFP@>~iqVtQFQ1^@C>31wg7u6`Q=Mo8prPNCb>jkG9qGoKH1*+`G zq)ki1U(@F`K$;o>d<*<6v!U;+QK3;Ha?5Dpf@HeO4V( =7CJkywT(@7iQ{ys@+} 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 Fn*i!zGI4gKLoB?(V@I5;Q;vZ@9T{ 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 - -The first line shows the current and remaining state. The next button -will be enabled, once the form has all required fields filled. - -Required is either a description or a selected file. If one of these -things is given, the next step “Upload” will be available. - -The description field allows to add rich text using [markdown](http://daring-fireball.net). You -can see what is possible by clicking the small “Markdown” link above -the description field. This will show some syntax help, any click on -this text gets you back to the form. - -The button “Description Editor” opens a editor in a single page for -the description. It is a split screen with two elements: the left is -the input for the description and on the right a preview is -rendered. You can see what your markdown looks like on the page while -you are typing. - - - -If you click “Back” you get back to the form and the description field -contains the text from the editor. - -The description also allows to reference the uploaded files. It is -processed as a [mustache](http://mustache.github.io/mustache.5.html) template where certain properties, like -the url, of the files can be rendered into the description. Please -refer to the [concepts](concepts.md) page for details. - -The other fields are as expected. You can set the validity time, -maximum downloads and a password. You can click “Generate” to generate -a random one. It is shown in clear text if you click on -“Show”. Finally, you can click on “Add Files” to select files to -upload. Selected files are summarized in the box below. You can also -drop files into that box to select them for upload. - -If you click on “Reset” on the upper left, the form is resetted. Every -value and all files are removed. - -Then if everything looks good, you can click on “Upload”. This will -first save the description and other meta data and then all files are -being uploaded. - -The screen (when completed) looks like this: - - - -If the upload fails for some reason, it is retried automatically. You -can also click “Pause” to pause the upload and resume later. When -complete, you can choos to either publish it or cancel (or doing -nothing). Clicking “Cancel” will delete the files you just uploaded on -the server. Clicking “Publish” will publish the upload and you are -taken to the _Download page_. - - - -If the description has been left empty, a default headline “Your -Upload” is rendered. Then you see a summary of the upload and all its -files in a list. Clicking on a file opens/downloads it. Since you are -the owner of the upload, all the accesses won't count the “max -download” field. You'll also see a link to the “public download -page”. These pages are distinguished by id, the private download pages -uses a `uid` in the url and the public page a `id`. Both are different -ids refering to the same page. The public download page link is ment -to be shared. - -You can click on “Send Email” to get to a view where a simple text -email is being prepared. You only need to add recipients, or maybe -change the mail. - - - -You can also decide to _unpublish_ an upload. Then only you as the -owner can see it. The public download page will not work and anonymous -user cannot access the files. - - - - -## Manage Uploads - -The “Uploads” link in the top bar takes you to your list of uploads. - - - -This is a simple table containing all uploads you have done and those -that were uploaded for you. They can be filtered by the dropdown -above: _incoming_ are those uploads that came in via an alias page, -while _outgoing_ means all uploads from you. - -You can delete them with the “Delete” button or click on the id to get -to the _Download page_. - - -## Manage Aliases - -The “Aliases” link in the top bar takes you to your list of aliases. - - - -If you click on _New Alias_ a new alias is generated and added to the -table. - -An alias has properties from the upload form that are added to every -upload coming from this alias. You can change them via the _Edit_ -button. You can also disable an alias without deleting it. - -As with uploads, the link to the alias pages are ment to be shared so -other people can send files to you. Clicking on “Email”, opens a email -form analog to the upload form so you can send this link to others. - - - - -## Manage Accounts - -If you are logged in as an admin user, you can manage accounts. Click -on the _Edit Accounts_ link in the navigation bar. This opens the -following page: - - - -The text box allows to search for users by login. If you click on -proposed item, it is loaded into the account form and you can modify -it. - - - -If you want to create new account, search for a login name that -doesn't exist and click on the _Create new account_ button. - - - -Then the same form opens and allows to add a new account. diff --git a/elm-analyse.json b/elm-analyse.json new file mode 100644 index 00000000..f480c705 --- /dev/null +++ b/elm-analyse.json @@ -0,0 +1,8 @@ +{ + "excludedPaths": [ + "modules/webapp/target/elm-src/" + ], + "checks" : { + "ImportAll": false + } +} diff --git a/elm-package.json b/elm-package.json new file mode 120000 index 00000000..eb4d89bd --- /dev/null +++ b/elm-package.json @@ -0,0 +1 @@ +elm.json \ No newline at end of file diff --git a/elm.json b/elm.json new file mode 100644 index 00000000..f69940f3 --- /dev/null +++ b/elm.json @@ -0,0 +1,35 @@ +{ + "type": "application", + "source-directories": [ + "modules/webapp/src/main/elm", + "modules/webapp/target/elm-src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "NoRedInk/elm-json-decode-pipeline": "1.0.0", + "elm/browser": "1.0.1", + "elm/core": "1.0.2", + "elm/file": "1.0.5", + "elm/html": "1.0.0", + "elm/http": "2.0.0", + "elm/json": "1.1.3", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm-explorations/markdown": "1.0.0", + "pablohirafuji/elm-qrcode": "3.1.1", + "ryannhg/date-format": "2.3.0" + }, + "indirect": { + "elm/bytes": "1.0.8", + "elm/regex": "1.0.0", + "elm/svg": "1.0.1", + "elm/virtual-dom": "1.0.2", + "elm-community/list-extra": "8.2.2" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/modules/backend/src/main/scala/sharry/backend/BackendApp.scala b/modules/backend/src/main/scala/sharry/backend/BackendApp.scala new file mode 100644 index 00000000..0d47e16f --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/BackendApp.scala @@ -0,0 +1,64 @@ +package sharry.backend + +import cats.effect.{Blocker, ConcurrentEffect, ContextShift, Resource, Timer} +import sharry.backend.auth.Login +import sharry.store.Store + +import scala.concurrent.ExecutionContext +import sharry.backend.signup.OSignup +import sharry.backend.account._ +import sharry.backend.alias.OAlias +import sharry.backend.share.OShare +import sharry.backend.job.PeriodicCleanup +import sharry.backend.mail.OMail +import emil.javamail.JavaMailEmil + +trait BackendApp[F[_]] { + + def login: Login[F] + + def signup: OSignup[F] + + def account: OAccount[F] + + def alias: OAlias[F] + + def share: OShare[F] + + def mail: OMail[F] +} + +object BackendApp { + + def create[F[_]: ConcurrentEffect: Timer: ContextShift]( + cfg: Config, + blocker: Blocker, + store: Store[F] + ): Resource[F, BackendApp[F]] = + for { + accountImpl <- OAccount[F](store) + loginImpl <- Login[F](accountImpl) + signupImpl <- OSignup[F](store) + aliasImpl <- OAlias[F](store) + shareImpl <- OShare[F](store, cfg.share) + mailImpl <- OMail[F](store, cfg.mail, JavaMailEmil[F](blocker)) + } yield new BackendApp[F] { + val login: Login[F] = loginImpl + val signup: OSignup[F] = signupImpl + val account: OAccount[F] = accountImpl + val alias: OAlias[F] = aliasImpl + val share: OShare[F] = shareImpl + val mail: OMail[F] = mailImpl + } + + def apply[F[_]: ConcurrentEffect: ContextShift: Timer]( + cfg: Config, + connectEC: ExecutionContext, + blocker: Blocker + ): Resource[F, BackendApp[F]] = + for { + store <- Store.create(cfg.jdbc, connectEC, blocker, true) + backend <- create(cfg, blocker, store) + _ <- PeriodicCleanup.resource(cfg.cleanup, store) + } yield backend +} diff --git a/modules/backend/src/main/scala/sharry/backend/Common.scala b/modules/backend/src/main/scala/sharry/backend/Common.scala new file mode 100644 index 00000000..8b29bd1b --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/Common.scala @@ -0,0 +1,11 @@ +package sharry.backend + +import cats.effect.Sync +import org.mindrot.jbcrypt.BCrypt + +object Common { + + def genSaltString[F[_]: Sync]: F[String] = + Sync[F].delay(BCrypt.gensalt()) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/Config.scala b/modules/backend/src/main/scala/sharry/backend/Config.scala new file mode 100644 index 00000000..d2e4c9a6 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/Config.scala @@ -0,0 +1,19 @@ +package sharry.backend + +import sharry.store.JdbcConfig +import sharry.backend.signup.SignupConfig +import sharry.backend.auth.AuthConfig +import sharry.backend.share.ShareConfig +import sharry.backend.job.CleanupConfig +import sharry.backend.mail.MailConfig + +case class Config( + jdbc: JdbcConfig, + signup: SignupConfig, + auth: AuthConfig, + share: ShareConfig, + cleanup: CleanupConfig, + mail: MailConfig +) + +object Config {} diff --git a/modules/backend/src/main/scala/sharry/backend/PasswordCrypt.scala b/modules/backend/src/main/scala/sharry/backend/PasswordCrypt.scala new file mode 100644 index 00000000..923909bc --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/PasswordCrypt.scala @@ -0,0 +1,15 @@ +package sharry.backend + +import sharry.common.Password +import org.mindrot.jbcrypt.BCrypt + +object PasswordCrypt { + + def crypt(pass: Password): Password = + if (pass.isEmpty) pass + else Password(BCrypt.hashpw(pass.pass, BCrypt.gensalt())) + + def check(plain: Password, hashed: Password): Boolean = + hashed.nonEmpty && plain.nonEmpty && BCrypt.checkpw(plain.pass, hashed.pass) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/account/AccountItem.scala b/modules/backend/src/main/scala/sharry/backend/account/AccountItem.scala new file mode 100644 index 00000000..932f4eb0 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/account/AccountItem.scala @@ -0,0 +1,5 @@ +package sharry.backend.account + +import sharry.store.records.RAccount + +case class AccountItem(acc: RAccount, shares: Int) diff --git a/modules/backend/src/main/scala/sharry/backend/account/NewAccount.scala b/modules/backend/src/main/scala/sharry/backend/account/NewAccount.scala new file mode 100644 index 00000000..323d7aa1 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/account/NewAccount.scala @@ -0,0 +1,38 @@ +package sharry.backend.account + +import cats.effect.Sync +import cats.implicits._ + +import sharry.common._ + +case class NewAccount( + id: Ident, + login: Ident, + source: AccountSource, + state: AccountState = AccountState.Active, + password: Password = Password.empty, + email: Option[String] = None, + admin: Boolean = false +) { + + def validate: Either[String, NewAccount] = + if (id.isEmpty) Left("An id is required") + else if (login.isEmpty) Left("A login name is required") + else Right(this) +} + +object NewAccount { + + def create[F[_]: Sync]( + login: Ident, + source: AccountSource, + state: AccountState = AccountState.Active, + password: Password = Password.empty, + email: Option[String] = None, + admin: Boolean = false + ): F[NewAccount] = + for { + id <- Ident.randomId[F] + } yield NewAccount(id, login, source, state, password, email, admin) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/account/OAccount.scala b/modules/backend/src/main/scala/sharry/backend/account/OAccount.scala new file mode 100644 index 00000000..5c301a1a --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/account/OAccount.scala @@ -0,0 +1,151 @@ +package sharry.backend.account + +import cats.effect._ +import cats.implicits._ +import doobie._ +import org.log4s._ +import fs2.Stream + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.PasswordCrypt +import sharry.store.Store +import sharry.store.AddResult +import sharry.store.records.{ModAccount, RAccount} +import cats.data.OptionT + +trait OAccount[F[_]] { + + def create(acc: NewAccount): F[AddResult] + + def modify(id: Ident, acc: ModAccount): F[AddResult] + + def updateLoginStats(acc: AccountId): F[Unit] + + def createIfMissing(acc: NewAccount): F[Ident] + + def findAccounts(loginQuery: String): Stream[F, AccountItem] + + def findById(id: Ident): F[Option[RAccount]] + + def findDetailById(id: Ident): F[Option[AccountItem]] + + def findByLogin(login: Ident): F[Option[RAccount]] + + def setEmail(id: Ident, email: Option[String]): F[AddResult] + + def changePassword(id: Ident, oldPw: Password, newPw: Password): F[AddResult] + + def findByAlias(alias: Ident): OptionT[F, RAccount] +} + +object OAccount { + private[this] val logger = getLogger + + def apply[F[_]: Effect](store: Store[F]): Resource[F, OAccount[F]] = + Resource.pure(new OAccount[F] { + + def changePassword(id: Ident, oldPw: Password, newPw: Password): F[AddResult] = { + val update = + store + .transact(RAccount.updatePassword(id, PasswordCrypt.crypt(newPw))) + .attempt + .map(AddResult.fromUpdateExpectChange("Account not found.")) + + val wrongPassword: AddResult = + AddResult.Failure(new Exception("Password is wrong.")) + + val notInternal: AddResult = + AddResult.Failure(new Exception("Not an internal account.")) + + val change = for { + acc <- OptionT(findById(id)) + pwmatch = PasswordCrypt.check(oldPw, acc.password) + intern = acc.source == AccountSource.Intern + res <- if (!intern) OptionT.some[F](notInternal) + else if (!pwmatch) OptionT.some[F](wrongPassword) + else OptionT.liftF(update) + } yield res + + change.getOrElse(AddResult.Failure(new Exception("Account not found"))) + } + + def setEmail(id: Ident, email: Option[String]): F[AddResult] = + store.transact(RAccount.setEmail(id, email)).attempt.map(AddResult.fromEither) + + def findByLogin(login: Ident): F[Option[RAccount]] = + store.transact(RAccount.findByLogin(login)) + + def findById(id: Ident): F[Option[RAccount]] = + store.transact(RAccount.findById(id)) + + def findDetailById(id: Ident): F[Option[AccountItem]] = + store.transact(Queries.findById(id)) + + def findAccounts(loginQuery: String): Stream[F, AccountItem] = + store.transact(Queries.findAll(loginQuery)) + + def modify(id: Ident, acc: ModAccount): F[AddResult] = + store + .transact(RAccount.update(id, acc.copy(password = acc.password.map(cryptPw)))) + .attempt + .map(AddResult.fromUpdateExpectChange("Account not found.")) + + def create(acc: NewAccount): F[AddResult] = { + val pw = PasswordCrypt.crypt(acc.password) + + def record: F[RAccount] = + for { + now <- Timestamp.current[F] + u = RAccount( + acc.id, + acc.login, + acc.source, + acc.state, + pw, + acc.email, + acc.admin, + 0, + None, + now + ) + } yield u + + def insert(user: RAccount): ConnectionIO[Int] = + RAccount.insert(user) + + def accountExists: ConnectionIO[Boolean] = + RAccount.existsByLogin(acc.login) + + acc.validate.fold( + err => (AddResult.Failure(new Exception(err)): AddResult).pure[F], + _ => { + val msg = s"The account '${acc.login.id}' already exists." + for { + acc <- record + save <- store.add(insert(acc), accountExists) + } yield save.fold(identity, _.withMsg(msg), identity) + } + ) + } + + def updateLoginStats(acc: AccountId): F[Unit] = + store.transact(RAccount.updateStatsById(acc.id)).map(_ => ()) + + def createIfMissing(acc: NewAccount): F[Ident] = + create(acc).flatMap { + case AddResult.Success => acc.id.pure[F] + case AddResult.EntityExists(msg) => + logger.fdebug[F](msg) *> + store.transact(RAccount.findByLogin(acc.login)).map(_.map(_.id).getOrElse(acc.id)) + case AddResult.Failure(ex) => + Effect[F].raiseError(ex) + } + + def findByAlias(alias: Ident): OptionT[F, RAccount] = + OptionT(store.transact(RAccount.findByAlias(alias))) + }) + + private def cryptPw(pw: Password): Password = + PasswordCrypt.crypt(pw) +} diff --git a/modules/backend/src/main/scala/sharry/backend/account/Queries.scala b/modules/backend/src/main/scala/sharry/backend/account/Queries.scala new file mode 100644 index 00000000..b232f8d9 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/account/Queries.scala @@ -0,0 +1,44 @@ +package sharry.backend.account + +import fs2.Stream +import doobie._, doobie.implicits._ + +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ +import sharry.store.records._ + +object Queries { + + def findAll(loginQ: String): Stream[ConnectionIO, AccountItem] = { + val aLogin = "a" :: RAccount.Columns.login + + val q = + if (loginQ.isEmpty) Fragment.empty + else aLogin.like("%" + loginQ + "%") + + findAccountFragment(q).stream + } + + def findById(id: Ident): ConnectionIO[Option[AccountItem]] = { + val aId = "a" :: RAccount.Columns.id + findAccountFragment(aId.is(id)).option + } + + def findByLogin(login: Ident): ConnectionIO[Option[AccountItem]] = { + val aLogin = "a" :: RAccount.Columns.login + findAccountFragment(aLogin.is(login)).option + } + + private def findAccountFragment(where: Fragment): Query0[AccountItem] = { + val aId = "a" :: RAccount.Columns.id + val sAcc = "s" :: RShare.Columns.accountId + val sId = "s" :: RShare.Columns.id + + val cols = RAccount.Columns.all.map("a" :: _).map(_.f) :+ fr"COUNT(" ++ sId.f ++ fr") as shares" + val from = RAccount.table ++ fr"a LEFT OUTER JOIN" ++ RShare.table ++ fr"s ON" ++ aId.is(sAcc) ++ fr"GROUP BY" ++ aId.f + + Sql.selectSimple(Sql.commas(cols), from, where).query[AccountItem] + } + +} diff --git a/modules/backend/src/main/scala/sharry/backend/alias/OAlias.scala b/modules/backend/src/main/scala/sharry/backend/alias/OAlias.scala new file mode 100644 index 00000000..2bbfe3d0 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/alias/OAlias.scala @@ -0,0 +1,59 @@ +package sharry.backend.alias + +import cats.effect._ +import cats.implicits._ +import org.log4s._ +import fs2.Stream + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.Store +import sharry.store.AddResult +import sharry.store.records.RAlias + +trait OAlias[F[_]] { + + def create(alias: RAlias): F[AddResult] + + def createF(alias: F[RAlias]): F[AddResult] + + def modify(aliasId: Ident, accId: Ident, alias: RAlias): F[AddResult] + + def findAll(accId: Ident, nameQuery: String): Stream[F, RAlias] + + def findById(id: Ident, accId: Ident): F[Option[RAlias]] + + def delete(id: Ident, accId: Ident): F[Boolean] +} + +object OAlias { + private[this] val logger = getLogger + + def apply[F[_]: Effect](store: Store[F]): Resource[F, OAlias[F]] = + Resource.pure(new OAlias[F] { + def create(alias: RAlias): F[AddResult] = + store.add(RAlias.insert(alias), RAlias.existsById(alias.id)) + + def createF(alias: F[RAlias]): F[AddResult] = + alias.flatMap(create) + + def modify(aliasId: Ident, accId: Ident, alias: RAlias): F[AddResult] = { + val exists = RAlias.existsById(alias.id) + val modify = RAlias.update(aliasId, accId, alias) + for { + _ <- logger.fdebug(s"Modify alias '${aliasId.id}' to $alias") + res <- store.add(modify, exists) + } yield res + } + + def findAll(accId: Ident, nameQuery: String): Stream[F, RAlias] = + store.transact(RAlias.findAll(accId, nameQuery)) + + def findById(id: Ident, accId: Ident): F[Option[RAlias]] = + store.transact(RAlias.findById(id, accId)) + + def delete(id: Ident, accId: Ident): F[Boolean] = + store.transact(RAlias.delete(id, accId)).map(_ > 0) + }) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/AuthConfig.scala b/modules/backend/src/main/scala/sharry/backend/auth/AuthConfig.scala new file mode 100644 index 00000000..3457e37c --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/AuthConfig.scala @@ -0,0 +1,70 @@ +package sharry.backend.auth +import scodec.bits.ByteVector +import sharry.common._ + +case class AuthConfig( + serverSecret: ByteVector, + sessionValid: Duration, + fixed: AuthConfig.Fixed, + http: AuthConfig.Http, + httpBasic: AuthConfig.HttpBasic, + command: AuthConfig.Command, + internal: AuthConfig.Internal, + oauth: Seq[AuthConfig.OAuth] +) + +object AuthConfig { + + case class Fixed(enabled: Boolean, user: Ident, password: Password, order: Int) + + case class Http( + enabled: Boolean, + url: LenientUri, + method: String, + body: String, + contentType: String, + order: Int + ) + + case class HttpBasic(enabled: Boolean, url: LenientUri, method: String, order: Int) + + case class Command( + enabled: Boolean, + program: Seq[String], + success: Int, + order: Int + ) + + case class Internal(enabled: Boolean, order: Int) + + case class OAuth( + id: Ident, + enabled: Boolean, + name: String, + authorizeUrl: LenientUri, + tokenUrl: LenientUri, + userUrl: LenientUri, + userIdKey: String, + clientId: String, + clientSecret: String, + icon: Option[String] + ) + + object OAuth { + + def github(clientId: String, clientSecret: String): OAuth = + OAuth( + Ident.unsafe("github"), + true, + "Github", + LenientUri.unsafe("https://github.com/login/oauth/authorize"), + LenientUri.unsafe("https://github.com/login/oauth/access_token"), + LenientUri.unsafe("https://api.github.com/user"), + "login", + clientId, + clientSecret, + Some("github") + ) + } + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/AuthToken.scala b/modules/backend/src/main/scala/sharry/backend/auth/AuthToken.scala new file mode 100644 index 00000000..5b367850 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/AuthToken.scala @@ -0,0 +1,79 @@ +package sharry.backend.auth + +import java.time.Instant + +import cats.effect._ +import cats.implicits._ +import javax.crypto.Mac +import javax.crypto.spec.SecretKeySpec +import scodec.bits.ByteVector +import sharry.backend.Common +import sharry.backend.auth.AuthToken._ +import sharry.common.{AccountId, Duration} + +case class AuthToken(millis: Long, account: AccountId, salt: String, sig: String) { + def asString = s"$millis-${b64enc(account.asString)}-$salt-$sig" + + def sigValid(key: ByteVector): Boolean = { + val newSig = AuthToken.sign(this, key) + AuthToken.constTimeEq(sig, newSig) + } + def sigInvalid(key: ByteVector): Boolean = + !sigValid(key) + + def notExpired(validity: Duration): Boolean = + !isExpired(validity) + + def isExpired(validity: Duration): Boolean = { + val ends = Instant.ofEpochMilli(millis).plusMillis(validity.millis) + Instant.now.isAfter(ends) + } + + def validate(key: ByteVector, validity: Duration): Boolean = + sigValid(key) && notExpired(validity) +} + +object AuthToken { + private val utf8 = java.nio.charset.StandardCharsets.UTF_8 + + def fromString(s: String): Either[String, AuthToken] = + s.split("\\-", 4) match { + case Array(ms, as, salt, sig) => + for { + millis <- asInt(ms).toRight("Cannot read authenticator data") + acc <- b64dec(as).toRight("Cannot read authenticator data") + accId <- AccountId.parse(acc) + } yield AuthToken(millis, accId, salt, sig) + + case _ => + Left("Invalid authenticator") + } + + def user[F[_]: Sync](accountId: AccountId, key: ByteVector): F[AuthToken] = + for { + salt <- Common.genSaltString[F] + millis = Instant.now.toEpochMilli + cd = AuthToken(millis, accountId, salt, "") + sig = sign(cd, key) + } yield cd.copy(sig = sig) + + private def sign(cd: AuthToken, key: ByteVector): String = { + val raw = cd.millis.toString + cd.account.asString + cd.salt + val mac = Mac.getInstance("HmacSHA1") + mac.init(new SecretKeySpec(key.toArray, "HmacSHA1")) + ByteVector.view(mac.doFinal(raw.getBytes(utf8))).toBase64 + } + + private def b64enc(s: String): String = + ByteVector.view(s.getBytes(utf8)).toBase64 + + private def b64dec(s: String): Option[String] = + ByteVector.fromValidBase64(s).decodeUtf8.toOption + + private def asInt(s: String): Option[Long] = + Either.catchNonFatal(s.toLong).toOption + + private def constTimeEq(s1: String, s2: String): Boolean = + s1.zip(s2).foldLeft(true)({ case (r, (c1, c2)) => r & c1 == c2 }) & s1.length == s2.length + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/CommandAuth.scala b/modules/backend/src/main/scala/sharry/backend/auth/CommandAuth.scala new file mode 100644 index 00000000..020388ae --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/CommandAuth.scala @@ -0,0 +1,69 @@ +package sharry.backend.auth + +import cats.data.Kleisli +import cats.effect._ +import cats.implicits._ +import org.log4s.getLogger +import yamusca.imports._ +import yamusca.implicits._ +import scala.sys.process._ + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.account.OAccount + +final class CommandAuth[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]) { + + private[this] val logger = getLogger + + def login: LoginModule[F] = + LoginModule.whenEnabled(cfg.command.enabled)( + Kleisli( + up => + Ident.fromString(up.user) match { + case Right(login) => + def okResult: F[LoginResult] = + HttpAuth + .addAccount(login, oacc) + .flatMap( + accId => AuthToken.user(accId, cfg.serverSecret).map(LoginResult.ok) + ) + + for { + _ <- logger.fdebug(s"CommandAuth: starting login $up") + res <- runCommand(up, cfg.command) + resp <- if (res) okResult else LoginResult.invalidAuth.pure[F] + _ <- logger.fdebug(s"CommandAuth: $up => $resp") + } yield resp + + case Left(err) => + logger.fdebug(s"CommandAuth: failed.") *> + LoginResult.invalidAuth.pure[F] + } + ) + ) + + def runCommand(up: UserPassData, cfg: AuthConfig.Command): F[Boolean] = Effect[F].delay { + val prg = cfg.program. + map(s => mustache.parse(s) match { + case Right(tpl) => + up.render(tpl) + case Left(err) => + logger.warn(s"Error in command template '$s': $err") + s + }) + + val result = Either.catchNonFatal(Process(prg).!) + logger.debug(s"Result of external auth command: $result") + result == Right(cfg.success) + } + + def withPosition: (Int, LoginModule[F]) = (cfg.command.order, login) + +} + +object CommandAuth { + + def apply[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]): CommandAuth[F] = + new CommandAuth[F](cfg, oacc) +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/FixedAuth.scala b/modules/backend/src/main/scala/sharry/backend/auth/FixedAuth.scala new file mode 100644 index 00000000..d296152a --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/FixedAuth.scala @@ -0,0 +1,64 @@ +package sharry.backend.auth + +import cats.effect._ +import cats.implicits._ +import org.log4s._ +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.account._ + +/** Provides authentication from the configuration. + * + * This simply compares the password agains the fix string in the + * config, but only if the username matches. Otherwise it let's the + * next login module try to authenticate. + * + * Note that this login module does ignore the AccountState on + * purpose. The config file should not really be used, but serves as + * a fallback to easily access the application in case other + * authentication is not possible. + */ +final class FixedAuth[F[_]: Effect](cfg: AuthConfig, op: OAccount[F]) { + + private[this] val logger = getLogger + + def login: LoginModule[F] = + LoginModule { up => + if (!cfg.fixed.enabled || up.user != cfg.fixed.user.id) (None: Option[LoginResult]).pure[F] + else if (up.pass == cfg.fixed.password) { + for { + _ <- logger.fdebug(s"Fixed auth: success for user ${cfg.fixed.user}") + id <- addAccount(cfg.fixed) + token <- AuthToken.user(id, cfg.serverSecret) + } yield LoginResult.ok(token).some + } else { + logger.fdebug("Fixed auth: failed.") *> + Option(LoginResult.invalidAuth).pure[F] + } + } + + private def addAccount(cfg: AuthConfig.Fixed): F[AccountId] = + for { + acc <- NewAccount.create[F]( + cfg.user, + AccountSource.Extern, + AccountState.Active, + Password.empty, + None, + true + ) + id <- op + .createIfMissing(acc) + .map(id => AccountId(id, cfg.user, true, None)) + .flatTap(accId => op.updateLoginStats(accId)) + + } yield id + + def withPosition: (Int, LoginModule[F]) = (cfg.fixed.order, login) + +} + +object FixedAuth { + def apply[F[_]: Effect](cfg: AuthConfig, op: OAccount[F]): FixedAuth[F] = + new FixedAuth[F](cfg, op) +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/HttpAuth.scala b/modules/backend/src/main/scala/sharry/backend/auth/HttpAuth.scala new file mode 100644 index 00000000..235ba323 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/HttpAuth.scala @@ -0,0 +1,113 @@ +package sharry.backend.auth + +import cats.data.Kleisli +import cats.effect._ +import cats.implicits._ +import org.log4s.getLogger + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.account.OAccount +import sharry.backend.account.NewAccount +import yamusca.imports._ +import yamusca.implicits._ +import java.net.HttpURLConnection +import java.nio.charset.StandardCharsets + +final class HttpAuth[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]) { + + private[this] val logger = getLogger + + def login: LoginModule[F] = + LoginModule.whenEnabled(cfg.http.enabled)( + Kleisli( + up => + Ident.fromString(up.user) match { + case Right(login) => + def okResult: F[LoginResult] = + HttpAuth.addAccount(login, oacc).flatMap( + accId => AuthToken.user(accId, cfg.serverSecret).map(LoginResult.ok) + ) + + for { + _ <- logger.fdebug(s"HttpAuth: starting login $up") + res <- executeReq(up, cfg.http) + resp <- if (res) okResult else LoginResult.invalidAuth.pure[F] + _ <- logger.fdebug(s"HttpAuth: $up => $resp") + } yield resp + + case Left(err) => + logger.fdebug(s"HttpAuth: failed.") *> + LoginResult.invalidAuth.pure[F] + } + ) + ) + + private def executeReq(up: UserPassData, cfg: AuthConfig.Http): F[Boolean] = { + val url = mustache.parse(cfg.url.asString). + leftMap(_.toString). + map(up.render). + flatMap(LenientUri.parse) + + url.flatMap(_.open) match { + case Right(res) => + res.use( + conn => + Effect[F].delay { + conn.setRequestMethod(cfg.method) + if (cfg.method.equalsIgnoreCase("post")) { + conn.setDoOutput(true) + conn.setRequestProperty("Content-Type", cfg.contentType) + + val body = mustache.parse(cfg.body) match { + case Right(tpl) => + up.render(tpl) + case Left(err) => + logger.warn(s"Invalid mustache template for http body: $err") + cfg.body + } + val outs = conn.getOutputStream() + outs.write(body.getBytes(StandardCharsets.UTF_8)) + outs.flush() + outs.close() + } + conn.connect() + + val code = conn.asInstanceOf[HttpURLConnection].getResponseCode() + code >= 200 && code <= 299 + } + ) + + case Left(err) => + logger.fwarn(s"Invalid url for http-basic-auth '${cfg.url.asString}': $err").map(_ => false) + } + } + + def withPosition: (Int, LoginModule[F]) = (cfg.http.order, login) + +} + +object HttpAuth { + + def apply[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]): HttpAuth[F] = + new HttpAuth[F](cfg, oacc) + + + def addAccount[F[_]: Sync](user: Ident, oacc: OAccount[F]): F[AccountId] = + for { + acc <- NewAccount.create[F]( + user, + AccountSource.extern, + AccountState.Active, + Password.empty, + None, + false + ) + id <- oacc + .createIfMissing(acc) + .map(id => AccountId(id, user, true, None)) + .flatTap(accId => oacc.updateLoginStats(accId)) + + } yield id + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/HttpBasicAuth.scala b/modules/backend/src/main/scala/sharry/backend/auth/HttpBasicAuth.scala new file mode 100644 index 00000000..8eadec0b --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/HttpBasicAuth.scala @@ -0,0 +1,76 @@ +package sharry.backend.auth + +import cats.data.Kleisli +import cats.effect._ +import cats.implicits._ +import org.log4s.getLogger + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.account.OAccount +import java.{util => ju} +import java.nio.charset.StandardCharsets +import java.net.HttpURLConnection + +final class HttpBasicAuth[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]) { + + private[this] val logger = getLogger + + def login: LoginModule[F] = + LoginModule.whenEnabled(cfg.httpBasic.enabled)( + Kleisli( + up => + Ident.fromString(up.user) match { + case Right(login) => + def okResult: F[LoginResult] = + HttpAuth.addAccount(login, oacc).flatMap( + accId => AuthToken.user(accId, cfg.serverSecret).map(LoginResult.ok) + ) + + for { + _ <- logger.fdebug(s"HttpBasicAuth: starting login $up") + res <- executeReq(up, cfg.httpBasic) + resp <- if (res) okResult else LoginResult.invalidAuth.pure[F] + _ <- logger.fdebug(s"HttpBasicAuth: $up => $resp") + } yield resp + + case Left(err) => + logger.fdebug(s"HttpBasicAuth: failed.") *> + LoginResult.invalidAuth.pure[F] + } + ) + ) + + private def executeReq(up: UserPassData, cfg: AuthConfig.HttpBasic): F[Boolean] = { + val header = ju.Base64.getEncoder + .encodeToString(s"${up.user}:${up.pass.pass}".getBytes(StandardCharsets.UTF_8)) + + cfg.url.open match { + case Right(res) => + res.use( + conn => + Effect[F].delay { + conn.setRequestProperty("Authorization", s"Basic $header") + conn.setRequestMethod(cfg.method) + conn.connect() + + val code = conn.asInstanceOf[HttpURLConnection].getResponseCode() + code >= 200 && code <= 299 + } + ) + + case Left(err) => + logger.fwarn(s"Invalid url for http-basic-auth '${cfg.url.asString}': $err").map(_ => false) + } + } + + def withPosition: (Int, LoginModule[F]) = (cfg.httpBasic.order, login) + +} + +object HttpBasicAuth { + + def apply[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]): HttpBasicAuth[F] = + new HttpBasicAuth[F](cfg, oacc) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/InternalAuth.scala b/modules/backend/src/main/scala/sharry/backend/auth/InternalAuth.scala new file mode 100644 index 00000000..c66ad03c --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/InternalAuth.scala @@ -0,0 +1,57 @@ +package sharry.backend.auth + +import cats.effect._ +import cats.implicits._ +import cats.data.Kleisli +import org.log4s._ + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.records.RAccount +import sharry.backend.account.OAccount +import sharry.backend.PasswordCrypt + +final class InternalAuth[F[_]: Effect](cfg: AuthConfig, op: OAccount[F]) { + + private[this] val logger = getLogger + + def login: LoginModule[F] = + LoginModule.enabledState(cfg.internal.enabled, op, AccountSource.intern)( + Kleisli( + up => + Ident.fromString(up.user) match { + case Right(login) => + def okResult(accId: AccountId) = + op.updateLoginStats(accId) *> + AuthToken.user(accId, cfg.serverSecret).map(LoginResult.ok) + + for { + _ <- logger.ftrace(s"Internal auth: doing account lookup: ${login.id}") + data <- op.findByLogin(login) + _ <- logger.ftrace(s"Internal auth: Account lookup: $data") + res <- data + .filter(check(up.pass)) + .map(record => okResult(record.accountId(None))) + .getOrElse(LoginResult.invalidAuth.pure[F]) + } yield res + case Left(_) => + logger.fdebug(s"Internal auth: failed.") *> + LoginResult.invalidAuth.pure[F] + } + ) + ) + + def withPosition: (Int, LoginModule[F]) = (cfg.internal.order, login) + + private def check(given: Password)(data: RAccount): Boolean = { + val userOk = data.state == AccountState.Active + val passOk = PasswordCrypt.check(given, data.password) + userOk && passOk + } +} + +object InternalAuth { + + def apply[F[_]: Effect](cfg: AuthConfig, oacc: OAccount[F]): InternalAuth[F] = + new InternalAuth[F](cfg, oacc) +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/Login.scala b/modules/backend/src/main/scala/sharry/backend/auth/Login.scala new file mode 100644 index 00000000..46180917 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/Login.scala @@ -0,0 +1,70 @@ +package sharry.backend.auth + +import cats.effect._ +import cats.implicits._ +import cats.data.Kleisli +import org.log4s._ +import sharry.common.Ident +import sharry.common.syntax.all._ +import sharry.backend.account.OAccount +import cats.data.OptionT + +trait Login[F[_]] { + + def loginSession(config: AuthConfig)(sessionKey: String): F[LoginResult] + + def loginUserPass(config: AuthConfig)(up: UserPassData): F[LoginResult] + + def loginAlias(config: AuthConfig)(alias: String): F[LoginResult] +} + +object Login { + private[this] val logger = getLogger + + def apply[F[_]: Effect](oacc: OAccount[F]): Resource[F, Login[F]] = + Resource.pure(new Login[F] { + + def loginSession(config: AuthConfig)(sessionKey: String): F[LoginResult] = + AuthToken.fromString(sessionKey) match { + case Right(at) => + if (at.sigInvalid(config.serverSecret)) LoginResult.invalidAuth.pure[F] + else if (at.isExpired(config.sessionValid)) LoginResult.invalidTime.pure[F] + else LoginResult.ok(at).pure[F] + case Left(_) => + LoginResult.invalidAuth.pure[F] + } + + def loginUserPass(config: AuthConfig)(up: UserPassData): F[LoginResult] = + logger.fdebug(s"Trying to login ${up}") *> + createLoginModule[F](config, oacc).run(up) + + def loginAlias(config: AuthConfig)(alias: String): F[LoginResult] = + (for { + aliasId <- OptionT + .fromOption[F](Ident.fromString(alias).toOption.filter(_ != Ident.empty)) + acc <- oacc.findByAlias(aliasId) + tok <- OptionT.liftF( + AuthToken + .user(acc.accountId(Some(aliasId)).copy(admin = false), config.serverSecret) + ) + res = LoginResult.ok(tok) + } yield res).getOrElse(LoginResult.invalidAuth) + + }) + + def createLoginModule[F[_]: Effect]( + cfg: AuthConfig, + account: OAccount[F] + ): Kleisli[F, UserPassData, LoginResult] = { + val modules = List( + FixedAuth[F](cfg, account).withPosition, + InternalAuth[F](cfg, account).withPosition, + HttpBasicAuth[F](cfg, account).withPosition, + HttpAuth[F](cfg, account).withPosition, + CommandAuth[F](cfg, account).withPosition + ).sortBy(_._1).map(_._2) + + LoginModule.combine[F](modules: _*) + } + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/LoginModule.scala b/modules/backend/src/main/scala/sharry/backend/auth/LoginModule.scala new file mode 100644 index 00000000..d0332a45 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/LoginModule.scala @@ -0,0 +1,56 @@ +package sharry.backend.auth + +import cats.data.Kleisli +import cats.effect.Sync +import cats.implicits._ +import cats.Applicative +import cats.Monad +import cats.data.OptionT + +import sharry.common._ +import sharry.backend.account.OAccount + +object LoginModule { + + def apply[F[_]](run: UserPassData => F[Option[LoginResult]]): LoginModule[F] = + Kleisli(run) + + def whenEnabled[F[_]: Applicative]( + enabled: Boolean + )(f: Kleisli[F, UserPassData, LoginResult]): LoginModule[F] = + if (enabled) f.map(_.some) else loginEmpty[F] + + def loginEmpty[F[_]: Applicative]: LoginModule[F] = + LoginModule(_ => (None: Option[LoginResult]).pure[F]) + + def loginPure[F[_]: Applicative](r: LoginResult): LoginModule[F] = + LoginModule(_ => (Some(r): Option[LoginResult]).pure[F]) + + def finalResult(r: Option[LoginResult]): LoginResult = + r.getOrElse(LoginResult.invalidAuth) + + def combine[F[_]: Monad](ms: LoginModule[F]*): Kleisli[F, UserPassData, LoginResult] = { + val module: LoginModule[F] = + ms.foldLeft(loginEmpty[F]) { (result, el) => + result.flatMap(_.map(loginPure[F]).getOrElse(el)) + } + + module.map(finalResult) + } + + def enabledState[F[_]: Sync](enable: Boolean, op: OAccount[F], src: AccountSource)( + f: Kleisli[F, UserPassData, LoginResult] + ): LoginModule[F] = + if (!enable) loginEmpty[F] + else LoginModule { up => + Ident.fromString(up.user) match { + case Right(login) => + (for { + acc <- OptionT(op.findByLogin(login)).filter(_.source == src) + res <- OptionT.liftF(f.run(up)) + } yield res).value + case Left(err) => + OptionT.some[F](LoginResult.invalidAuth).value + } + } +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/LoginResult.scala b/modules/backend/src/main/scala/sharry/backend/auth/LoginResult.scala new file mode 100644 index 00000000..261c1a85 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/LoginResult.scala @@ -0,0 +1,21 @@ +package sharry.backend.auth + +sealed trait LoginResult { + def toEither: Either[String, AuthToken] +} + +object LoginResult { + case class Ok(session: AuthToken) extends LoginResult { + val toEither = Right(session) + } + case object InvalidAuth extends LoginResult { + val toEither = Left("Authentication failed.") + } + case object InvalidTime extends LoginResult { + val toEither = Left("Authentication failed.") + } + + def ok(session: AuthToken): LoginResult = Ok(session) + def invalidAuth: LoginResult = InvalidAuth + def invalidTime: LoginResult = InvalidTime +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/UserPassData.scala b/modules/backend/src/main/scala/sharry/backend/auth/UserPassData.scala new file mode 100644 index 00000000..76e6126b --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/UserPassData.scala @@ -0,0 +1,15 @@ +package sharry.backend.auth +import sharry.common.Password + +import yamusca.imports._ +import yamusca.implicits._ +import sharry.backend.mustache.YamuscaCommon._ + +case class UserPassData(user: String, pass: Password) {} + +object UserPassData { + + implicit val yamuscaConverter: ValueConverter[UserPassData] = + ValueConverter.deriveConverter[UserPassData] + +} diff --git a/modules/backend/src/main/scala/sharry/backend/auth/package.scala b/modules/backend/src/main/scala/sharry/backend/auth/package.scala new file mode 100644 index 00000000..398b66b1 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/auth/package.scala @@ -0,0 +1,9 @@ +package sharry.backend + +package object auth { + + import cats.data.Kleisli + + type LoginModule[F[_]] = Kleisli[F, UserPassData, Option[LoginResult]] + +} diff --git a/modules/backend/src/main/scala/sharry/backend/job/CleanupConfig.scala b/modules/backend/src/main/scala/sharry/backend/job/CleanupConfig.scala new file mode 100644 index 00000000..41ac1762 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/job/CleanupConfig.scala @@ -0,0 +1,7 @@ +package sharry.backend.job + +import sharry.common._ + +case class CleanupConfig(enabled: Boolean, interval: Duration, invalidAge: Duration) { + +} diff --git a/modules/backend/src/main/scala/sharry/backend/job/PeriodicCleanup.scala b/modules/backend/src/main/scala/sharry/backend/job/PeriodicCleanup.scala new file mode 100644 index 00000000..ffe40383 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/job/PeriodicCleanup.scala @@ -0,0 +1,79 @@ +package sharry.backend.job + +import cats.effect._ +import cats.implicits._ +import fs2.Stream +import sharry.store.Store +import sharry.common._ +import sharry.common.syntax.all._ +import org.log4s.getLogger +import sharry.backend.share.Queries + +object PeriodicCleanup { + private[this] val logger = getLogger + + def resource[F[_]: ConcurrentEffect: Timer: ContextShift]( + cfg: CleanupConfig, + store: Store[F] + ): Resource[F, Unit] = + if (!cfg.enabled) + Resource.liftF(logger.finfo("Cleanup job not running, because it is disabled")) + else { + val main = (logStarting ++ loop(cfg, store) ++ logStopped).compile.drain + Resource + .make(ConcurrentEffect[F].start(main))( + fiber => logger.fdebug("Periodic cleanup cancelled") *> fiber.cancel + ) + .map(_ => ()) + } + + def loop[F[_]: ConcurrentEffect: Timer: ContextShift]( + cfg: CleanupConfig, + store: Store[F] + ): Stream[F, Nothing] = + Stream.awakeEvery[F](cfg.interval.toScala).flatMap { _ => + Stream + .eval( + logger.finfo("Running periodic tasks") *> + doCleanup(cfg, store) *> deleteOrphanedFiles(store) *> logger + .finfo("Periodic tasks done.") + ) + .drain + } + + private def logStarting[F[_]: Sync] = + Stream.eval(logger.finfo("Periodic cleanup job active")).drain + + private def logStopped[F[_]: Sync] = + Stream.eval(logger.finfo("Periodic cleanup job stopped")).drain + + def doCleanup[F[_]: ConcurrentEffect](cfg: CleanupConfig, store: Store[F]): F[Unit] = + for { + _ <- logger.finfo("Cleanup expired shares...") + now <- Timestamp.current[F] + point = now.minus(cfg.invalidAge) + _ <- store + .transact(Queries.findExpired(point)) + .evalMap( + id => + logger.fdebug(s"Delete expired share: ${id.id}") *> Queries.deleteShare(id, false)( + store + ) + ) + .compile + .drain + } yield () + + def deleteOrphanedFiles[F[_]: ConcurrentEffect](store: Store[F]): F[Unit] = + for { + _ <- logger.finfo("Checking for orphaned files...") + _ <- store + .transact(Queries.findOrphanedFiles) + .evalMap( + id => + logger.fdebug(s"Delete orphaned file '${id.id}'") *> Queries.deleteFile(store)(id) + ) + .compile + .drain + } yield () +} diff --git a/modules/backend/src/main/scala/sharry/backend/mail/MailConfig.scala b/modules/backend/src/main/scala/sharry/backend/mail/MailConfig.scala new file mode 100644 index 00000000..8a79f4a5 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/MailConfig.scala @@ -0,0 +1,38 @@ +package sharry.backend.mail + +import emil.{MailConfig => EmilConfig, _} +import yamusca.imports._ + +import sharry.common._ + +case class MailConfig(enabled: Boolean, smtp: MailConfig.Smtp, templates: MailConfig.Templates) { + + def toEmil: EmilConfig = + EmilConfig( + s"smtp://${smtp.host}:${smtp.port}", + smtp.user, + smtp.password.pass, + smtp.sslType, + !smtp.checkCertificates, + smtp.timeout.toScala + ) +} + +object MailConfig { + + case class Smtp( + host: String, + port: Int, + user: String, + password: Password, + sslType: SSLType, + checkCertificates: Boolean, + timeout: Duration, + defaultFrom: Option[MailAddress], + listId: String + ) + + case class Templates(download: MailTpl, alias: MailTpl, uploadNotify: MailTpl) + + case class MailTpl(subject: Template, body: Template) +} diff --git a/modules/backend/src/main/scala/sharry/backend/mail/MailData.scala b/modules/backend/src/main/scala/sharry/backend/mail/MailData.scala new file mode 100644 index 00000000..0dfee4e2 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/MailData.scala @@ -0,0 +1,3 @@ +package sharry.backend.mail + +case class MailData(subject: String, body: String) diff --git a/modules/backend/src/main/scala/sharry/backend/mail/MailSendResult.scala b/modules/backend/src/main/scala/sharry/backend/mail/MailSendResult.scala new file mode 100644 index 00000000..cf7c9a76 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/MailSendResult.scala @@ -0,0 +1,24 @@ +package sharry.backend.mail + +sealed trait MailSendResult { + +} + +object MailSendResult { + + def success: MailSendResult = Success + def sendFailure(ex: Throwable): MailSendResult = SendFailure(ex) + def noRecipients: MailSendResult = NoRecipients + def noSender: MailSendResult = NoSender + def featureDisabled: MailSendResult = FeatureDisabled + + case object Success extends MailSendResult + + case class SendFailure(ex: Throwable) extends MailSendResult + + case object NoRecipients extends MailSendResult + + case object NoSender extends MailSendResult + + case object FeatureDisabled extends MailSendResult +} diff --git a/modules/backend/src/main/scala/sharry/backend/mail/NotifyResult.scala b/modules/backend/src/main/scala/sharry/backend/mail/NotifyResult.scala new file mode 100644 index 00000000..ec76ca51 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/NotifyResult.scala @@ -0,0 +1,21 @@ +package sharry.backend.mail + +sealed trait NotifyResult { + +} + +object NotifyResult { + def missingEmail: NotifyResult = MissingEmail + def featureDisabled: NotifyResult = FeatureDisabled + + case object InvalidAlias extends NotifyResult + + case object FeatureDisabled extends NotifyResult + + case object MissingEmail extends NotifyResult + + case class SendFailed(err: String) extends NotifyResult + + case object SendSuccessful extends NotifyResult + +} diff --git a/modules/backend/src/main/scala/sharry/backend/mail/OMail.scala b/modules/backend/src/main/scala/sharry/backend/mail/OMail.scala new file mode 100644 index 00000000..880268db --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/OMail.scala @@ -0,0 +1,145 @@ +package sharry.backend.mail + +import cats.effect._ +import cats.data.OptionT +import cats.implicits._ +import emil.{MailConfig => _, _} +import emil.javamail.syntax._ +import emil.builder._ +import yamusca.implicits._ +import org.log4s.getLogger + +import sharry.common._ +import sharry.store.Store +import emil.javamail.internal.JavaMailConnection +import sharry.backend.mail.MailConfig.MailTpl +import cats.data.EitherT + +trait OMail[F[_]] { + + def notifyAliasUpload(aliasId: Ident, shareId: Ident, baseUrl: LenientUri): F[NotifyResult] + + def getShareTemplate(acc: AccountId, shareId: Ident, baseUrl: LenientUri): OptionT[F, MailData] + + def getAliasTemplate(acc: AccountId, aliasId: Ident, baseUrl: LenientUri): F[MailData] + + def sendMail(acc: AccountId, receiver: List[MailAddress], mail: MailData): F[MailSendResult] +} + +object OMail { + private[this] val logger = getLogger + + def apply[F[_]: Effect]( + store: Store[F], + cfg: MailConfig, + emil: Emil[F, JavaMailConnection] + ): Resource[F, OMail[F]] = + Resource.pure(new OMail[F] { + + def notifyAliasUpload( + aliasId: Ident, + shareId: Ident, + baseUrl: LenientUri + ): F[NotifyResult] = { + def createMail(tpl: MailTpl, data: TemplateData, receiver: MailAddress): Mail[F] = + MailBuilder.build( + From(cfg.smtp.defaultFrom.getOrElse(receiver)), + To(receiver), + ListId(cfg.smtp.listId), + Subject(data.render(tpl.subject)), + TextBody[F](data.render(tpl.body)) + ) + + def send(rec: MailAddress, td: TemplateData): F[NotifyResult] = + emil(cfg.toEmil).send(createMail(cfg.templates.uploadNotify, td, rec)).attempt.map { + case Right(()) => NotifyResult.SendSuccessful + case Left(ex) => + logger.warn(ex)("Sending failed") + NotifyResult.SendFailed(ex.getMessage) + } + + if (!cfg.enabled) NotifyResult.featureDisabled.pure[F] + else + (for { + t <- OptionT(store.transact(Queries.resolveAlias(aliasId, shareId))) + receiver = t._2.email.map(MailAddress.parse).flatMap(_.toOption) + td = TemplateData(t._2.login, baseUrl / shareId.id, false, t._1.name) + res <- OptionT.liftF( + receiver.map(rec => send(rec, td)).getOrElse(NotifyResult.missingEmail.pure[F]) + ) + } yield res).getOrElse(NotifyResult.InvalidAlias) + } + + def getShareTemplate( + acc: AccountId, + shareId: Ident, + baseUrl: LenientUri + ): OptionT[F, MailData] = + for { + t <- OptionT(store.transact(Queries.publishIdAndPassword(acc.id, shareId))) + td = TemplateData(acc.userLogin, baseUrl / t._2.id, t._1, "") + tpl = cfg.templates.download + } yield MailData(td.render(tpl.subject), td.render(tpl.body)) + + def getAliasTemplate(acc: AccountId, aliasId: Ident, baseUrl: LenientUri): F[MailData] = { + val tpl = cfg.templates.alias + val td = TemplateData(acc.userLogin, baseUrl / aliasId.id, false, "") + MailData(td.render(tpl.subject), td.render(tpl.body)).pure[F] + } + + def sendMail( + acc: AccountId, + receiver: List[MailAddress], + mail: MailData + ): F[MailSendResult] = { + def recipients: EitherT[F, MailSendResult, List[MailAddress]] = + if (receiver.isEmpty) EitherT.leftT(MailSendResult.noRecipients) + else EitherT.rightT(receiver) + + def sender: EitherT[F, MailSendResult, MailAddress] = + cfg.smtp.defaultFrom match { + case Some(from) => EitherT.rightT(from) + case None => + EitherT(store.transact(Queries.getEmail(acc.id)).map { + case Some(f) => Right(f) + case None => Left(MailSendResult.NoSender) + }) + } + + def createMail(rec: List[MailAddress], sender: MailAddress): Mail[F] = + MailBuilder.build( + From(sender), + Subject(mail.subject), + TextBody[F](mail.body), + ListId(cfg.smtp.listId), + Tos(rec) + ) + + def send(mail: Mail[F]): F[MailSendResult] = + emil(cfg.toEmil).send(mail).attempt.map { + case Right(_) => MailSendResult.success + case Left(ex) => MailSendResult.sendFailure(ex) + } + + val res = for { + recs <- recipients + from <- (sender: EitherT[F, MailSendResult, MailAddress]) + } yield createMail(recs, from) + + if (!cfg.enabled) MailSendResult.featureDisabled.pure[F] + else res.foldF(r => r.pure[F], mail => send(mail)) + } + + }) + + case class Tos[F[_]](ma: List[MailAddress]) extends Trans[F] { + def apply(mail: Mail[F]): Mail[F] = + mail.mapMailHeader(_.mapRecipients(rec => ma.foldLeft(rec)(_.addTo(_)))) + } + + case class ListId[F[_]](listId: String) extends Trans[F] { + def apply(mail: Mail[F]): Mail[F] = + if (listId.trim.isEmpty) mail + else CustomHeader("List-Id", s"<${listId}>").apply(mail) + } +} diff --git a/modules/backend/src/main/scala/sharry/backend/mail/Queries.scala b/modules/backend/src/main/scala/sharry/backend/mail/Queries.scala new file mode 100644 index 00000000..a69dcabb --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/Queries.scala @@ -0,0 +1,52 @@ +package sharry.backend.mail + +import doobie._, doobie.implicits._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ +import sharry.common._ +import sharry.store.records._ +import emil.MailAddress + +object Queries { + + def resolveAlias(aliasId: Ident, shareId: Ident): ConnectionIO[Option[(RAlias, RAccount)]] = { + val aId = "a" :: RAlias.Columns.id + val aAccount = "a" :: RAlias.Columns.account + val uId = "u" :: RAccount.Columns.id + val sId = "s" :: RShare.Columns.id + val sAlias = "s" :: RShare.Columns.aliasId + + val from = RAlias.table ++ fr"a INNER JOIN" ++ + RAccount.table ++ fr"u ON" ++ uId.is(aAccount) ++ fr"INNER JOIN" ++ + RShare.table ++ fr"s ON" ++ sAlias.is(aliasId) + + Sql + .selectSimple( + RAlias.Columns.all.map("a" :: _) ++ RAccount.Columns.all.map("u" :: _), + from, + Sql.and(aId.is(aliasId), sId.is(shareId)) + ) + .query[(RAlias, RAccount)] + .option + } + + def publishIdAndPassword(accId: Ident, shareId: Ident): ConnectionIO[Option[(Boolean, Ident)]] = { + val sId = "s" :: RShare.Columns.id + val sAcc = "s" :: RShare.Columns.accountId + val sPass = "s" :: RShare.Columns.password + val pId = "p" :: RPublishShare.Columns.id + val pShare = "p" :: RPublishShare.Columns.shareId + + val from = RShare.table ++ fr"s INNER JOIN" ++ RPublishShare.table ++ fr"p ON" ++ pShare.is(sId) + + Sql + .selectSimple(Seq(sPass, pId), from, Sql.and(sId.is(shareId), sAcc.is(accId))) + .query[(Option[String], Ident)] + .option + .map(_.map(t => (t._1.nonEmpty, t._2))) + } + + def getEmail(accId: Ident): ConnectionIO[Option[MailAddress]] = + Sql.selectSimple(Seq(RAccount.Columns.email), RAccount.table, RAccount.Columns.id.is(accId)). + query[MailAddress].option +} diff --git a/modules/backend/src/main/scala/sharry/backend/mail/TemplateData.scala b/modules/backend/src/main/scala/sharry/backend/mail/TemplateData.scala new file mode 100644 index 00000000..7b8c2cdb --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mail/TemplateData.scala @@ -0,0 +1,15 @@ +package sharry.backend.mail + +import yamusca.imports._ +import yamusca.implicits._ + +import sharry.common._ +import sharry.backend.mustache.YamuscaCommon._ + +case class TemplateData(user: Ident, url: LenientUri, password: Boolean, aliasName: String) + +object TemplateData { + + implicit val mustacheValue: ValueConverter[TemplateData] = + ValueConverter.deriveConverter[TemplateData] +} diff --git a/modules/backend/src/main/scala/sharry/backend/mustache/YamuscaCommon.scala b/modules/backend/src/main/scala/sharry/backend/mustache/YamuscaCommon.scala new file mode 100644 index 00000000..a58fc7a2 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/mustache/YamuscaCommon.scala @@ -0,0 +1,37 @@ +package sharry.backend.mustache + +import yamusca.imports._ +import sharry.common._ +import bitpeace.Mimetype + +trait YamuscaCommon { + + implicit def yamuscaIntMapConverter[A]( + implicit ca: ValueConverter[Map[String, A]] + ): ValueConverter[Map[Int, A]] = + ValueConverter.of(m => ca(m.map(t => (t._1.toString, t._2)))) + + implicit val yamuscaIdentConverter: ValueConverter[Ident] = + ValueConverter.of(m => Value.fromString(m.id)) + + implicit val yamuscaMimetypeConverter: ValueConverter[Mimetype] = + ValueConverter.of(m => Value.fromString(m.asString)) + + implicit val yamuscaBytesizeConverter: ValueConverter[ByteSize] = + ValueConverter.of(m => Value.fromString(m.bytes.toString)) + + implicit val yamuscaUriConverter: ValueConverter[LenientUri] = + ValueConverter.of(m => Value.fromString(m.asString)) + + implicit val yamuscaDurationConverter: ValueConverter[Duration] = + ValueConverter.of(m => Value.fromString(m.millis.toString)) + + implicit val yamuscaPasswordConverter: ValueConverter[Password] = + ValueConverter.of(m => Value.fromString(m.pass)) + + implicit def yamuscaSignupModeConverter: ValueConverter[SignupMode] = + ValueConverter.of(m => Value.fromString(m.name)) + +} + +object YamuscaCommon extends YamuscaCommon diff --git a/modules/backend/src/main/scala/sharry/backend/share/ByteResult.scala b/modules/backend/src/main/scala/sharry/backend/share/ByteResult.scala new file mode 100644 index 00000000..242bb8bd --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ByteResult.scala @@ -0,0 +1,34 @@ +package sharry.backend.share + +import fs2.Stream +import bitpeace.{Bitpeace, RangeDef} +import cats.data.OptionT +import cats.effect.Effect +import sharry.common.Ident +import sharry.store.Store +import bitpeace.FileMeta +import sharry.store.records.RShareFile + +object ByteResult { + + def loadFileData[F[_]](bitpeace: Bitpeace[F], id: String, range: RangeDef): Stream[F, Byte] = + bitpeace.get(id).unNoneTerminate.through(bitpeace.fetchData(range)) + + def load[F[_]: Effect]( + store: Store[F] + )(fileId: Ident, range: RangeDef): OptionT[F, FileRange[F]] = + for { + meta <- loadMeta(fileId, store) + data <- OptionT.pure(Stream.emit(meta._2).through(store.bitpeace.fetchData(range))) + } yield FileRange(meta._1, meta._2, data) + + + // impl. note: bitpeace uses for filemeta's timestamp column a different mapping, so + // it's complicated to create a single query with doobie. Using to two queries. + private def loadMeta[F[_]: Effect](fileId: Ident, store: Store[F]): OptionT[F, (RShareFile, FileMeta)] = + for { + rf <- OptionT(store.transact(RShareFile.findById(fileId))) + fm <- OptionT(store.bitpeace.get(rf.fileId.id).unNoneTerminate.compile.last) + } yield (rf, fm) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/DescriptionTemplate.scala b/modules/backend/src/main/scala/sharry/backend/share/DescriptionTemplate.scala new file mode 100644 index 00000000..605338ca --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/DescriptionTemplate.scala @@ -0,0 +1,77 @@ +package sharry.backend.share + +import yamusca.imports._ +import yamusca.implicits._ +import sharry.common._ +import bitpeace.Mimetype +import sharry.backend.mustache.YamuscaCommon + +final class DescriptionTemplate(sd: ShareDetail) { + + def rendered(baseUri: LenientUri): Option[String] = + sd.share.description.map(process(baseUri)) + + def process(baseUri: LenientUri)(desc: String): String = + mustache.parse(desc).map(DescriptionTemplate.ShareContext(sd, baseUri).render).getOrElse(desc) + +} +object DescriptionTemplate { + + def apply(sd: ShareDetail): DescriptionTemplate = + new DescriptionTemplate(sd) + + case class ShareContext( + key: Ident, + openKey: Option[Ident], + files: Seq[FileInfo], + filename: Map[String, FileInfo], + file: Map[Int, FileInfo] + ) + + object ShareContext extends YamuscaCommon { + + def apply(sd: ShareDetail, baseUri: LenientUri): ShareContext = + ShareContext( + sd.share.id, + sd.published.map(_.id), + sd.files.map(f => FileInfo(baseUri)(f)), + sd.files + .map(f => FileInfo(baseUri)(f).byName) + .foldLeft(Map.empty[String, FileInfo])(_ ++ _), + sd.files.map(FileInfo(baseUri)).zipWithIndex.map(_.swap).toMap + ) + + implicit val contextConv: ValueConverter[ShareContext] = + ValueConverter.deriveConverter[ShareContext] + } + + case class FileInfo( + id: Ident, + name: Option[String], + mimetype: Mimetype, + length: ByteSize, + size: String, + checksum: String, + url: LenientUri + ) { + + def byName: Map[String, FileInfo] = + name match { + case Some(n) => + Map(n.replaceAllLiterally(".", "") -> this) + case None => + Map.empty + } + } + + object FileInfo extends YamuscaCommon { + + def apply(baseUri: LenientUri)(fd: FileData): FileInfo = + FileInfo(fd.id, fd.name, fd.mimetype, fd.length, fd.length.toHuman, fd.checksum, baseUri/fd.id.id) + + implicit val fileInfoConverter: ValueConverter[FileInfo] = + ValueConverter.deriveConverter[FileInfo] + } + + +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/File.scala b/modules/backend/src/main/scala/sharry/backend/share/File.scala new file mode 100644 index 00000000..aa1b8be4 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/File.scala @@ -0,0 +1,11 @@ +package sharry.backend.share + +import fs2.Stream +import bitpeace.Mimetype + +case class File[F[_]]( + name: Option[String], + advertisedMime: Option[Mimetype], + length: Option[Long], + data: Stream[F, Byte] +) diff --git a/modules/backend/src/main/scala/sharry/backend/share/FileData.scala b/modules/backend/src/main/scala/sharry/backend/share/FileData.scala new file mode 100644 index 00000000..ed414c05 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/FileData.scala @@ -0,0 +1,18 @@ +package sharry.backend.share + +import bitpeace.Mimetype +import sharry.common._ + +case class FileData( + id: Ident, + shareId: Ident, + metaId: Ident, + name: Option[String], + mimetype: Mimetype, + length: ByteSize, + checksum: String, + chunks: Int, + chunksize: ByteSize, + created: Timestamp, + saved: ByteSize +) diff --git a/modules/backend/src/main/scala/sharry/backend/share/FileInfo.scala b/modules/backend/src/main/scala/sharry/backend/share/FileInfo.scala new file mode 100644 index 00000000..6e922aa3 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/FileInfo.scala @@ -0,0 +1,8 @@ +package sharry.backend.share +import bitpeace.Mimetype + +case class FileInfo( + length: Long, + name: Option[String], + mime: Mimetype +) diff --git a/modules/backend/src/main/scala/sharry/backend/share/FileRange.scala b/modules/backend/src/main/scala/sharry/backend/share/FileRange.scala new file mode 100644 index 00000000..75c32c5c --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/FileRange.scala @@ -0,0 +1,11 @@ +package sharry.backend.share + +import fs2.Stream +import bitpeace.FileMeta +import sharry.store.records.RShareFile + +case class FileRange[F[_]]( + shareFile: RShareFile, + fileMeta: FileMeta, + data: Stream[F, Byte] +) diff --git a/modules/backend/src/main/scala/sharry/backend/share/OShare.scala b/modules/backend/src/main/scala/sharry/backend/share/OShare.scala new file mode 100644 index 00000000..e4915d6b --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/OShare.scala @@ -0,0 +1,535 @@ +package sharry.backend.share + +import fs2.Stream +import bitpeace.FileMeta +import cats.implicits._ +import cats.effect._ +import org.log4s.getLogger + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.Store +import sharry.store.records.RShare +import bitpeace.MimetypeHint +import sharry.store.records.RShareFile +import bitpeace.FileChunk +import cats.data.OptionT +import sharry.backend.PasswordCrypt +import sharry.store.records.RAlias +import sharry.store.AddResult +import sharry.store.records.RPublishShare +import bitpeace.RangeDef + +trait OShare[F[_]] { + + /** Create a new share given 'data'. + * + * If 'data' contains files, they are added to the share. Errors + * when adding the files are skipped, meaning that this operation + * succeeds even if no file could be added. + * + * If the account-id contains an alias, it is used to supply most + * meta data instead of 'data'. However, the alias is not checked + * for validity, as it is assumed to be part of the authentication + * process. + */ + def create(data: ShareData[F], accId: AccountId): F[UploadResult[Ident]] + + /** Adds more files to an existing share. + */ + def addFile( + shareId: Ident, + accId: AccountId, + files: Stream[F, File[F]] + ): OptionT[F, UploadResult[Ident]] + + /** Create a new file without any content to a given share. + * + * This is used with 'addFileData' when uploading a file in chunks. + * + * It is checked if the account is allowed to create a file. That + * is, the 'share' id must belong to an existing share owned by the + * given account. If the 'accId' contains an alias, the existing + * share must be linked to that alias. + * + * The id of the new file is returned. If there is no share with + * the given id, 'None' is returned. + */ + def createEmptyFile( + share: Ident, + accId: AccountId, + info: FileInfo + ): OptionT[F, UploadResult[Ident]] + + /** Add a new chunk of bytes to an existing file. + * + * When files are uploaded in chunks, or an upload is resumed, file + * data can be uploaded starting from an offset. This offset is + * usually retrieved first using 'getFileData'. + * + * It is checked if the account is allowed to create a file. That + * is, the 'fileId' id must belong to an existing file owned by the + * given account. If the 'accId' contains an alias, the + * corresponding share must be linked to that alias. + */ + def addFileData( + shareId: Ident, + fileId: Ident, + accId: AccountId, + length: Option[ByteSize], + offset: ByteSize, + data: Stream[F, Byte] + ): OptionT[F, UploadResult[ByteSize]] + + /** Return information about an existing file. + * + * It is checked if the file is owned by the given account. That + * is, the 'fileId' id must belong to an existing file owned by the + * given account. If the 'accId' contains an alias, the + * corresponding share must be linked to that alias. + */ + def getFileData(fileId: Ident, accId: AccountId): OptionT[F, FileData] + + /** Searches your shares. + * + * The query is applied to the name, id and alias name. + */ + def findShares(q: String, accId: AccountId): Stream[F, ShareItem] + + /** Get all details about a share. + */ + def shareDetails(id: ShareId, pass: Option[Password]): OptionT[F, ShareResult[ShareDetail]] + + /** Publishes a share. + * + * If 'reuseId' is true and this share was previously published, + * the id will be reused so the link doesn't change. Otherwise a + * new id will be generated. + * + * No changes are applied if this share is already published. + */ + def publish(share: Ident, accId: AccountId, reuseId: Boolean): OptionT[F, Unit] + + def unpublish(share: Ident, accId: AccountId): OptionT[F, Unit] + + def loadFile( + id: ShareId, + file: Ident, + pass: Option[Password], + range: RangeDef + ): OptionT[F, FileRange[F]] + + def deleteFile(accId: AccountId, file: Ident): OptionT[F, Unit] + + def deleteShare(accId: AccountId, share: Ident): OptionT[F, Unit] + + def setDescription(accId: AccountId, share: Ident, value: String): OptionT[F, Unit] + + def setName(accId: AccountId, share: Ident, value: Option[String]): OptionT[F, Unit] + + def setValidity(accId: AccountId, share: Ident, value: Duration): OptionT[F, Unit] + + def setMaxViews(accId: AccountId, share: Ident, value: Int): OptionT[F, Unit] + + def setPassword(accId: AccountId, share: Ident, value: Option[Password]): OptionT[F, Unit] +} + +object OShare { + private[this] val logger = getLogger + + def apply[F[_]: ConcurrentEffect](store: Store[F], cfg: ShareConfig): Resource[F, OShare[F]] = + Resource.pure(new OShare[F] { + + def create(data: ShareData[F], accId: AccountId): F[UploadResult[Ident]] = { + val createShare = for { + share <- createShareRecord( + store, + accId.id, + accId.alias, + data.copy(password = data.password.map(PasswordCrypt.crypt)) + ) + valid = UploadResult(share).checkValidity(cfg.maxValidity)(_.validity) + _ <- valid.mapF(r => store.transact(RShare.insert(r))) + _ <- logger.fdebug(s"Result creating share for '${accId.id.id}': $valid") + } yield valid.map(_.id) + + val storeFiles = (id: Ident) => + data.files + .evalMap(createFile(store, id, cfg.chunkSize, cfg.maxSize)) + .evalMap( + ur => + ur.toOption match { + case Some(t) => + logger.fdebug(s"Successfully stored file ${t._2.filename}") + case None => + logger.fwarn(s"Unable to store file: $ur") + } + ) + .compile + .drain + + val advertisedSize: F[ByteSize] = + data.files + .map(_.length.getOrElse(0L)) + .fold(0L)(_ + _) + .compile + .lastOrError + .map(ByteSize.apply) + + for { + shareId <- createShare + advSize <- advertisedSize + _ <- shareId.checkSize(cfg.maxSize)(_ => advSize).mapF(storeFiles) + } yield shareId + } + + def addFile( + shareId: Ident, + accId: AccountId, + files: Stream[F, File[F]] + ): OptionT[F, UploadResult[Ident]] = { + val storeFiles = + files + .evalMap(createFile(store, shareId, cfg.chunkSize, cfg.maxSize)) + .evalMap( + ur => + ur.toOption match { + case Some(t) => + logger.fdebug(s"Successfully stored file ${t._2.filename}") + case None => + logger.fwarn(s"Unable to store file: $ur") + } + ) + .compile + .drain + + for { + _ <- OptionT(store.transact(Queries.checkShare(shareId, accId))) + _ <- OptionT.liftF(storeFiles) + } yield UploadResult(shareId) + } + + def createEmptyFile( + share: Ident, + accId: AccountId, + info: FileInfo + ): OptionT[F, UploadResult[Ident]] = { + val insert = for { + fid <- Ident.randomId[F] + sid <- Ident.randomId[F] + now <- Timestamp.current[F] + rest = if (info.length % cfg.chunkSize.bytes == 0) 0 else 1 + chunks = info.length / cfg.chunkSize.bytes + rest + fm = FileMeta( + fid.id, + now.value, + info.mime, + info.length, + "", + chunks.toInt, + cfg.chunkSize.bytes.toInt + ) + rf = RShareFile(sid, share, fid, info.name, now, ByteSize.zero) + _ <- store.bitpeace.saveFileMeta(fm).compile.drain + _ <- store.transact(RShareFile.insert(rf)) + _ <- logger.fdebug(s"Created empty file: ${sid.id}") + } yield rf.id + + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + res <- OptionT.liftF(checkShareSize(store, cfg.maxSize, share, ByteSize(info.length))) + r <- OptionT.liftF(res.mapF(_ => insert)) + } yield r + } + + def addFileData( + shareId: Ident, + fileId: Ident, + accId: AccountId, + length: Option[ByteSize], + offset: ByteSize, + data: Stream[F, Byte] + ): OptionT[F, UploadResult[ByteSize]] = { + val startChunk = (offset.bytes / cfg.chunkSize.bytes).toInt + + def storeChunk( + fileMetaId: Ident, + length: ByteSize, + mimeHint: MimetypeHint, + sizeLeft: ByteSize + ) = + data + .take(sizeLeft.bytes + 1) + .chunkN(cfg.chunkSize.bytes.toInt) + .zipWithIndex + .map(tc => FileChunk(fileMetaId.id, tc._2 + startChunk, tc._1.toByteVector)) + .flatMap( + chunk => + store.bitpeace + .addChunkByLength(chunk, cfg.chunkSize.bytes.toInt, length.bytes, mimeHint) + .map(_ => chunk.chunkData.size) + ) + .fold1(_ + _) + .compile + .last + .map(_.getOrElse(0L)) + .flatMap(bytesSaved => { + val len = offset + ByteSize(bytesSaved) + store.transact(RShareFile.setRealSize(fileId, len)).map(_ => len) + }) + + val deleteFile = store + .transact(RShareFile.delete(fileId)) + .flatTap(_ => logger.fwarn("Deleting file due to max-size when uploading chunk!")) + .map(_ => UploadResult.sizeExceeded[Long](cfg.maxSize)) + .map(_.map(ByteSize.apply)) + + for { + _ <- OptionT(store.transact(Queries.checkFile(fileId, accId))) + res <- OptionT.liftF( + checkShareSize(store, cfg.maxSize, shareId, length.getOrElse(ByteSize.zero)) + ) + desc <- OptionT(store.transact(Queries.fileDesc(fileId))) + next <- OptionT.liftF( + res.mapF( + rem => + storeChunk( + desc.metaId, + desc.length, + MimetypeHint(desc.name, desc.mime.some), + rem + ) + ) + ) + // check again against db state, because of parallel uploads + currentSize2 <- OptionT.liftF(store.transact(Queries.shareSize(shareId))) + ur <- OptionT.liftF(next.flatMapF({ _ => + if (currentSize2 >= cfg.maxSize) deleteFile + else next.pure[F] + })) + + } yield next + } + + def getFileData(fileId: Ident, accId: AccountId): OptionT[F, FileData] = + OptionT(store.transact(Queries.fileData(fileId))) + + def findShares(q: String, accId: AccountId): Stream[F, ShareItem] = + store.transact(Queries.findShares(q, accId)) + + def shareDetails( + shareId: ShareId, + pass: Option[Password] + ): OptionT[F, ShareResult[ShareDetail]] = + for { + sd <- OptionT(store.transact(Queries.shareDetail(shareId).value)) + res = checkPassword(shareId, pass, sd.share.password) + _ <- OptionT.liftF(res.mapF(_ => store.transact(Queries.countPublishAccess(shareId)))) + } yield res.map(_ => sd) + + def publish(share: Ident, accId: AccountId, reuseId: Boolean): OptionT[F, Unit] = { + val insert = RPublishShare.initialInsert(share).map(_ => 1) + val exists = RPublishShare.existsByShare(share) + val add: F[Int] = store.add(insert, exists).flatMap { + case AddResult.Success => + 1.pure[F] + case AddResult.EntityExists(m) => + store.transact(RPublishShare.update(share, true, reuseId)) + case AddResult.Failure(ex) => + Effect[F].raiseError(ex) + } + + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + res <- OptionT.liftF(add) + } yield () + } + + def unpublish(share: Ident, accId: AccountId): OptionT[F, Unit] = { + val remove = store.transact(RPublishShare.update(share, false, true)) + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + res <- OptionT.liftF(remove) + } yield () + } + + def loadFile( + shareId: ShareId, + file: Ident, + pass: Option[Password], + range: RangeDef + ): OptionT[F, FileRange[F]] = { + val checkQuery = shareId.fold( + pub => Queries.checkFilePublish(pub.id, file), + priv => + Queries.checkFile(file, priv.account).map(opt => opt.map(_ => (None: Option[Password]))) + ) + + for { + _ <- OptionT(store.transact(checkQuery)) + file <- ByteResult.load(store)(file, range) + } yield file + } + + def deleteFile(accId: AccountId, file: Ident): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkFile(file, accId))) + fd <- OptionT(store.transact(Queries.fileDesc(file))) + _ <- OptionT.liftF(store.transact(RShareFile.delete(file))) + _ <- OptionT.liftF( + ConcurrentEffect[F].start( + Queries.deleteFile(store)(fd.metaId) *> logger.fdebug(s"File deleted: ${file.id}") + ) + ) + } yield () + + def deleteShare(accId: AccountId, share: Ident): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + _ <- OptionT.liftF(Queries.deleteShare(share, true)(store)) + } yield () + + def setDescription(accId: AccountId, share: Ident, value: String): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + _ <- OptionT.liftF(store.transact(Queries.setDescription(share, value))) + } yield () + + def setName(accId: AccountId, share: Ident, value: Option[String]): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + _ <- OptionT.liftF(store.transact(Queries.setName(share, value))) + } yield () + + def setValidity(accId: AccountId, share: Ident, value: Duration): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + _ <- OptionT.liftF(store.transact(Queries.setValidity(share, value))) + } yield () + + def setMaxViews(accId: AccountId, share: Ident, value: Int): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + _ <- OptionT.liftF(store.transact(Queries.setMaxViews(share, value))) + } yield () + + def setPassword(accId: AccountId, share: Ident, value: Option[Password]): OptionT[F, Unit] = + for { + _ <- OptionT(store.transact(Queries.checkShare(share, accId))) + pw = value.map(PasswordCrypt.crypt) + _ <- OptionT.liftF(store.transact(Queries.setPassword(share, pw))) + } yield () + + }) + +// --- utilities + + private def checkPassword( + shareId: ShareId, + given: Option[Password], + sharePw: Option[Password] + ): ShareResult[Unit] = shareId match { + case ShareId.PrivateId(_, _) => + ShareResult.Success(()) + case ShareId.PublicId(_) => + (given, sharePw) match { + case (Some(plain), Some(pw)) => + if (PasswordCrypt.check(plain, pw)) ShareResult.Success(()) + else ShareResult.PasswordMismatch + + case (None, Some(pw)) => + ShareResult.PasswordMissing + + case _ => + ShareResult.Success(()) + } + } + + private def checkShareSize[F[_]: Sync]( + store: Store[F], + maxSize: ByteSize, + shareId: Ident, + fileSize: ByteSize + ) = + for { + currentSize <- store.transact(Queries.shareSize(shareId)) + sizeLeft = maxSize - currentSize + result = if (fileSize > sizeLeft) UploadResult.sizeExceeded(maxSize) + else UploadResult(sizeLeft) + } yield result + + def createFile[F[_]: Sync](store: Store[F], shareId: Ident, chunkSz: ByteSize, maxSize: ByteSize)( + file: File[F] + ): F[UploadResult[(FileMeta, RShareFile)]] = { + + def deleteFileMeta(fm: FileMeta) = + for { + _ <- logger.fdebug(s"Deleting too large (${ByteSize(fm.length)}) file ${fm.id}") + _ <- store.bitpeace.delete(fm.id).compile.lastOrError + } yield UploadResult.sizeExceeded[FileMeta](maxSize) + + def insertFileData(now: Timestamp) = + for { + // first check advertised length against max-size + result <- checkShareSize[F](store, maxSize, shareId, ByteSize(file.length.getOrElse(0L))) + + // store file, at most max-size +1 bytes + urfm <- result.mapF( + sizeLeft => + store.bitpeace + .saveNew( + file.data.take(sizeLeft.bytes + 1L), + chunkSz.bytes.toInt, + MimetypeHint(file.name, file.advertisedMime.map(_.asString)), + None, + now.value + ) + .compile + .lastOrError + ) + + // check again against db state, because of parallel uploads + currentSize2 <- store.transact(Queries.shareSize(shareId)) + ur <- urfm.flatMapF({ fm => + if (currentSize2 >= maxSize) deleteFileMeta(fm) + else urfm.pure[F] + }) + } yield ur + + def saveShareFile(fm: FileMeta, now: Timestamp) = + for { + sfid <- Ident.randomId[F] + sf = RShareFile(sfid, shareId, Ident.unsafe(fm.id), file.name, now, ByteSize(fm.length)) + _ <- store.transact(RShareFile.insert(sf)) + } yield UploadResult((fm, sf)) + + for { + now <- Timestamp.current[F] + urfm <- insertFileData(now) + ursf <- urfm.flatMapF(fm => saveShareFile(fm, now)) + } yield ursf + } + + def createShareRecord[F[_]: Effect]( + store: Store[F], + accId: Ident, + alias: Option[Ident], + data: ShareData[F] + ): F[RShare] = + for { + dbalias <- alias.map(a => store.transact(RAlias.findById(a, accId))).getOrElse(None.pure[F]) + id <- Ident.randomId[F] + now <- Timestamp.current[F] + } yield RShare( + id, + accId, + alias, + data.name, + dbalias.map(_.validity).getOrElse(data.validity), + data.maxViews, + data.password, + data.description, + now + ) + +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/Queries.scala b/modules/backend/src/main/scala/sharry/backend/share/Queries.scala new file mode 100644 index 00000000..291ffaae --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/Queries.scala @@ -0,0 +1,408 @@ +package sharry.backend.share + +import cats.effect.Sync +import cats.implicits._ +import fs2.Stream +import doobie._, doobie.implicits._ +import org.log4s.getLogger +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.records.RShareFile +import sharry.store.records.RShare +import sharry.store.records.RAccount +import sharry.store.records.RPublishShare +import sharry.store.records.RAlias +import cats.data.OptionT +import bitpeace.Mimetype +import sharry.store.Store +import cats.effect.ConcurrentEffect +import cats.effect.Effect + +object Queries { + private[this] val logger = getLogger + + object FileMetaCols { + val id = Column("id") + val timestamp = Column("timestamp") + val mimetype = Column("mimetype") + val length = Column("length") + val checksum = Column("checksum") + val chunks = Column("chunks") + val chunksize = Column("chunksize") + + val all = List(id, timestamp, mimetype, length, checksum, chunks, chunksize) + val table = fr"filemeta" + } + object FileChunkCols { + val table = fr"filechunk" + val fileId = Column("fileId") + val chunkLength = Column("chunkLength") + val chunkNr = Column("chunkNr") + } + + case class FileDesc(metaId: Ident, name: Option[String], mime: String, length: ByteSize) { + def mimeType: Mimetype = + Mimetype.parse(mime).fold(throw _, identity) + } + + def fileDesc(shareFileId: Ident): ConnectionIO[Option[FileDesc]] = { + val SF = RShareFile.Columns + val cols = + Seq( + "m" :: FileMetaCols.id, + "f" :: SF.filename, + "m" :: FileMetaCols.mimetype, + "m" :: FileMetaCols.length + ) + val from = RShareFile.table ++ fr"f INNER JOIN filemeta m ON f.file_id = m.id" + Sql.selectSimple(cols, from, ("f" :: SF.id).is(shareFileId)).query[FileDesc].option + } + + private def fileDataFragment0(where: Fragment): Fragment = { + val fId = "f" :: RShareFile.Columns.id + val fFile = "f" :: RShareFile.Columns.fileId + val mId = "m" :: FileMetaCols.id + + val cols = Seq( + fId, + "f" :: RShareFile.Columns.shareId, + "m" :: FileMetaCols.id, + "f" :: RShareFile.Columns.filename, + "m" :: FileMetaCols.mimetype, + "m" :: FileMetaCols.length, + "m" :: FileMetaCols.checksum, + "m" :: FileMetaCols.chunks, + "m" :: FileMetaCols.chunksize, + "f" :: RShareFile.Columns.created, + "f" :: RShareFile.Columns.realSize + ) + val from = RShareFile.table ++ fr"f INNER JOIN filemeta m ON" ++ mId.is(fFile) + + Sql.selectSimple(cols, from, where) + } + + private def fileDataShareFileFragment(shareFileId: Ident): Fragment = { + val fId = "f" :: RShareFile.Columns.id + fileDataFragment0(fId.is(shareFileId)) + } + + private def fileDataShareFragment(shareId: Ident): Fragment = { + val fShare = "f" :: RShareFile.Columns.shareId + fileDataFragment0(fShare.is(shareId)) + } + + def fileData(shareFileId: Ident): ConnectionIO[Option[FileData]] = { + val q = fileDataShareFileFragment(shareFileId) + q.query[FileData].option + } + + def shareSize(shareId: Ident): ConnectionIO[ByteSize] = { + val fShare = "f" :: RShareFile.Columns.shareId + val fSize = "f" :: RShareFile.Columns.realSize + + val qSize = Sql.selectSimple( + fr"COALESCE(SUM(" ++ fSize.f ++ fr"), 0) as size", + RShareFile.table ++ fr"f", + fShare.is(shareId) + ) + + qSize + .query[ByteSize] + .option + .map(_.getOrElse(ByteSize.zero)) + } + + def checkShare(share: Ident, accId: AccountId): ConnectionIO[Option[Unit]] = { + val sId = "s" :: RShare.Columns.id + val sAlias = "s" :: RShare.Columns.aliasId + val sAccount = "s" :: RShare.Columns.accountId + val aId = "a" :: RAccount.Columns.id + + val from = RShare.table ++ fr"s INNER JOIN" ++ + RAccount.table ++ fr"a ON" ++ aId.is(sAccount) + val cond = Seq(sId.is(share), aId.is(accId.id)) ++ + accId.alias.map(alias => Seq(sAlias.is(alias))).getOrElse(Seq.empty) + + Sql + .selectSimple(Seq(sId), from, Sql.and(cond)) + .query[Ident] + .map(_ => ()) + .option + } + + def checkFilePublish( + sharePublic: Ident, + fileId: Ident + ): ConnectionIO[Option[Option[Password]]] = { + val sId = "s" :: RShare.Columns.id + val sPass = "s" :: RShare.Columns.password + val pShare = "p" :: RPublishShare.Columns.shareId + val pId = "p" :: RPublishShare.Columns.id + val fShare = "f" :: RShareFile.Columns.shareId + val fId = "f" :: RShareFile.Columns.id + val pEnable = "p" :: RPublishShare.Columns.enabled + val pUntil = "p" :: RPublishShare.Columns.publishUntil + + val from = RPublishShare.table ++ fr"p INNER JOIN" ++ + RShare.table ++ fr"s ON" ++ pShare.is(sId) ++ + fr"INNER JOIN" ++ RShareFile.table ++ fr"f ON" ++ fShare.is(sId) + + def cond(now: Timestamp) = + Seq(pId.is(sharePublic), fId.is(fileId), pEnable.is(true), pUntil.isGt(now)) + + for { + now <- Timestamp.current[ConnectionIO] + q <- Sql.selectSimple(Seq(sPass), from, Sql.and(cond(now))).query[Option[Password]].option + } yield q + } + + def checkFile(fileId: Ident, accId: AccountId): ConnectionIO[Option[Unit]] = { + val sId = "s" :: RShare.Columns.id + val sAccount = "s" :: RShare.Columns.accountId + val sAlias = "s" :: RShare.Columns.aliasId + val aId = "a" :: RAccount.Columns.id + val fShare = "f" :: RShareFile.Columns.shareId + val fId = "f" :: RShareFile.Columns.id + + val from = RShare.table ++ fr"s INNER JOIN" ++ + RAccount.table ++ fr"a ON" ++ aId.is(sAccount) ++ + fr"INNER JOIN" ++ RShareFile.table ++ fr"f ON" ++ fShare.is(sId) + val cond = Seq(fId.is(fileId), aId.is(accId.id)) ++ + accId.alias.map(alias => Seq(sAlias.is(alias))).getOrElse(Seq.empty) + + Sql + .selectSimple(Seq(fId), from, Sql.and(cond)) + .query[Ident] + .map(_ => ()) + .option + } + + private def fileSummary: Fragment = { + val fileId = "m" :: FileMetaCols.id + val size = "m" :: FileMetaCols.length + val rFile = "r" :: RShareFile.Columns.fileId + val rShare = "r" :: RShareFile.Columns.shareId + + val cols = rShare.f ++ fr"as fshare, COUNT(" ++ fileId.f ++ fr") as files, SUM(" ++ size.f ++ fr") as size" + val table = RShareFile.table ++ fr"r" ++ + fr"INNER JOIN filemeta m ON" ++ rFile.is(fileId) ++ + fr"GROUP BY fshare" + + Sql.selectSimple(cols, table, Fragment.empty) + } + + def findShares(q: String, accId: AccountId): Stream[ConnectionIO, ShareItem] = { + val nfiles = Column("files") + val nsize = Column("size") + val shareId = "s" :: RShare.Columns.id + val account = "s" :: RShare.Columns.accountId + val pShare = "p" :: RPublishShare.Columns.shareId + val name = "s" :: RShare.Columns.name + val sid = "s" :: RShare.Columns.id + val aliasName = "a" :: RAlias.Columns.name + val aliasId = "a" :: RAlias.Columns.id + val shareAlias = "s" :: RShare.Columns.aliasId + val created = "s" :: RShare.Columns.created + val cols = RShare.Columns.all.map("s" :: _).map(_.f) ++ Seq( + ("p" :: RPublishShare.Columns.enabled).f, + ("p" :: RPublishShare.Columns.publishUntil).f, + aliasName.f, + fr"COALESCE(" ++ ("f" :: nfiles).f ++ fr", 0)", + fr"COALESCE(" ++ ("f" :: nsize).f ++ fr", 0)" + ) + + val from = RShare.table ++ fr"s" ++ + fr"LEFT OUTER JOIN" ++ RPublishShare.table ++ fr"p ON" ++ pShare.is(shareId) ++ + fr"LEFT OUTER JOIN" ++ RAlias.table ++ fr"a ON" ++ aliasId.is(shareAlias) ++ + fr"LEFT OUTER JOIN (" ++ fileSummary ++ fr") as f ON fshare = s.id" + + val qs = s"%$q%" + val frag = Sql.selectSimple( + Sql.commas(cols), + from, + Sql.and(account.is(accId.id), Sql.or(name.like(qs), sid.like(qs), aliasName.like(qs))) + ) ++ fr"ORDER BY" ++ created.f ++ fr"DESC" + logger.trace(s"$frag") + frag.query[ShareItem].stream + } + + def shareDetail(shareId: ShareId): OptionT[ConnectionIO, ShareDetail] = { + val account = "s" :: RShare.Columns.accountId + val sId = "s" :: RShare.Columns.id + val sAlias = "s" :: RShare.Columns.aliasId + val sMaxViews = "s" :: RShare.Columns.maxViews + val pShare = "p" :: RPublishShare.Columns.shareId + val pEnable = "p" :: RPublishShare.Columns.enabled + val pUntil = "p" :: RPublishShare.Columns.publishUntil + val pId = "p" :: RPublishShare.Columns.id + val pViews = "p" :: RPublishShare.Columns.views + val aId = "a" :: RAlias.Columns.id + + val cols = RShare.Columns.all.map("s" :: _) ++ + RPublishShare.Columns.all.map("p" :: _) ++ + RAlias.Columns.all.map("a" :: _) + + val from = RShare.table ++ fr"s" ++ + fr"LEFT OUTER JOIN" ++ RPublishShare.table ++ fr"p ON" ++ pShare.is(sId) ++ + fr"LEFT OUTER JOIN" ++ RAlias.table ++ fr"a ON" ++ sAlias.is(aId) + + def cond(now: Timestamp) = + shareId.fold( + pub => Sql.and(pId.is(pub.id), pEnable.is(true), pUntil.isGt(now), sMaxViews.isGt(pViews)), + priv => Sql.and(account.is(priv.account.id), sId.is(priv.id)) + ) + + def qDetail(now: Timestamp) = Sql.selectSimple(cols, from, cond(now)) + def qFiles(share: Ident) = + fileDataShareFragment(share) + + for { + now <- OptionT.liftF(Timestamp.current[ConnectionIO]) + detail <- OptionT(qDetail(now).query[(RShare, Option[RPublishShare], Option[RAlias])].option) + files <- OptionT.liftF(qFiles(detail._1.id).query[FileData].to[List]) + } yield ShareDetail(detail._1, detail._2, detail._3, files) + } + + def countPublishAccess(shareId: ShareId): ConnectionIO[Unit] = shareId match { + case ShareId.PrivateId(_, _) => + Sync[ConnectionIO].pure(()) + + case ShareId.PublicId(id) => + val pId = RPublishShare.Columns.id + val pViews = RPublishShare.Columns.views + val pLastAccess = RPublishShare.Columns.lastAccess + + for { + now <- Timestamp.current[ConnectionIO] + _ <- Sql + .updateRow( + RPublishShare.table, + pId.is(id), + Sql.commas( + pViews.increment(1), + pLastAccess.setTo(now) + ) + ) + .update + .run + } yield () + } + + def findExpired(point: Timestamp): Stream[ConnectionIO, Ident] = { + val pShare = RPublishShare.Columns.shareId + val pUntil = RPublishShare.Columns.publishUntil + val pEnable = RPublishShare.Columns.enabled + + Sql + .selectSimple(Seq(pShare), RPublishShare.table, Sql.and(pEnable.is(true), pUntil.isLt(point))) + .query[Ident] + .stream + } + + def findOrphanedFiles: Stream[ConnectionIO, Ident] = { + val fId = "f" :: RShareFile.Columns.id + val fFile = "f" :: RShareFile.Columns.fileId + val mId = "m" :: FileMetaCols.id + + val from = FileMetaCols.table ++ fr"m LEFT OUTER JOIN" ++ RShareFile.table ++ fr"f ON" ++ fFile + .is(mId) + val q = Sql.selectSimple(Seq(mId), from, fId.isNull) + logger.trace(s"findOrphaned: $q") + q.query[Ident].stream + } + + def deleteFile[F[_]: Effect](store: Store[F])(fileMetaId: Ident) = { + def deleteChunk(fid: Ident, chunk: Int): F[Int] = + store + .transact( + Sql + .deleteFrom( + FileChunkCols.table, + Sql.and(FileChunkCols.fileId.is(fid), FileChunkCols.chunkNr.is(chunk)) + ) + .update + .run + ) + + // When deleting large files, doing it in one transaction may blow + // memory. It is not important to be all-or-nothing, so here each + // chunk is deleted in one tx. This is slow, of course, but can be + // moved to a background thread. The cleanup job also detects + // orphaned files and removes them. + def deleteFileData(fid: Ident): F[Unit] = + Stream + .iterate(0)(_ + 1) + .covary[F] + .evalMap(n => deleteChunk(fid, n)) + .takeWhile(_ > 0) + .compile + .drain + + def deleteFileMeta(fid: Ident): F[Int] = + store.transact(for { + a <- RShareFile.deleteByFileId(fid) + c <- Sql.deleteFrom(FileMetaCols.table, FileMetaCols.id.is(fid)).update.run + } yield a + c) + + deleteFileData(fileMetaId) *> deleteFileMeta(fileMetaId) + } + + def deleteShare[F[_]: ConcurrentEffect](share: Ident, background: Boolean)( + store: Store[F] + ): F[Unit] = { + val rFileId = RShareFile.Columns.fileId + val rShareId = RShareFile.Columns.shareId + + def allFileIds: F[Vector[Ident]] = + store.transact( + Sql + .selectSimple(Seq(rFileId), RShareFile.table, rShareId.is(share)) + .query[Ident] + .to[Vector] + ) + + def deleteAllFiles(ids: Vector[Ident]) = + ids.traverse(deleteFile(store)) *> logger.fdebug[F]( + s"All files of share ${share.id} deleted" + ) + + for { + _ <- logger.fdebug[F](s"Going to delete share: ${share.id}") + fids <- allFileIds + _ <- store.transact(RShare.delete(share)) + _ <- if (background) ConcurrentEffect[F].start(deleteAllFiles(fids)) else deleteAllFiles(fids) + } yield () + } + + def setDescription(share: Ident, value: String): ConnectionIO[Int] = + Sql + .updateRow(RShare.table, RShare.Columns.id.is(share), RShare.Columns.description.setTo(value)) + .update + .run + + def setName(share: Ident, value: Option[String]): ConnectionIO[Int] = + Sql + .updateRow(RShare.table, RShare.Columns.id.is(share), RShare.Columns.name.setTo(value)) + .update + .run + + def setValidity(share: Ident, value: Duration): ConnectionIO[Int] = + Sql + .updateRow(RShare.table, RShare.Columns.id.is(share), RShare.Columns.validity.setTo(value)) + .update + .run + + def setMaxViews(share: Ident, value: Int): ConnectionIO[Int] = + Sql + .updateRow(RShare.table, RShare.Columns.id.is(share), RShare.Columns.maxViews.setTo(value)) + .update + .run + + def setPassword(share: Ident, value: Option[Password]): ConnectionIO[Int] = + Sql + .updateRow(RShare.table, RShare.Columns.id.is(share), RShare.Columns.password.setTo(value)) + .update + .run +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/ShareConfig.scala b/modules/backend/src/main/scala/sharry/backend/share/ShareConfig.scala new file mode 100644 index 00000000..2df79c6c --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ShareConfig.scala @@ -0,0 +1,5 @@ +package sharry.backend.share + +import sharry.common._ + +case class ShareConfig(chunkSize: ByteSize, maxSize: ByteSize, maxValidity: Duration) diff --git a/modules/backend/src/main/scala/sharry/backend/share/ShareData.scala b/modules/backend/src/main/scala/sharry/backend/share/ShareData.scala new file mode 100644 index 00000000..f127e6ff --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ShareData.scala @@ -0,0 +1,15 @@ +package sharry.backend.share + +import fs2.Stream +import sharry.common._ + +case class ShareData[F[_]]( + validity: Duration, + maxViews: Int, + description: Option[String], + password: Option[Password], + name: Option[String], + files: Stream[F, File[F]] +) + +object ShareData {} diff --git a/modules/backend/src/main/scala/sharry/backend/share/ShareDetail.scala b/modules/backend/src/main/scala/sharry/backend/share/ShareDetail.scala new file mode 100644 index 00000000..fe1e29b9 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ShareDetail.scala @@ -0,0 +1,15 @@ +package sharry.backend.share + +import sharry.store.records._ +import sharry.common.LenientUri + +case class ShareDetail( + share: RShare, + published: Option[RPublishShare], + alias: Option[RAlias], + files: Seq[FileData] +) { + + def descProcessed(baseUri: LenientUri): Option[String] = + DescriptionTemplate(this).rendered(baseUri) +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/ShareId.scala b/modules/backend/src/main/scala/sharry/backend/share/ShareId.scala new file mode 100644 index 00000000..cab54010 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ShareId.scala @@ -0,0 +1,27 @@ +package sharry.backend.share + +import sharry.common._ + +sealed trait ShareId { + + def fold[A](f: ShareId.PublicId => A, g: ShareId.PrivateId => A): A +} + +object ShareId { + + def publish(id: Ident): ShareId = + PublicId(id) + + def secured(id: Ident, acc: AccountId): ShareId = + PrivateId(id, acc) + + case class PublicId(id: Ident) extends ShareId { + def fold[A](f: ShareId.PublicId => A, g: ShareId.PrivateId => A): A = + f(this) + } + + case class PrivateId(id: Ident, account: AccountId) extends ShareId { + def fold[A](f: ShareId.PublicId => A, g: ShareId.PrivateId => A): A = + g(this) + } +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/ShareItem.scala b/modules/backend/src/main/scala/sharry/backend/share/ShareItem.scala new file mode 100644 index 00000000..6a2257e1 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ShareItem.scala @@ -0,0 +1,19 @@ +package sharry.backend.share + +import sharry.store.records.RShare +import sharry.common.ByteSize +import sharry.common.Timestamp + +case class ShareItem( + share: RShare, + published: Option[ShareItem.PublishSummary], + aliasName: Option[String], + files: ShareItem.FileSummary +) + +object ShareItem { + + case class FileSummary(count: Int, size: ByteSize) + + case class PublishSummary(enabled: Boolean, publishUntil: Timestamp) +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/ShareResult.scala b/modules/backend/src/main/scala/sharry/backend/share/ShareResult.scala new file mode 100644 index 00000000..ddb33435 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/ShareResult.scala @@ -0,0 +1,76 @@ +package sharry.backend.share + +import cats.implicits._ +import cats.Applicative + +sealed trait ShareResult[+A] { + + def toOption: Option[A] + + def fold[B]( + f1: A => B, + f2: ShareResult.PasswordMismatch.type => B, + f3: ShareResult.PasswordMissing.type => B + ): B + + def map[B](f: A => B): ShareResult[B] + + def mapF[F[_]: Applicative, B](f: A => F[B]): F[ShareResult[B]] +} + +object ShareResult { + + def apply[A](value: A): ShareResult[A] = + Success(value) + + case class Success[A](value: A) extends ShareResult[A] { + def toOption: Option[A] = Some(value) + + def fold[B]( + f1: A => B, + f2: ShareResult.PasswordMismatch.type => B, + f3: ShareResult.PasswordMissing.type => B + ): B = f1(value) + + def map[B](f: A => B): ShareResult[B] = + Success(f(value)) + + def mapF[F[_]: Applicative, B](f: A => F[B]): F[ShareResult[B]] = + f(value).map(Success.apply) + } + + case object PasswordMismatch extends ShareResult[Nothing] { + def toOption: Option[Nothing] = None + + def fold[B]( + f1: Nothing => B, + f2: ShareResult.PasswordMismatch.type => B, + f3: ShareResult.PasswordMissing.type => B + ): B = f2(this) + + def mapF[F[_]: Applicative, B](f: Nothing => F[B]): F[ShareResult[B]] = + (this: ShareResult[B]).pure[F] + + def map[B](f: Nothing => B) = + (this: ShareResult[B]) + + } + + case object PasswordMissing extends ShareResult[Nothing] { + def toOption: Option[Nothing] = None + + def fold[B]( + f1: Nothing => B, + f2: ShareResult.PasswordMismatch.type => B, + f3: ShareResult.PasswordMissing.type => B + ): B = f3(this) + + def mapF[F[_]: Applicative, B](f: Nothing => F[B]): F[ShareResult[B]] = + (this: ShareResult[B]).pure[F] + + def map[B](f: Nothing => B) = + (this: ShareResult[B]) + + } + +} diff --git a/modules/backend/src/main/scala/sharry/backend/share/UploadResult.scala b/modules/backend/src/main/scala/sharry/backend/share/UploadResult.scala new file mode 100644 index 00000000..3e2e2e20 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/share/UploadResult.scala @@ -0,0 +1,78 @@ +package sharry.backend.share + +import cats.Applicative +import cats.implicits._ +import sharry.common._ + +sealed trait UploadResult[+A] { + + def flatMap[B](f: A => UploadResult[B]): UploadResult[B] + + def map[B](f: A => B): UploadResult[B] = + flatMap(a => UploadResult.Success(f(a))) + + def mapF[F[_]: Applicative, B](f: A => F[B]): F[UploadResult[B]] = + flatMapF[F, B](a => f(a).map(UploadResult.success)) + + def flatMapF[F[_]: Applicative, B](f: A => F[UploadResult[B]]): F[UploadResult[B]] + + def exists(f: A => Boolean): Boolean = + toOption.exists(f) + + def forall(f: A => Boolean): Boolean = + toOption.forall(f) + + def toOption: Option[A] + + def checkSize(max: ByteSize)(f: A => ByteSize): UploadResult[A] = + if (toOption.forall(e => f(e) <= max)) this + else UploadResult.sizeExceeded(max) + + def checkValidity(max: Duration)(f: A => Duration): UploadResult[A] = + if (toOption.forall(e => f(e) <= max)) this + else UploadResult.validityExceeded(max) +} + +object UploadResult { + def apply[A](v: A): UploadResult[A] = + Success(v) + + def success[A](v: A): UploadResult[A] = + apply(v) + + def validityExceeded[A](max: Duration): UploadResult[A] = + ValidityExceeded(max) + + def sizeExceeded[A](max: ByteSize): UploadResult[A] = + SizeExceeded(max) + + case class Success[A](value: A) extends UploadResult[A] { + def flatMap[B](f: A => UploadResult[B]): UploadResult[B] = + f(value) + + def flatMapF[F[_]: Applicative, B](f: A => F[UploadResult[B]]): F[UploadResult[B]] = + f(value) + + def toOption: Option[A] = Some(value) + } + + case class ValidityExceeded(max: Duration) extends UploadResult[Nothing] { + def flatMap[B](f: Nothing => UploadResult[B]): UploadResult[B] = + this + + def flatMapF[F[_]: Applicative, B](f: Nothing => F[UploadResult[B]]): F[UploadResult[B]] = + (this: UploadResult[B]).pure[F] + + def toOption: Option[Nothing] = None + } + + case class SizeExceeded(max: ByteSize) extends UploadResult[Nothing] { + def flatMap[B](f: Nothing => UploadResult[B]): UploadResult[B] = + this + + def flatMapF[F[_]: Applicative, B](f: Nothing => F[UploadResult[B]]): F[UploadResult[B]] = + (this: UploadResult[B]).pure[F] + + def toOption: Option[Nothing] = None + } +} diff --git a/modules/backend/src/main/scala/sharry/backend/signup/NewInviteResult.scala b/modules/backend/src/main/scala/sharry/backend/signup/NewInviteResult.scala new file mode 100644 index 00000000..debb3213 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/signup/NewInviteResult.scala @@ -0,0 +1,19 @@ +package sharry.backend.signup + +import sharry.common.Ident + +sealed trait NewInviteResult { self: Product => + + final def name: String = + productPrefix.toLowerCase +} + +object NewInviteResult { + case class Success(id: Ident) extends NewInviteResult + case object InvitationDisabled extends NewInviteResult + case object PasswordMismatch extends NewInviteResult + + def passwordMismatch: NewInviteResult = PasswordMismatch + def invitationClosed: NewInviteResult = InvitationDisabled + def success(id: Ident): NewInviteResult = Success(id) +} diff --git a/modules/backend/src/main/scala/sharry/backend/signup/OSignup.scala b/modules/backend/src/main/scala/sharry/backend/signup/OSignup.scala new file mode 100644 index 00000000..28819139 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/signup/OSignup.scala @@ -0,0 +1,93 @@ +package sharry.backend.signup + +import cats.implicits._ +import cats.effect.{Effect, Resource} +import org.log4s.getLogger + +import sharry.backend.account._ +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.records.RInvitation +import sharry.store.{AddResult, Store} + +trait OSignup[F[_]] { + + def register(cfg: SignupConfig)(data: OSignup.RegisterData): F[SignupResult] + + def newInvite(cfg: SignupConfig)(password: Password): F[NewInviteResult] +} + +object OSignup { + private[this] val logger = getLogger + + case class RegisterData(login: Ident, password: Password, invite: Option[Ident]) + + def apply[F[_]: Effect](store: Store[F]): Resource[F, OSignup[F]] = + Resource.pure(new OSignup[F] { + + def newInvite(cfg: SignupConfig)(password: Password): F[NewInviteResult] = + if (cfg.mode != SignupMode.Invite) { + Effect[F].pure(NewInviteResult.invitationClosed) + } else if (cfg.invitePassword != password) { + Effect[F].pure(NewInviteResult.passwordMismatch) + } else { + store.transact(RInvitation.insertNew).map(ri => NewInviteResult.success(ri.id)) + } + + def register(cfg: SignupConfig)(data: RegisterData): F[SignupResult] = + cfg.mode match { + case SignupMode.Open => + addUser(data).map(SignupResult.fromAddResult) + + case SignupMode.Closed => + SignupResult.signupClosed.pure[F] + + case SignupMode.Invite => + data.invite match { + case Some(inv) => + for { + now <- Timestamp.current[F] + min = now.minus(cfg.inviteTime) + ok <- store.transact(RInvitation.useInvite(inv, min)) + res <- if (ok) addUser(data).map(SignupResult.fromAddResult) + else SignupResult.invalidInvitationKey.pure[F] + _ <- if (retryInvite(res)) + logger.fdebug(s"Adding account failed ($res). Allow retry with invite.") *> store + .transact( + RInvitation.insert(RInvitation(inv, now)) + ) + else 0.pure[F] + } yield res + case None => + SignupResult.invalidInvitationKey.pure[F] + } + } + + private def retryInvite(res: SignupResult): Boolean = + res match { + case SignupResult.AccountExists => + true + case SignupResult.InvalidInvitationKey => + false + case SignupResult.SignupClosed => + true + case SignupResult.Failure(_) => + true + case SignupResult.Success => + false + } + + private def addUser(data: RegisterData): F[AddResult] = + for { + acc <- NewAccount.create[F]( + data.login, + AccountSource.Intern, + AccountState.Active, + data.password, + None, + false + ) + res <- OAccount(store).use(_.create(acc)) + } yield res + }) +} diff --git a/modules/backend/src/main/scala/sharry/backend/signup/SignupConfig.scala b/modules/backend/src/main/scala/sharry/backend/signup/SignupConfig.scala new file mode 100644 index 00000000..ca88c2a7 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/signup/SignupConfig.scala @@ -0,0 +1,7 @@ +package sharry.backend.signup + +import sharry.common._ + +case class SignupConfig(mode: SignupMode, inviteTime: Duration, invitePassword: Password) + +object SignupConfig {} diff --git a/modules/backend/src/main/scala/sharry/backend/signup/SignupResult.scala b/modules/backend/src/main/scala/sharry/backend/signup/SignupResult.scala new file mode 100644 index 00000000..3326a926 --- /dev/null +++ b/modules/backend/src/main/scala/sharry/backend/signup/SignupResult.scala @@ -0,0 +1,26 @@ +package sharry.backend.signup + +import sharry.store.AddResult + +sealed trait SignupResult {} + +object SignupResult { + + case object AccountExists extends SignupResult + case object InvalidInvitationKey extends SignupResult + case object SignupClosed extends SignupResult + case class Failure(ex: Throwable) extends SignupResult + case object Success extends SignupResult + + def accountExists: SignupResult = AccountExists + def invalidInvitationKey: SignupResult = InvalidInvitationKey + def signupClosed: SignupResult = SignupClosed + def failure(ex: Throwable): SignupResult = Failure(ex) + def success: SignupResult = Success + + def fromAddResult(ar: AddResult): SignupResult = ar match { + case AddResult.Success => Success + case AddResult.Failure(ex) => Failure(ex) + case AddResult.EntityExists(_) => AccountExists + } +} diff --git a/modules/cli/src/main/resources/logback.xml b/modules/cli/src/main/resources/logback.xml deleted file mode 100644 index 1a4ce4b9..00000000 --- a/modules/cli/src/main/resources/logback.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - loglevel - - - - - %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %level [%thread] %logger [%file:%line] %msg%n - - - - - - - - - diff --git a/modules/cli/src/main/resources/reference.conf b/modules/cli/src/main/resources/reference.conf deleted file mode 100644 index 8d34aa51..00000000 --- a/modules/cli/src/main/resources/reference.conf +++ /dev/null @@ -1,80 +0,0 @@ -sharry { - # This is the default configuration for the cli tool. - # - # Certain settings can be overriden given them as options to the - # program, but it may be convenient to specify things like - # `endpoint` or authentication settings once in the config file. - cli { - # The mode describes the main command, like publish-files or - # md-upload. This is only a placeholder. It cannot be set here, - # but must be given to the cli program. - mode = "" - - # The default setting for validity. - valid = "1 hour" - - # The default setting for maximum downloads. - max-downloads = 30 - - # The files to upload. This is only a placeholder. It cannot be - # set here, but must be given to the cli program. - files = [] - - # The sharry server endpoint. This is the base url to the sharry - # server. The default is some invalid url, so the user is required - # to either give it to the cli program or define it in his config - # file. - endpoint = "http://nothing" - - # The following defines how to authenticate. There are three ways: - # - # - via username and password - # - via an alias header id - # - no authentication - # - # The default is set to `noauth'. Usually you would set a - # username/password pair here and use the `--alias' option to - # upload something to an alias page ocassionally. - auth = { - - # type of authentication, may be either `noauth', `aliasheader' - # or `userlogin'. - type = noauth - - # If type is `userlogin', specify the login name to use. - login = "" - - # If type is `userlogin', specify the password to use in plain - # text. See `password-command' for an alternative. - password = "" - - # If type is `userlogin', specify a system command that returns - # the password. Only the first line of the output is used. For - # example, it can be used with the password manager “pass” or - # simply use an gpg encrypted file and specify the decrypt - # command here. If this option is set, it is preferred to the - # `password' setting. - password-command = "" - - # If type is `aliasheader', specify the alias id to use for - # uploading. - alias = "" - } - - # This file is used to store the upload configuration. It is used - # for resuming uploads that have been cancelled. - resume-file = ${user.home}"/.config/sharry/sharry-cli-upload.json" - - # The log level for the application. It is set to `off', meaning - # there is no additional log output. If you encounter strange - # behaviour try setting this to a more verbose level. The levels - # are (from no-output to very-verbose): - # - # - off, error, warn, info, debug and trace - # - # Note, level `trace' is very verbose as it will print complete - # http request and responses. And it can include sensitive - # information! - loglevel = "off" - } -} \ No newline at end of file diff --git a/modules/cli/src/main/scala/sharry/cli/ClientError.scala b/modules/cli/src/main/scala/sharry/cli/ClientError.scala deleted file mode 100644 index 80e3a456..00000000 --- a/modules/cli/src/main/scala/sharry/cli/ClientError.scala +++ /dev/null @@ -1,53 +0,0 @@ -package sharry.cli - -import cats.data.NonEmptyList -import cats.Semigroup -import fs2.{Pipe, Stream} -import cats.effect.IO -import spinoco.fs2.http.HttpResponse - -case class ClientError(reasons: NonEmptyList[String]) extends RuntimeException(reasons.toList.mkString(", ")) { - - override def toString(): String = - s"ClientError($reasons)" - - def ::(reason: String) = - ClientError(reason :: reasons) - - def ++(next: ClientError): ClientError = - ClientError(reasons concatNel next.reasons) -} - - -object ClientError { - - def apply(reason: String, more: String*): ClientError = - ClientError(NonEmptyList(reason, more.toList)) - - def fromThrowable(e: Throwable): ClientError = { - val err = ClientError(e.getMessage) - err.setStackTrace(e.getStackTrace) - err - } - - def fromResponse(resp: HttpResponse[IO]): IO[Option[ClientError]] = - if (resp.header.status.isSuccess) IO.pure(None) - else resp.bodyAs[Map[String,String]]. - map(_.map(_.apply("message"))). - map(_.fold(_ => s"Server responded with ${resp.header.status}: ${resp.bodyAsString}", identity)). - map(str => Some(ClientError(str))) - - /** Pass the response if successful, otherwise fail the stream with some exception */ - def onSuccess: Pipe[IO, HttpResponse[IO], HttpResponse[IO]] = - s => for { - resp <- s - err <- Stream.eval(fromResponse(resp)) - r <- err.map(Stream.raiseError(_)).getOrElse(Stream(resp)) - } yield r - - implicit val semigroup: Semigroup[ClientError] = - new Semigroup[ClientError] { - def combine(e1: ClientError, e2: ClientError): ClientError = - ClientError(implicitly[Semigroup[NonEmptyList[String]]].combine(e1.reasons, e2.reasons)) - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/Cmd.scala b/modules/cli/src/main/scala/sharry/cli/Cmd.scala deleted file mode 100644 index 5caf0459..00000000 --- a/modules/cli/src/main/scala/sharry/cli/Cmd.scala +++ /dev/null @@ -1,99 +0,0 @@ -package sharry.cli - -import java.nio.channels.AsynchronousChannelGroup - -import fs2.{async, Pipe, Scheduler, Sink, Stream} -import cats.effect.IO -import fs2.async.mutable.Signal -import spinoco.fs2.http -import spinoco.fs2.http.HttpClient -import scala.concurrent.ExecutionContext - -import sharry.common.data._ -import sharry.cli.config._ - -trait Cmd { self => - - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] - - def >> (next: Cmd): Cmd = new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = - self.apply(client, progress) andThen next.apply(client, progress) - } -} - -object Cmd { - - val identity: Cmd = new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = s => s - } - - - def apply(f: (HttpClient[IO], Signal[IO, Progress]) => Context => Stream[IO, Context]): Cmd = - new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = _.flatMap(ctx => f(client, progress)(ctx)) - } - - def choice(f: Context => Cmd): Cmd = - new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = - _.flatMap { ctx => - val cmd = f(ctx) - Stream(ctx).covary[IO].through(cmd(client, progress)) - } - } - - def append(cs: Seq[Cmd]): Cmd = - cs.reduce(_ >> _) - - def apply(cmd0: Cmd, more: Cmd*): Cmd = - append(cmd0 +: more) - - def httpClient(implicit ACG: AsynchronousChannelGroup, S: ExecutionContext): Stream[IO, HttpClient[IO]] = - Stream.eval(http.client[IO]()) - - def makeContext(cfg: Config): Stream[IO, Context] = - Stream(Context(cfg, RemoteConfig.empty)) - - def eval(cmd: Cmd, cfg: Config, progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler, ACG: AsynchronousChannelGroup): Stream[IO, Context] = { - - httpClient.flatMap { client => - makeContext(cfg). - through(cmd(client, progress)). - through(done(client, progress)) - } - } - - def eval(cmd: Cmd, cfg: Config, sink: Sink[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler, ACG: AsynchronousChannelGroup): Stream[IO, Context] = - Stream.eval(async.signalOf[IO, Progress](Progress.Init)). - flatMap { signal => - - val run = eval(cmd, cfg, signal) - val prog = signal.discrete.to(sink).compile.drain - - Stream.eval(async.start(prog)).drain ++ run - } - - def done: Cmd = Cmd { (client, progress) => ctx => - import syntax._ - progress.info(Progress.Done(ctx)) ++ Stream(ctx) - } - - object syntax { - - implicit class ProgressOps(progress: Signal[IO, Progress]) { - def update(f: Progress => Progress): Stream[IO, Nothing] = - Stream.eval(progress.modify(f)).drain - - def info(value: Progress): Stream[IO, Nothing] = - update(_ => value) - } - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/Context.scala b/modules/cli/src/main/scala/sharry/cli/Context.scala deleted file mode 100644 index d5f29819..00000000 --- a/modules/cli/src/main/scala/sharry/cli/Context.scala +++ /dev/null @@ -1,166 +0,0 @@ -package sharry.cli - -import cats.implicits._ -import cats.data.{Validated, ValidatedNel} -import fs2.{text, Chunk, Stream} -import cats.effect.IO -import fs2.io.file -import fs2.async.mutable.Signal -import sharry.cli.config._ -import sharry.common.data._ -import sharry.common.file._ -import sharry.common.sizes._ -import sharry.common.rng._ -import sharry.common.duration._ -import spinoco.fs2.http.HttpRequest -import spinoco.fs2.http.body.StreamBodyEncoder -import spinoco.protocol.http._ -import spinoco.protocol.http.header.{Cookie, GenericHeader,`Content-Length`} -import spinoco.protocol.http.header.value.HttpCookie -import io.circe._, io.circe.generic.semiauto._ - -case class Context( - config: Config - , remoteConfig: RemoteConfig - , cookie: Option[Signal[IO,HttpCookie]] = None - , upload: Upload = Upload.empty -) { - - def parallelUploads: Int = - config.parallelUploads.map(n => math.min(n, remoteConfig.simultaneousUploads)). - getOrElse(remoteConfig.simultaneousUploads) - - lazy val size = config.files.foldLeft(0L)(_ + _.length).bytes - lazy val count = config.files.size - - def uri(key: String): Uri = { - config.endpoint / Uri.Path.fromUtf8String(remoteConfig.urls(key)) - } - - def serverSettingReq: HttpRequest[IO] = - HttpRequest.get(config.endpoint/"api"/"v1"/"settings") - - def loginReq(up: UserPass): HttpRequest[IO] = - HttpRequest.post(uri("authLogin"), up) - - def loginRefreshReq(cookie: HttpCookie): HttpRequest[IO] = - HttpRequest.post(uri("authCookie"), ""). - appendHeader(Cookie(cookie)) - - - def readSingleFile: Stream[IO, String] = - file.readAll[IO](config.files.head, 8192). - through(text.utf8Decode). - fold1(_ + _) - - def newUpload: Stream[IO, UploadCreate] = { - val descr: Stream[IO, String] = config.descriptionFile match { - case Some(f) => - file.readAll[IO](f, 8192). - through(text.utf8Decode). - fold1(_ + _) - case None => - Stream(config.description.getOrElse("")) - } - descr.map { d => - UploadCreate( - id = "c"+ Gen.ident(16, 32).generate() - , description = d - , validity = config.valid.formatExact - , maxdownloads = config.maxDownloads - , password = config.password.getOrElse("")) - } - } - - def createUploadReq(up: UploadCreate): Stream[IO, HttpRequest[IO]] = - authRequest(HttpRequest.post(uri("uploads"), up)) - - def getUploadReq(id: String): Stream[IO, HttpRequest[IO]] = - authRequest(HttpRequest.get(uri("uploads")/id)) - - def deleteUploadReq(id: String): Stream[IO, HttpRequest[IO]] = { - authRequest(HttpRequest.delete(uri("uploads") / id)) - } - - def publishUploadReq: Stream[IO, HttpRequest[IO]] = { - authRequest(HttpRequest.post(uri("uploadPublish") / upload.id, "")) - } - - def checkChunkReq(info: ChunkInfo): Stream[IO, HttpRequest[IO]] = - authRequest(HttpRequest.get(uri("uploadData")). - withQuery(queryParams(info))) - - def uploadChunkReq(info: ChunkInfo, data: Chunk[Byte]): Stream[IO, HttpRequest[IO]] = - authRequest(HttpRequest.get(uri("uploadData")). - withMethod(HttpMethod.POST). - appendHeader(`Content-Length`(info.currentChunkSize.toLong)). - withQuery(queryParams(info)). - withStreamBody(Stream.chunk(data).covary[IO])(StreamBodyEncoder.byteEncoder)) - - private def queryParams(info: ChunkInfo): Uri.Query = - Uri.Query.empty :+ ("token", info.token) :+ - ("resumableChunkNumber", info.chunkNumber.toString) :+ - ("resumableChunkSize", info.chunkSize.toString) :+ - ("resumableCurrentChunkSize", info.currentChunkSize.toString) :+ - ("resumableTotalSize", info.totalSize.toString) :+ - ("resumableIdentifier", info.fileIdentifier) :+ - ("resumableFilename", info.filename) :+ - ("resumableTotalChunks", info.totalChunks.toString) - - private def authRequest(req: HttpRequest[IO]): Stream[IO, HttpRequest[IO]] = - config.auth match { - case AuthMethod.AliasHeader(alias) => - Stream(req.appendHeader(GenericHeader(remoteConfig.aliasHeaderName, alias))) - case AuthMethod.UserLogin(_, _, _) => - cookie match { - case Some(s) => - Stream.eval(s.get).map { c => - req.appendHeader(Cookie(c)) - } - case None => - Stream.raiseError(ClientError("No cookie to authenticate")) - } - case AuthMethod.NoAuth => - Stream(req) - } - -} - -object Context { - private def successWhen(cond: Boolean, err: => String): ValidatedNel[String, Unit] = - if (cond) Validated.valid(()) - else Validated.invalidNel(err) - - def validate(ctx: Context): ValidatedNel[String, Context] = { - val v1 = successWhen( - ctx.size <= ctx.remoteConfig.maxFileSize.bytes, - s"Size of upload (${ctx.size.asString}) exceeds server limit (${ctx.remoteConfig.maxFileSize.bytes.asString}).") - - val v2 = successWhen( - ctx.count <= ctx.remoteConfig.maxFiles, - s"Number of files (${ctx.count}) exceeds server limit (${ctx.remoteConfig.maxFiles}).") - - val v3 = Duration.parse(ctx.remoteConfig.maxValidity).toValidatedNel[String,Duration].andThen(maxValidity => - successWhen( - !(maxValidity - ctx.config.valid).isNegative, - s"Validity (${ctx.config.valid}) exceeds server limit (${ctx.remoteConfig.maxValidity}).")) - - val v4 = successWhen( - ctx.count > 0 || ctx.config.description.isDefined || ctx.config.descriptionFile.isDefined, - "You must at least specify some files to upload or a description.") - - (v1 |+| v2 |+| v3 |+| v4).map { _ => - ctx.copy(config = ctx.config.copy(parallelUploads = - ctx.config.parallelUploads.map(n => - math.min(n, ctx.remoteConfig.simultaneousUploads)). - orElse(Some(ctx.remoteConfig.simultaneousUploads)))) - } - } - - implicit val _signalDecoder: Decoder[Option[Signal[IO,HttpCookie]]] = Decoder.decodeString.map(_ => None) - implicit val _signalEncoder: Encoder[Option[Signal[IO,HttpCookie]]] = Encoder.encodeString.contramap(_ => "") - - implicit val jsonDecoder: Decoder[Context] = deriveDecoder[Context] - implicit val jsonEncoder: Encoder[Context] = deriveEncoder[Context] - -} diff --git a/modules/cli/src/main/scala/sharry/cli/LoggingProperty.scala b/modules/cli/src/main/scala/sharry/cli/LoggingProperty.scala deleted file mode 100644 index f0394b9b..00000000 --- a/modules/cli/src/main/scala/sharry/cli/LoggingProperty.scala +++ /dev/null @@ -1,13 +0,0 @@ -package sharry.cli - -class LoggingProperty extends ch.qos.logback.core.PropertyDefinerBase { - - @scala.beans.BeanProperty - var name: String = "" - - def getPropertyValue(): String = { - val key = s"sharry.$name" - val value = Option(getContext.getProperty(key)) - value.filter(_.nonEmpty).getOrElse("warn") - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/OS.scala b/modules/cli/src/main/scala/sharry/cli/OS.scala deleted file mode 100644 index 35153407..00000000 --- a/modules/cli/src/main/scala/sharry/cli/OS.scala +++ /dev/null @@ -1,53 +0,0 @@ -package sharry.cli - -import java.util.concurrent.atomic.AtomicReference - -import scala.sys.process._ -import cats.effect.IO -import cats.implicits._ -import org.log4s._ - -object OS { - - private final val logger = getLogger - - def command(cmd: String): IO[SysCmd] = { - // todo more robust splitting - logger.trace(s"Creating system command from string '$cmd'") - cmd.split("\\s+").toList match { - case a :: as => IO.pure(SysCmd(a, as)) - case _ => IO.raiseError(ClientError(s"Invalid command: $cmd")) - } - } - - case class SysCmd(program: String, args: Seq[String]) { - def runFirstLine: IO[String] = { - logger.debug(s"Running to first output line of command: $this") - val line = new AtomicReference[String]() - val stderr = collection.mutable.ListBuffer.empty[String] - val appendErr: String => Unit = { s => - logger.trace(s"StdErr ($this): $s") - if (stderr.size < 500) stderr += s - else () - } - checkRc(stderr)(Process(program +: args) !< ProcessLogger(line.compareAndSet(null, _), appendErr)). - map { _ => - logger.trace(s"$this: output line: '${line.get}'") - line.get - } - } - - private def checkRc(stderr: collection.mutable.ListBuffer[String])(rc: => Int): IO[Unit] = - IO(rc). - handleErrorWith({case e => - logger.error(e)("Exception when executing system command") - IO.raiseError(ClientError.fromThrowable(e)) - }). - flatMap { - case 0 => IO.pure(()) - case n => - logger.error(s"System command returned with code $n") - IO.raiseError(ClientError(s"Non-zero exit code: $n", stderr.toSeq: _*)) - } - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/Progress.scala b/modules/cli/src/main/scala/sharry/cli/Progress.scala deleted file mode 100644 index 673a84c9..00000000 --- a/modules/cli/src/main/scala/sharry/cli/Progress.scala +++ /dev/null @@ -1,28 +0,0 @@ -package sharry.cli - -import spinoco.protocol.http.Uri -import sharry.common.sizes._ -import sharry.common.BuildInfo -import sharry.cli.config._ - -sealed trait Progress - -object Progress { - case object Init extends Progress - case class Prepare(cfg: Config) extends Progress - case class ServerWelcome(ctx: Context) extends Progress - case class Authenticating(host: Uri) extends Progress - case object CreateUpload extends Progress - case object DeleteUpload extends Progress - case object PublishUpload extends Progress - case class VersionMismatch(server: String) extends Progress { - val cli: String = BuildInfo.version - val isMismatch: Boolean = cli != server // todo don't compare minors - override def toString() = s"VersionMismatch(cli = $cli vs. server = $server" - } - case class Uploaded(amount: Size, total: Size) extends Progress - case class Error(exception: Throwable) extends Progress - case class Done(ctx: Context) extends Progress - case object ProcessingMarkdown extends Progress - case class Manual(text: String, html: Boolean) extends Progress -} diff --git a/modules/cli/src/main/scala/sharry/cli/StdoutSink.scala b/modules/cli/src/main/scala/sharry/cli/StdoutSink.scala deleted file mode 100644 index e9ca9180..00000000 --- a/modules/cli/src/main/scala/sharry/cli/StdoutSink.scala +++ /dev/null @@ -1,133 +0,0 @@ -package sharry.cli - -import java.util.concurrent.atomic.AtomicLong - -import cats.data.NonEmptyList -import fs2.{Sink, Stream} -import cats.effect.IO -import Console._ -import StdoutSink._ - -import sharry.common.sizes._ -import sharry.common.file._ -import sharry.common.data.Upload -import sharry.cli.config._ -import sharry.cli.Progress._ - -final class StdoutSink(cfg: Config, latch: java.util.concurrent.CountDownLatch) extends Sink[IO, Progress] { - - private final val start: AtomicLong = new AtomicLong(0) - - def apply(in: Stream[IO, Progress]): Stream[IO, Unit] = in.map { - case Init => - - case Prepare(cfg) => - if (cfg.files.nonEmpty) { - val size = cfg.files.foldLeft(0L)(_ + _.length).bytes - info(s"Prepare to upload ${cfg.files.size} files (${size.asString}) to ${cfg.endpoint.asString}.") - Console.flush() - } - - case ServerWelcome(ctx) => - if (ctx.remoteConfig.welcomeMessage.nonEmpty) { - info(cyan(ctx.remoteConfig.welcomeMessage)) - } - - case Authenticating(host) => - info(s"Authenticating at ${host.asString}") - Console.flush() - - case CreateUpload => - info("Creating a new upload.") - - case ProcessingMarkdown => - info("Processing markdown file.") - Console.flush() - - case DeleteUpload => - info("Deleting upload.") - Console.flush() - - case PublishUpload => - info("Publishing upload.") - Console.flush() - - case v@VersionMismatch(server) => - warn(s"Warning: the server version ($server) does not match this version (${v.cli}).") - Console.flush() - - case Uploaded(current, total) => - start.compareAndSet(0, System.currentTimeMillis()) - val percent = current.toBytes.toDouble / total.toBytes.toDouble - val perc = "%6.2f".format(percent * 100) - val width = 58 - val done = repeat((width * percent).toInt, "=") - val left = repeat(width - (width * percent).toInt, " ") - val rate = start.get match { - case 0 => "" - case s => - val secs = (System.currentTimeMillis() - s) / 1000 - if (secs <= 0) "" - else (current.toBytes / secs).bytes.asString + "/s" - } - out.print(s"$perc |$done$left| ${rate}\r") - - if (current == total) { - out.println("") - } - Console.flush() - - case Error(ex) => - formatError(ex) - Console.flush() - - case Done(ctx) => - ctx.config.auth match { - case AuthMethod.AliasHeader(_) => - info("Thanks for uploading.") - case _ => - if (ctx.upload != Upload.empty) { - val publicUrl = ctx.upload.publishId. - map(id => ctx.config.endpoint.asString +"#id="+id) - val privateUrl = ctx.config.endpoint.asString +"#uid="+ctx.upload.id - info(privateUrl) - publicUrl.foreach(info) - } - } - latch.countDown() - - case Manual(text, html) => - info(text) - } - - def info(line: String): Unit = - out.println(line) - - def error(line: String): Unit = - err.println(red(line)) - - def warn(line: String): Unit = - out.println(yellow(line)) -} - -object StdoutSink { - - def red(s: String): String = RED + s + RESET - def white(s: String): String = WHITE + s + RESET - def cyan(s: String): String = CYAN + s + RESET - def yellow(s: String): String = YELLOW + s + RESET - - @annotation.tailrec - def repeat(n: Int, s: String, target: String = ""): String = - if (n <= 0) target - else repeat(n -1, s, target + s) - - def formatError(ex: Throwable): String = - ex match { - case ClientError(all@NonEmptyList(first, rest)) => - if (rest == Nil) red(first) - else red("The following errors occurred:\n") + all.toList.map(item => red(s"- $item")).mkString("\n") - case _ => - red(ex.getMessage) - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/cmds.scala b/modules/cli/src/main/scala/sharry/cli/cmds.scala deleted file mode 100644 index c416187a..00000000 --- a/modules/cli/src/main/scala/sharry/cli/cmds.scala +++ /dev/null @@ -1,273 +0,0 @@ -package sharry.cli - -import java.nio.file.Path - -import fs2.{async, text, Pipe, Scheduler, Stream} -import cats.effect.IO -import fs2.io.file -import fs2.async.mutable.Signal -import spinoco.fs2.http.HttpClient -import spinoco.protocol.http.header.`Set-Cookie` -import spinoco.protocol.http.header.value.HttpCookie -import spinoco.protocol.http.HttpStatusCode -import io.circe.parser._ -import org.log4s._ -import yamusca.implicits._ -import scala.concurrent.ExecutionContext - -import sharry.common.data._ -import sharry.common.file._ -import sharry.common.sizes._ -import sharry.common.duration._ -import sharry.cli.config._ -import sharry.mdutil.{Document,Link} - -object cmds extends requestlog { - import Cmd.syntax._ - - val logger = getLogger - - def sendPrepare: Cmd = Cmd { (_, progress) => ctx => - progress.info(Progress.Prepare(ctx.config)) ++ Stream(ctx) - } - - def checkResumeFile: Cmd = Cmd { (_, _) => ctx => - val msg = "There is an uncompleted upload. Either use `resume --abort' to remove it or run `resume --continue' to resume the upload." - logger.debug(s"Checking non-existence of resume file: ${ctx.config.resumeFile}") - if (ctx.config.resumeFile.exists) Stream.raiseError(ClientError(msg)) - else Stream(ctx) - } - - def writeResumeFile: Cmd = Cmd { (_, _) => ctx => - Stream.eval( - ctx.config.resumeFile.parent.mkdirs().map { _ => - logger.debug(s"Writing to resume file: $ctx") - ctx.config.resumeFile.write(ctx) - }).map(_ => ctx) - } - - def deleteResumeFile: Cmd = Cmd { (_, _) => ctx => - logger.debug(s"Deleting resume file: ${ctx.config.resumeFile}") - Stream.eval(ctx.config.resumeFile.delete).map(_ => ctx) - } - - def loadResumeFile: Cmd = Cmd { (_, _) => ctx => - logger.debug(s"Loading context from resume file: ${ctx.config.resumeFile}") - if (!ctx.config.resumeFile.exists) Stream.raiseError(ClientError("There is no upload to resume or abort.")) - else ctx.config.resumeFile.readAll(8192.bytes). - through(text.utf8Decode). - through(text.lines). - fold1(_ + _). - evalMap(str => IO(decode[Context](str))). - flatMap { - case Right(a) => Stream(a) - case Left(err) => Stream.raiseError(ClientError(err.toString)) - }. - map(fileCtx => ctx.copy(upload = fileCtx.upload).copy(config = fileCtx.config)) - } - - def loadServerSettings: Cmd = Cmd { (client, progress) => ctx => - logger.debug("Load server settings") - val remoteConfig = for { - resp <- client.dorequest(ctx.serverSettingReq) - rcfg <- Stream.eval(resp.bodyAs[RemoteConfig]) - } yield rcfg.fold(err => throw ClientError(err.toString), rcfg => ctx.copy(remoteConfig = rcfg)) - remoteConfig.flatMap { c => progress.info(Progress.ServerWelcome(c)) ++ Stream(c) } - } - - def validateContext: Cmd = Cmd { (_, _) => ctx => - logger.debug("Validating user input against server settings") - Stream.eval(IO(Context.validate(ctx).fold(fail => throw ClientError(fail), identity))) - } - - def checkVersions: Cmd = Cmd { (_, progress) => ctx => - logger.debug("Checking cli and server versions") - val vm = Progress.VersionMismatch(ctx.remoteConfig.version) - val check: Stream[IO, Nothing] = if (vm.isMismatch) progress.info(vm) else Stream.empty - check ++ Stream(ctx) - } - - def login: Cmd = new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = - _.flatMap { ctx => - ctx.config.auth match { - case a@AuthMethod.UserLogin(login, _, _) => - logger.debug(s"Authenticating with user/password pair for $login") - progress.info(Progress.Authenticating(ctx.config.endpoint)) ++ Stream.eval(a.readPassword). - flatMap { pass => - client.dorequest(ctx.loginReq(UserPass(login, pass))) - .flatMap { resp => - if (resp.header.status == HttpStatusCode.Ok) { - resp.header.firstHeader[`Set-Cookie`]. - map(_.value). - map(c => Stream.eval(async.signalOf[IO, HttpCookie](c)).map(s => ctx.copy(cookie = Some(s)))). - getOrElse(Stream(ctx)) - } else { - Stream.raiseError(ClientError("Authentication failed!")) - } - } - } - case _ => - logger.debug(s"No authentication necessary in auth-mode ${ctx.config.auth}") - Stream(ctx) - } - } - } - - def refreshCookie: Cmd = new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = - _.flatMap { ctx => - ctx.cookie match { - case Some(s) => - val interval = math.max(2000, ctx.remoteConfig.cookieAge - 1000).millis.asScala - val setter: Stream[IO, Unit] = for { - _ <- SCH.awakeEvery[IO](interval) - _ <- log(_.debug("Awake for refreshing cookie")) - cookie <- Stream.eval(s.get) - _ <- log(_.debug("Refreshing cookie now")) - resp <- client.dorequest(ctx.loginRefreshReq(cookie)) - _ <- resp.header.firstHeader[`Set-Cookie`]. - filter(_ => resp.header.status == HttpStatusCode.Ok). - map(nc => Stream.eval(s.set(nc.value))). - getOrElse(Stream.emit(()).covary[IO]) - } yield () - logger.debug(s"Scheduling cookie refresh every ${interval}") - Stream.eval(async.start(setter.compile.drain)).drain ++ Stream(ctx) - case None => - Stream(ctx) - } - } - } - - def createUpload: Cmd = Cmd { (client, progress) => ctx => - progress.info(Progress.CreateUpload) ++ (for { - up <- ctx.newUpload - _ <- log(_.debug(s"Creating upload: $up")) - req <- ctx.createUploadReq(up) - resp <- client.dorequest(req).through(ClientError.onSuccess) - upload <- Stream(Upload(up.id, "", Duration.zero, up.maxdownloads)) - } yield ctx.copy(upload = upload)) - } - - case class ChunkResult(path: Path, info: ChunkInfo, status: HttpStatusCode) - type FileId = Path => String - object FileId { - def normalize(str: String): String = - str.replaceAll("[\\s\\.]+", "-") - - def default: FileId = file => - s"${file.length}-${normalize(file.name)}" - } - - def uploadFile(client: HttpClient[IO])(path: Path, progress: Signal[IO, Progress], fileId: FileId, ctx: Context): Stream[IO, ChunkResult] = { - val chunkSize = ctx.remoteConfig.chunkSize.toInt - val fileName = path.name - val fileSize = path.length - val totalChunks = fileSize / chunkSize + (if (fileSize % chunkSize == 0) 0 else 1) - file.readAll[IO](path, chunkSize). - chunks. - zipWithIndex. - flatMap { case (chunk, i) => - val info = ChunkInfo(ctx.upload.id, i.toInt+1, chunkSize, chunk.size, fileSize, fileId(path), fileName, totalChunks.toInt) - val progressUpdate = progress.update { - case Progress.Uploaded(current, total) => - Progress.Uploaded(current + info.currentChunkSize.bytes, total) - case _ => - Progress.Uploaded(info.currentChunkSize.bytes, ctx.size) - } - ctx.checkChunkReq(info).flatMap(req => client.dorequest(req)). - flatMap { checkResp => - if (checkResp.header.status == HttpStatusCode.Ok) { - log(_.debug(s"Chunk $info already uploaded.")).drain ++ - Stream(ChunkResult(path, info, HttpStatusCode.Ok)) ++ progressUpdate - } else { - log(_.debug(s"Uploading chunk $info.")).drain ++ ctx.uploadChunkReq(info, chunk). - flatMap(req => client.dorequest(req)). - map(_.header.status). - map(ChunkResult(path, info, _)) ++ progressUpdate - } - } - } - } - - def uploadAllFiles(fileId: FileId): Cmd = new Cmd { - def apply(client: HttpClient[IO], progress: Signal[IO, Progress]) - (implicit S: ExecutionContext, SCH: Scheduler): Pipe[IO, Context, Context] = - _.flatMap { ctx => - logger.info(s"Start uploading ${ctx.count} files") - if (ctx.config.files.isEmpty) Stream(ctx) - else { - val all = Stream.emits(ctx.config.files).covary[IO]. - map(path => uploadFile(client)(path, progress, fileId, ctx)) - - all.join(ctx.parallelUploads). - fold1((a,b) => a). // TODO handle errors in chunks - map(_ => ctx) - } - } - } - - def deleteUpload: Cmd = Cmd { (client, progress) => ctx => - logger.info(s"Deleting upload: ${ctx.upload.id}") - progress.info(Progress.DeleteUpload) ++ ctx.deleteUploadReq(ctx.upload.id). - flatMap(req => client.dorequest(req)). - through(ClientError.onSuccess). - map(_ => ctx). - handleErrorWith { ex => - progress.info(Progress.Error(ex)) ++ Stream(ctx) - } - } - - def publishUpload: Cmd = Cmd { (client, progress) => ctx => - ctx.config.auth match { - case AuthMethod.AliasHeader(_) => - log(_.info("Not publishing an upload to an alias")).drain ++ Stream(ctx) - case _ => - logger.debug(s"Publishing upload ${ctx.upload.id}") - progress.info(Progress.PublishUpload) ++ ctx.publishUploadReq. - flatMap(req => client.dorequest(req)). - through(ClientError.onSuccess). - flatMap(resp => Stream.eval(resp.bodyAs[UploadInfo].map(_.map(_.upload).require))). - map(up => ctx.copy(upload = up)) - } - } - - def processMarkdown(fileId: FileId): Cmd = Cmd { (_, progress) => ctx => - logger.debug(s"Processing markdown file: ${ctx.config.files.headOption}") - progress.info(Progress.ProcessingMarkdown) ++ ctx.readSingleFile. - evalMap(str => IO(Document.parse(str))). - map { doc => - val files = collection.mutable.ListBuffer[Path]() - val p = doc.mapLinks { link => - val f = sharry.common.file(link.path) - if (f.exists) { - files += f - Link(s"{{fileid_${fileId(f)}.url}}") - } else link - } - ctx.copy(config = ctx.config.copy( - description = Some(p.renderMd) - , descriptionFile = None - , files = files.toList)) - } - } - - def manual(html: Boolean): Cmd = Cmd { (_, progress) => ctx => - val reference = IO(scala.io.Source.fromURL(getClass.getResource("/reference.conf")).getLines.mkString("\n")) - val helpStr = parser.optionParser.renderUsage(parser.optionParser.renderingMode) - val md = IO(scala.io.Source.fromURL(getClass.getResource("/cli.md")).getLines.mkString("\n")). - flatMap { str => reference.flatMap { ref => - IO(Map("cli-help" -> helpStr, "default-cli-config" -> ref).unsafeRender(str)) - }} - val toHtml: String => IO[String] = mdText => IO { - if (html) Document.parse(mdText).renderHtml else mdText - } - - log(_.info("Preparing manual")).drain ++ Stream.eval(md). - evalMap(toHtml). - map(Progress.Manual(_, html)). - flatMap(progress.info) ++ Stream(ctx) - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/config.scala b/modules/cli/src/main/scala/sharry/cli/config.scala deleted file mode 100644 index 07282c63..00000000 --- a/modules/cli/src/main/scala/sharry/cli/config.scala +++ /dev/null @@ -1,167 +0,0 @@ -package sharry.cli - -import spinoco.protocol.http.Uri -import java.nio.file.{Path, Paths, Files} -import com.typesafe.config.{ConfigValueFactory, ConfigFactory} - -import cats.syntax.either._ -import cats.effect.IO -import pureconfig._ -import pureconfig.ConvertHelpers._ -import pureconfig.error._ -import org.log4s._ -import io.circe._, io.circe.generic.semiauto._ - -import sharry.common.JsonCodec -import sharry.common.duration._ - -object config { - private val logger = getLogger - - case class Config( - mode: Mode, - endpoint: Uri, - auth: AuthMethod, - valid: Duration, - maxDownloads: Int, - resumeFile: Path, - source: Option[Path] = None, - password: Option[String] = None, - parallelUploads: Option[Int] = None, - description: Option[String] = None, - descriptionFile: Option[Path] = None, - loglevel: String = "off", - files: Seq[Path] = Seq.empty - ) - - sealed trait Mode extends Product { - lazy val name: String = KebabCase.fromTokens(CamelCase.toTokens(productPrefix)) - } - object Mode { - case object UploadFiles extends Mode - case object PublishFiles extends Mode - case object MdUpload extends Mode - case object MdPublish extends Mode - case class Resume(abort: Boolean) extends Mode - case class Manual(html: Boolean) extends Mode - - implicit val jsonEncoder: Encoder[Mode] = deriveEncoder[Mode] - implicit val jsonDecoder: Decoder[Mode] = deriveDecoder[Mode] - } - - sealed trait AuthMethod - object AuthMethod { - case class AliasHeader(alias: String) extends AuthMethod - case class UserLogin(login: String, password: String, passwordCommand: String) extends AuthMethod { - def readPassword: IO[String] = - if (passwordCommand.trim.isEmpty) IO.pure(password) - else OS.command(passwordCommand). - flatMap(_.runFirstLine) - } - case object NoAuth extends AuthMethod - - implicit val jsonDecoder: Decoder[AuthMethod] = deriveDecoder[AuthMethod] - implicit val jsonEncoder: Encoder[AuthMethod] = deriveEncoder[AuthMethod] - } - - object Config { - val empty = Config(Mode.PublishFiles, Uri.http("localhost", ""), AuthMethod.NoAuth, Duration.zero, 0, Paths.get("")) - - private def readValue[A](s: String)(implicit r: ConfigReader[A]): Either[ConfigReaderFailures, A] = - r.from(ConfigValueFactory.fromAnyRef(s)) - - private def throwLeft[A](e: Either[ConfigReaderFailures, A]): A = - e.valueOr(x => throw new ConfigReaderException(x)) - - def readDuration(s: String): Either[ConfigReaderFailures, Duration] = - readValue[Duration](s) - - def readDurationOrThrow(s: String) = - throwLeft(readDuration(s)) - - def readPath(s: String): Either[ConfigReaderFailures, Path] = - readValue[Path](s) - - def readExistingPathOrThrow(s: String) = { - val reason = Some(new Exception(s"The file '$s' cannot be found")) - throwLeft(readPath(s).ensure(ConfigReaderFailures(CannotReadFile(Paths.get(s), reason)))(f => Files.exists(f))) - } - - def readUri(s: String): Either[ConfigReaderFailures, Uri] = - readValue[Uri](s) - - def readUriOrThrow(s: String): Uri = - throwLeft(readUri(s)) - - val defaultConfig: Either[ConfigReaderFailures, Config] = - loadConfig[Config]("sharry.cli") - - def fromFile(file: String): Either[ConfigReaderFailures, Config] = - readPath(file).flatMap(fromPath) - - def fromPath(file: Path): Either[ConfigReaderFailures, Config] = - loadConfig[Config](file, "sharry.cli") - - def fromDefaultConfig(source: Option[Path]): Either[ConfigReaderFailures, Config] = { - val userdir = readPath(ConfigFactory.defaultReference().getString("user.home")) - val file = Right(source). - flatMap { - case Some(f) => Right(f) - case None => - userdir.map(d => d.resolve(".config").resolve("sharry").resolve("cli.conf")) - } - file.flatMap { f => - if (!Files.exists(f)) { - logger.debug(s"Configuration file $f doesn't exist.") - defaultConfig - } else { - logger.debug(s"Loading config from file $file") - fromPath(f) - } - } - } - - def loadDefaultConfig(source: Option[Path]): IO[Config] = IO { - fromDefaultConfig(source) match { - case Right(c) => c - case Left(errs) => throw new ConfigReaderException(errs) - } - } - - implicit def hint[T] = ProductHint[T](ConfigFieldMapping(CamelCase, KebabCase)) - - implicit def uriConvert: ConfigReader[Uri] = ConfigReader.fromString[Uri](catchReadError(s => - Uri.parse(s).toEither match { - case Right(u) => u - case Left(err) => throw new IllegalArgumentException(s"Uri parsing failed: $err") - } - )) - - implicit def pathConvert: ConfigReader[Path] = ConfigReader.fromString[Path](catchReadError(s => - Paths.get(s) - )) - - implicit def durationConvert: ConfigReader[Duration] = ConfigReader.fromString[Duration](catchReadError(s => - Duration.unsafeParse(s) - )) - - implicit def modeConvert: ConfigReader[Mode] = - ConfigReader.fromString[Mode](s => s match { - case Mode.UploadFiles.name => Right(Mode.UploadFiles) - case Mode.PublishFiles.name => Right(Mode.PublishFiles) - case Mode.MdUpload.name => Right(Mode.MdUpload) - case Mode.MdPublish.name => Right(Mode.MdPublish) - case s => Right(Mode.PublishFiles) - }) - - - import JsonCodec._ - - implicit val _uriDec: Decoder[Uri] = Decoder.decodeString.map(s => Uri.parse(s).require) - implicit val _uriEnc: Encoder[Uri] = Encoder.encodeString.contramap(uri => uri.asString) - - implicit val jsonDecoder: Decoder[Config] = deriveDecoder[Config] - implicit val jsonEncoder: Encoder[Config] = deriveEncoder[Config] - - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/main.scala b/modules/cli/src/main/scala/sharry/cli/main.scala deleted file mode 100644 index 01a6fe8d..00000000 --- a/modules/cli/src/main/scala/sharry/cli/main.scala +++ /dev/null @@ -1,81 +0,0 @@ -package sharry.cli - -import java.nio.channels.AsynchronousChannelGroup -import java.util.concurrent.{Executors, CountDownLatch, TimeUnit, ThreadFactory} -import java.util.concurrent.atomic.AtomicLong -import org.slf4j.LoggerFactory -import org.log4s._ -import ch.qos.logback.classic.LoggerContext -import ch.qos.logback.classic.joran.JoranConfigurator -import ch.qos.logback.core.util.StatusPrinter - -import fs2.{Sink, Stream, Scheduler} -import cats.effect.IO -import sharry.cli.config._ -import scala.concurrent.ExecutionContext - -object main extends maincmds { - implicit val EC = ExecutionContext.fromExecutorService(Executors.newCachedThreadPool(new ThreadFactory() { - private val counter = new AtomicLong(0) - def newThread(r: Runnable) = - new Thread(r, s"sharry-${counter.getAndIncrement}") - })) - implicit val ACG = AsynchronousChannelGroup.withThreadPool(EC) // http.server requires a group - implicit val SCH = Scheduler.fromScheduledExecutorService(Executors.newScheduledThreadPool(5)) - - private val parseError = ClientError("Invalid arguments.") - - def parse(args: Array[String], default: Config): IO[Config] = - parser.optionParser.parse(args, default) match { - case Some(cfg) => IO.pure(cfg) - case None => IO.raiseError(parseError) - } - - def execute(cfg: Config): IO[Unit] = { - val latch = new CountDownLatch(1) // a poor approach to ensure last progress event (all cmds must have a `done' at the end!) - val stdout: Sink[IO, Progress] = new StdoutSink(cfg, latch) - val task = cfg.mode match { - case Mode.UploadFiles => upload - case Mode.PublishFiles => publish - case Mode.Resume(abort) => - if (abort) resumeAbort else resumeContinue - case Mode.MdPublish => mdPublish - case Mode.MdUpload => mdUpload - case Mode.Manual(html) => cmds.manual(html) - } - (Cmd.eval(task, cfg, stdout) ++ Stream.eval(IO(latch.await(2, TimeUnit.SECONDS))).drain).compile.drain - } - - def setupLogging(cfg: Config): IO[Unit] = IO { - val context = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext] - val config = new JoranConfigurator() - config.setContext(context) - context.reset() - context.putProperty("sharry.loglevel", cfg.loglevel) - config.doConfigure(getClass.getResource("/logback.xml")) - StatusPrinter.printInCaseOfErrorsOrWarnings(context) - } - - def main(args: Array[String]): Unit = { - val program = for { - zeroCfg <- parse(args, Config.empty) // only parse for getting the config file - defaultCfg <- Config.loadDefaultConfig(zeroCfg.source) - cfg <- parse(args, defaultCfg) - _ <- setupLogging(cfg) - _ <- execute(cfg) - } yield () - - program.attempt.unsafeRunSync match { - case Right(_) => - Console.flush() - System.exit(0) - case Left(ex) => - if (ex != parseError) { - getLogger.error(ex)(s"Error running command: ${args.mkString(" ")}") - Console.err.println(StdoutSink.formatError(ex)) - Console.flush() - } - System.exit(1) - } - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/maincmds.scala b/modules/cli/src/main/scala/sharry/cli/maincmds.scala deleted file mode 100644 index c26ccb46..00000000 --- a/modules/cli/src/main/scala/sharry/cli/maincmds.scala +++ /dev/null @@ -1,56 +0,0 @@ -package sharry.cli - -import sharry.cli.cmds._ -import sharry.cli.config._ - -trait maincmds { - - private val loginCmd: Cmd = - sendPrepare >> loadServerSettings >> validateContext >> checkVersions >> login - - private val publishIf: Cmd = Cmd.choice { ctx => - ctx.config.mode match { - case Mode.PublishFiles => publishUpload - case Mode.MdPublish => publishUpload - case _ => Cmd.identity - } - } - - private val fileUpload: Cmd = Cmd(checkResumeFile - , loginCmd - , refreshCookie - , createUpload - , writeResumeFile - , uploadAllFiles(FileId.default) - , deleteResumeFile) - - /** Task to upload files. */ - def upload: Cmd = fileUpload - - /** Task to upload and publish files. */ - val publish: Cmd = - fileUpload >> publishUpload - - /** Resume an upload */ - val resumeContinue: Cmd = Cmd(loadResumeFile - , loginCmd - , refreshCookie - , uploadAllFiles(FileId.default) - , deleteResumeFile - , publishIf) - - /** Abort an upload */ - val resumeAbort: Cmd = Cmd(loadResumeFile - , loginCmd - , deleteUpload - , deleteResumeFile) - - val mdUpload: Cmd = - processMarkdown(FileId.default) >> fileUpload - - val mdPublish: Cmd = Cmd(processMarkdown(FileId.default) - , fileUpload - , publishUpload) -} - -object maincmds extends maincmds diff --git a/modules/cli/src/main/scala/sharry/cli/package.scala b/modules/cli/src/main/scala/sharry/cli/package.scala deleted file mode 100644 index da69ab98..00000000 --- a/modules/cli/src/main/scala/sharry/cli/package.scala +++ /dev/null @@ -1,56 +0,0 @@ -package sharry - -import cats.effect.IO -import spinoco.fs2.http.body.{BodyDecoder, BodyEncoder} -import spinoco.fs2.http.routing.{body => rbody} -import spinoco.protocol.mime._ -import spinoco.protocol.http.Uri -import scodec.{Attempt, Err} -import scodec.bits.ByteVector -import io.circe.{Json, Encoder, Decoder}, io.circe.parser._, io.circe.syntax._ - -//TODO this is the same code as in server/route/package.scala -package object cli { - - private def parseJson(b: ByteVector): Attempt[Json] = - for { - str <- b.decodeUtf8.attempt - json <- parse(str).attempt - } yield json - - private def decodeJson[A](b: ByteVector)(implicit dec: Decoder[A]): Attempt[A] = - for { - json <- parseJson(b) - a <- dec.decodeJson(json).attempt - } yield a - - - implicit def jsonBodyDecoder[A](implicit jd: Decoder[A]): BodyDecoder[A] = - BodyDecoder { (bs, ct) => - if (ct.mediaType == MediaType.`application/json`) decodeJson(bs) - else Attempt.failure(Err(s"Unsupported content type: $ct")) - } - - implicit def jsonBodyEncoder[A](implicit je: Encoder[A]): BodyEncoder[A] = - BodyEncoder(ContentType.TextContent(MediaType.`application/json`, Some(MIMECharset.`UTF-8`))) { a => - ByteVector.encodeUtf8(a.asJson.spaces2).attempt - } - - def jsonBody[A](implicit d: BodyDecoder[A]) = rbody[IO].as[A] - - implicit final class EitherAttempt[A, B](e: Either[A,B]) { - def attempt: Attempt[B] = Attempt.fromEither(e.left.map(a => Err(a.toString))) - } - - implicit final class StringOps(s: String) { - def asNonEmpty: Option[String] = Option(s).map(_.trim).filter(_.nonEmpty) - } - - implicit final class UriOps(uri: Uri) { - def / (seg: String): Uri = uri.copy(path = uri.path.copy(initialSlash = true) / seg) - def / (path: Uri.Path): Uri = uri.copy(path = uri.path.copy(segments = uri.path.segments ++ path.segments, initialSlash = true, trailingSlash = path.trailingSlash)) - - def asString: String = - Uri.codec.encode(uri).require.decodeUtf8.right.get - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/parser.scala b/modules/cli/src/main/scala/sharry/cli/parser.scala deleted file mode 100644 index 79e64bb2..00000000 --- a/modules/cli/src/main/scala/sharry/cli/parser.scala +++ /dev/null @@ -1,145 +0,0 @@ -package sharry.cli - -import sharry.common.duration._ -import java.nio.file.Path - -import spinoco.protocol.http.{Uri, HostPort} -import sharry.common.{version => sharryVersion} -import sharry.cli.config._ - -object parser { - implicit private def uriRead: scopt.Read[Uri] = - scopt.Read.reads(Config.readUriOrThrow) - - implicit private def durationRead: scopt.Read[Duration] = - scopt.Read.reads(Config.readDurationOrThrow) - - implicit private def pathRead: scopt.Read[Path] = - scopt.Read.reads(Config.readExistingPathOrThrow) - - val optionParser = new scopt.OptionParser[Config]("sharry") { - head("Sharry", sharryVersion.longVersion) - - help("help").text("Prints this help message.") - version("version").text("Prints version info") - - opt[Path]("config").action((file, c) => c.copy(source = Some(file))). - valueName(""). - text("Specify a configuration file to read instead of using the default location.") - - opt[String]("loglevel").action((level, c) => c.copy(loglevel = level)). - text("Set a logging level: off,error,warn,info,debug,trace. Default is off.\n") - - cmd(Mode.UploadFiles.name).action((_, c) => c.copy(mode = Mode.UploadFiles)). - text("Upload files without publishing them."). - children((mdOpts ++ descriptionOpts ++ manyFiles): _*) - - cmd(Mode.PublishFiles.name).action((_, c) => c.copy(mode = Mode.PublishFiles)). - text("Upload and publish some files"). - children((mdOpts ++ descriptionOpts ++ manyFiles): _*) - - cmd(Mode.MdUpload.name).action((_, c) => c.copy(mode = Mode.MdUpload)). - text("Upload a markdown file together with its referenced files"). - children((mdOpts ++ oneMdFile): _*) - - cmd(Mode.MdPublish.name).action((_, c) => c.copy(mode = Mode.MdPublish)). - text("Publish a markdown file together with its referenced files"). - children((mdOpts ++ oneMdFile): _*) - - cmd(Mode.Resume(false).name).action((_, c) => c.copy(mode = Mode.Resume(false))). - text("Resume an uncompleted upload"). - children( - opt[Unit]("continue"). - text("Resume an uncompleted upload"). - action((_, c) => c.copy(mode = Mode.Resume(false))), - opt[Unit]("abort"). - text("Abort uncompleted upload\n"). - action((_, c) => c.copy(mode = Mode.Resume(true)))) - - cmd(Mode.Manual(false).name).action((_, c) => c.copy(mode = Mode.Manual(false))). - text("Show the man page, either as markdown or html"). - children( - opt[Unit]("html"). - text("Print man page as HTML"). - action((_, c) => c.copy(mode = Mode.Manual(true))), - opt[Unit]("text"). - text("Print man page as text (the default)"). - action((_, c) => c.copy(mode = Mode.Manual(false)))) - - - checkConfig(cfg => cfg.mode match { - case _: Mode.Resume => Right(()) - case _: Mode.Manual => Right(()) - case _ => - cfg.endpoint match { - case Uri(_, HostPort("nothing", _), _, _) => - Left("A sharry endpoint url is required.") - case _ => Right(()) - } - }) - checkConfig(cfg => cfg.auth match { - case AuthMethod.AliasHeader("") => Left("An alias id or a username/pass pair is required.") - case AuthMethod.UserLogin("", _, _) => Left("An alias id or a username/pass pair is required.") - case _ => Right(()) - }) - - private def mdOpts = Seq( - opt[String]("alias"). - text("The alias id for uploading"). - action((id, c) => c.copy(auth = AuthMethod.AliasHeader(id))), - opt[Uri]("endpoint"). - text("The sharry server url"). - action((url, c) => c.copy(endpoint = url)), - opt[String]("login"). - text("The login for authenticating with the server"). - action((login, c) => c.copy(auth = c.auth match { - case AuthMethod.UserLogin(_, pass, passCmd) => AuthMethod.UserLogin(login, pass, passCmd) - case _ => AuthMethod.UserLogin(login, "", "") - })), - opt[String]("pass"). - text("The password for authenticating with the server"). - action((pw, c) => c.copy(auth = c.auth match { - case AuthMethod.UserLogin(login, _, passCmd) => AuthMethod.UserLogin(login, pw, "") - case _ => AuthMethod.UserLogin("", pw, "") - })), - opt[Duration]("valid"). - text("The validity for this upload"). - action((d, c) => c.copy(valid = d)), - opt[Int]("max-downloads"). - text("Maximum number of downloads for the upload"). - action((n, c) => c.copy(maxDownloads = n)), - opt[String]("password"). - text("The password to protect the upload with"). - action((pw, c) => c.copy(password = Some(pw))), - opt[Int]("parallel-uploads"). - text("Number of parallel uploads."). - action((n, c) => c.copy(parallelUploads = Some(n))) - ) - - private def descriptionOpts = - Seq( - opt[String]("description"). - text("The description of the upload (maybe markdown)"). - action((s, c) => c.copy(description = Some(s))), - opt[Path]("@description"). - valueName(""). - text("Use contents of the given file as description"). - action((p, c) => c.copy(descriptionFile = Some(p))) - ) - - private def oneMdFile = Seq( - arg[Path](""). - required(). - text("The markdown file to inspect and upload\n"). - action((f, c) => c.copy(files = Seq(f))) - ) - - private def manyFiles = Seq( - arg[Path](" ..."). - text("The files to upload\n"). - required(). - unbounded(). - action((f, c) => c.copy(files = c.files :+ f)) - ) - } -} diff --git a/modules/cli/src/main/scala/sharry/cli/requestlog.scala b/modules/cli/src/main/scala/sharry/cli/requestlog.scala deleted file mode 100644 index c476fe27..00000000 --- a/modules/cli/src/main/scala/sharry/cli/requestlog.scala +++ /dev/null @@ -1,31 +0,0 @@ -package sharry.cli - -import org.log4s._ -import fs2.Stream -import cats.effect.IO -import spinoco.fs2.http._ -import spinoco.protocol.http.header.`User-Agent` -import spinoco.protocol.http.header.value.AgentVersion - -import sharry.common.version - -trait requestlog { - - def logger: Logger - - def log(f: Logger => Unit): Stream[IO, Unit] = - Stream.eval(IO(f(logger))) - - - implicit class HttpClientLogOps(client: HttpClient[IO]) { - def dorequest(req: HttpRequest[IO]): Stream[IO, HttpResponse[IO]] = { - val rreq = req. - appendHeader(`User-Agent`(AgentVersion(s"Sharry Cli ${version.longVersion}"))) - for { - _ <- log(_.trace(s"Request: $rreq")) - resp <- client.request(rreq) - _ <- log(_.trace(s"Response: $resp")) - } yield resp - } - } -} diff --git a/modules/common/src/main/scala/sharry/common/AccountId.scala b/modules/common/src/main/scala/sharry/common/AccountId.scala new file mode 100644 index 00000000..130f7f6a --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/AccountId.scala @@ -0,0 +1,38 @@ +package sharry.common + +import cats.implicits._ + +case class AccountId(id: Ident, userLogin: Ident, admin: Boolean, alias: Option[Ident]) { + + def asString = + alias match { + case Some(a) => + s"${id.id}/${userLogin.id}/$admin/${a.id}" + case None => + s"${id.id}/${userLogin.id}/$admin" + } + +} + +object AccountId { + + val empty: AccountId = + AccountId(Ident.empty, Ident.empty, false, None) + + def parse(str: String): Either[String, AccountId] = { + val parts = str.split('/').toList.appended("").take(4) + + parts match { + case List(id, acc, adm, ali) => + for { + aid <- Ident.fromString(id) + name <- Ident.fromString(acc) + flag <- Either.catchNonFatal(adm.trim.toBoolean).leftMap(_.getMessage) + alias <- Ident.fromString(ali) + } yield AccountId(aid, name, flag, Option(alias).filter(_.nonEmpty)) + case _ => + Left(s"Invalid accountId: $str") + } + } + +} diff --git a/modules/common/src/main/scala/sharry/common/AccountSource.scala b/modules/common/src/main/scala/sharry/common/AccountSource.scala new file mode 100644 index 00000000..a5cb1e19 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/AccountSource.scala @@ -0,0 +1,43 @@ +package sharry.common + +import io.circe.Decoder +import io.circe.Encoder + +sealed trait AccountSource { + + def name: String + +} + +object AccountSource { + + case object Intern extends AccountSource { + val name = "intern" + } + case object Extern extends AccountSource { + val name = "extern" + } + case class OAuth(context: String) extends AccountSource { + val name = s"oauth:$context" + } + + def parse(str: String): Either[String, AccountSource] = + str.toLowerCase match { + case "intern" => Right(Intern) + case "extern" => Right(Extern) + case s if s.startsWith("oauth:") => Right(OAuth(s.substring(6))) + case _ => Left(s"Invalid account source: $str") + } + + def unsafe(str: String): AccountSource = + parse(str).fold(sys.error, identity) + + def intern: AccountSource = Intern + def extern: AccountSource = Extern + def oauth(context: String): AccountSource = OAuth(context) + + implicit val jsonDecoder: Decoder[AccountSource] = + Decoder.decodeString.emap(parse) + implicit val jsonEncoder: Encoder[AccountSource] = + Encoder.encodeString.contramap(_.name) +} diff --git a/modules/common/src/main/scala/sharry/common/AccountState.scala b/modules/common/src/main/scala/sharry/common/AccountState.scala new file mode 100644 index 00000000..4044b598 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/AccountState.scala @@ -0,0 +1,37 @@ +package sharry.common + +import io.circe._ + +sealed trait AccountState { self: Product => + final def name: String = + productPrefix +} + +object AccountState { + val all = List(Active, Disabled) + + /** An active or enabled user. */ + case object Active extends AccountState + + /** The user is blocked by an admin. */ + case object Disabled extends AccountState + + def fromString(s: String): Either[String, AccountState] = + s.toLowerCase match { + case "active" => Right(Active) + case "disabled" => Right(Disabled) + case _ => Left(s"Not a state value: $s") + } + + def unsafe(str: String): AccountState = + fromString(str).fold(sys.error, identity) + + def asString(s: AccountState): String = s.name + + implicit val accountStateEncoder: Encoder[AccountState] = + Encoder.encodeString.contramap(AccountState.asString) + + implicit val accountStateDecoder: Decoder[AccountState] = + Decoder.decodeString.emap(AccountState.fromString) + +} diff --git a/modules/common/src/main/scala/sharry/common/Banner.scala b/modules/common/src/main/scala/sharry/common/Banner.scala new file mode 100644 index 00000000..bed0f525 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/Banner.scala @@ -0,0 +1,31 @@ +package sharry.common + +case class Banner( + version: String, + gitHash: Option[String], + jdbcUrl: LenientUri, + configFile: Option[String], + baseUrl: LenientUri +) { + + private val banner = + """ __ _ + |/ _\ |__ __ _ _ __ _ __ _ _ + |\ \| '_ \ / _` | '__| '__| | | | + |_\ \ | | | (_| | | | | | |_| | + |\__/_| |_|\__,_|_| |_| \__, | + | |___/ + |""".stripMargin + + s""" v$version (#${gitHash.map(_.take(8)).getOrElse("")})""" + + def render(prefix: String): String = { + val text = banner.split('\n').toList ++ List( + s"Base-Url: ${baseUrl.asString}", + s"Database: ${jdbcUrl.asString}", + s"Config: ${configFile.getOrElse("")}", + "" + ) + + text.map(line => s"$prefix $line").mkString("\n") + } +} diff --git a/modules/common/src/main/scala/sharry/common/BaseJsonCodecs.scala b/modules/common/src/main/scala/sharry/common/BaseJsonCodecs.scala new file mode 100644 index 00000000..d0edb896 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/BaseJsonCodecs.scala @@ -0,0 +1,14 @@ +package sharry.common + +import java.time.Instant + +import io.circe._ + +object BaseJsonCodecs { + + implicit val encodeInstantEpoch: Encoder[Instant] = + Encoder.encodeJavaLong.contramap(_.toEpochMilli) + + implicit val decodeInstantEpoch: Decoder[Instant] = + Decoder.decodeLong.map(Instant.ofEpochMilli) +} diff --git a/modules/common/src/main/scala/sharry/common/ByteSize.scala b/modules/common/src/main/scala/sharry/common/ByteSize.scala new file mode 100644 index 00000000..9f2fb003 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/ByteSize.scala @@ -0,0 +1,68 @@ +package sharry.common +import io.circe.Decoder +import io.circe.Encoder + +final case class ByteSize(bytes: Long) { + + def toHuman: String = + ByteSize.bytesToHuman(bytes) + + def <= (other: ByteSize) = + bytes <= other.bytes + + def >= (other: ByteSize) = + bytes >= other.bytes + + def > (other: ByteSize) = + bytes > other.bytes + + def - (other: ByteSize) = + ByteSize(bytes - other.bytes) + + def + (other: ByteSize) = + ByteSize(bytes + other.bytes) +} + +object ByteSize { + + val zero = ByteSize(0L) + + def bytesToHuman(bytes: Long): String = + if (math.abs(bytes) < 1024 && bytes != Long.MinValue) s"${bytes}B" + else { + val k = bytes / 1024.0 + if (math.abs(k) < 1024) f"$k%.02fK" + else { + val m = k / 1024.0 + if (math.abs(m) < 1024) f"$m%.02fM" + else f"${m / 1024.0}%.02fG" + } + } + + def parse(str: String): Either[String, ByteSize] = + str.toLongOption + .map(ByteSize.apply) + .toRight(s"Not a valid size string: $str") + .orElse(span(str.toLowerCase) match { + case (num, "k") => + Right(ByteSize(math.round(num.toDouble * 1024))) + case (num, "m") => + Right(ByteSize(math.round(num.toDouble * 1024 * 1024))) + case (num, "g") => + Right(ByteSize(math.round(num.toDouble * 1024 * 1024 * 1024))) + case _ => + Left(s"Invalid byte string: $str") + }) + + private def span(str: String): (String, String) = + if (str.isEmpty) ("", "") + else (str.init, str.last.toString) + + def unsafe(str: String): ByteSize = + parse(str).fold(sys.error, identity) + + implicit val jsonDecoder: Decoder[ByteSize] = + Decoder.decodeLong.map(ByteSize.apply) + implicit val jsonEncoder: Encoder[ByteSize] = + Encoder.encodeLong.contramap(_.bytes) +} diff --git a/modules/common/src/main/scala/sharry/common/Duration.scala b/modules/common/src/main/scala/sharry/common/Duration.scala new file mode 100644 index 00000000..9e316264 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/Duration.scala @@ -0,0 +1,89 @@ +package sharry.common + +import cats.implicits._ +import scala.concurrent.duration.{FiniteDuration, Duration => SDur} +import java.time.{Duration => JDur} +import java.util.concurrent.TimeUnit + +import cats.effect.Sync +import io.circe.Decoder +import io.circe.Encoder + +final class Duration(val nanos: Long) extends AnyVal { + + def <= (other: Duration): Boolean = + nanos <= other.nanos + + def millis: Long = nanos / 1000000 + + def seconds: Long = millis / 1000 + + def minutes: Long = seconds / 60 + + def toScala: FiniteDuration = + FiniteDuration(nanos, TimeUnit.NANOSECONDS) + + def toJava: JDur = + JDur.ofNanos(nanos) + + def formatExact: String = + s"$millis ms" + + def formatHuman: String = { + val factors = List((1000000, "millis"), + (1000, "seconds"), + (60, "minutes"), + (60, "hours"), + (24, "days")) + + val (value, unit) = factors.foldLeft((nanos.toDouble, "nanos")) { + case ((r, runit), (fac, funit)) => + if (r < fac) (r, runit) + else (r / fac.toDouble, funit) + } + s"$value $unit" + } + + override def toString(): String = + formatHuman +} + +object Duration { + + def apply(d: SDur): Duration = + new Duration(d.toNanos) + + def apply(d: JDur): Duration = + new Duration(d.toNanos) + + def seconds(n: Long): Duration = + apply(JDur.ofSeconds(n)) + + def millis(n: Long): Duration = + apply(JDur.ofMillis(n)) + + def minutes(n: Long): Duration = + apply(JDur.ofMinutes(n)) + + def hours(n: Long): Duration = + apply(JDur.ofHours(n)) + + def days(n: Long): Duration = + apply(JDur.ofDays(n)) + + def nanos(n: Long): Duration = + new Duration(n) + + def stopTime[F[_]: Sync]: F[F[Duration]] = + for { + now <- Timestamp.current[F] + end = Timestamp.current[F] + } yield end.map(e => Duration.millis(e.toMillis - now.toMillis)) + + implicit def jsonDecoder: Decoder[Duration] = + Decoder.decodeLong.map(Duration.millis) + + implicit def jsonEncoder: Encoder[Duration] = + Encoder.encodeLong.contramap(_.millis) + +} diff --git a/modules/common/src/main/scala/sharry/common/Ident.scala b/modules/common/src/main/scala/sharry/common/Ident.scala new file mode 100644 index 00000000..cbd7cf81 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/Ident.scala @@ -0,0 +1,66 @@ +package sharry.common + +import java.security.SecureRandom +import java.util.UUID + +import cats.effect.Sync +import io.circe.{Decoder, Encoder} +import scodec.bits.ByteVector + +case class Ident(id: String) { + + def ++(other: Ident): Ident = + new Ident(id + other.id) + + def isEmpty: Boolean = + id.isEmpty + + def nonEmpty: Boolean = + !isEmpty +} + +object Ident { + val atSign: Ident = new Ident("@") + val empty: Ident = new Ident("") + + val chars: Set[Char] = (('A' to 'Z') ++ ('a' to 'z') ++ ('0' to '9') ++ "-_@.").toSet + + def randomUUID[F[_]: Sync]: F[Ident] = + Sync[F].delay(unsafe(UUID.randomUUID.toString)) + + def randomId[F[_]: Sync]: F[Ident] = Sync[F].delay { + val random = new SecureRandom() + val buffer = new Array[Byte](32) + random.nextBytes(buffer) + unsafe(ByteVector.view(buffer).toBase58.grouped(11).mkString("-")) + } + + def apply(str: String): Either[String, Ident] = + fromString(str) + + def fromString(s: String): Either[String, Ident] = + if (s.forall(chars.contains)) Right(new Ident(s)) + else Left(s"Invalid identifier: $s. Allowed chars: ${chars.mkString}") + + def fromBytes(bytes: ByteVector): Ident = + unsafe(bytes.toBase58) + + def fromByteArray(bytes: Array[Byte]): Ident = + fromBytes(ByteVector.view(bytes)) + + def unsafe(s: String): Ident = + fromString(s) match { + case Right(id) => id + case Left(err) => sys.error(err) + } + + def unapply(arg: String): Option[Ident] = + fromString(arg).toOption + + implicit val encodeIdent: Encoder[Ident] = + Encoder.encodeString.contramap(_.id) + + implicit val decodeIdent: Decoder[Ident] = + Decoder.decodeString.emap(Ident.fromString) + +} diff --git a/modules/common/src/main/scala/sharry/common/JsonCodec.scala b/modules/common/src/main/scala/sharry/common/JsonCodec.scala deleted file mode 100644 index f55a22ad..00000000 --- a/modules/common/src/main/scala/sharry/common/JsonCodec.scala +++ /dev/null @@ -1,21 +0,0 @@ -package sharry.common - -import java.nio.file.{Paths, Path} -import java.time.Instant -import io.circe._ -import sharry.common.duration._ - -/** Codecs for some java/base types.*/ -trait JsonCodec { - implicit val _instantDec: Decoder[Instant] = Decoder.decodeString.map(Instant.parse) - implicit val _instantEnc: Encoder[Instant] = Encoder.encodeString.contramap[Instant](_.toString) - - implicit val _durationDec: Decoder[Duration] = Decoder.decodeString.map(Duration.unsafeParse) - implicit val _durationEnc: Encoder[Duration] = Encoder.encodeString.contramap[Duration](_.formatExact) - - implicit val _pathDec: Decoder[Path] = Decoder.decodeString.map(Paths.get(_)) - implicit val _pathEnc: Encoder[Path] = Encoder.encodeString.contramap(_.toString) - -} - -object JsonCodec extends JsonCodec diff --git a/modules/common/src/main/scala/sharry/common/LenientUri.scala b/modules/common/src/main/scala/sharry/common/LenientUri.scala new file mode 100644 index 00000000..15f7f548 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/LenientUri.scala @@ -0,0 +1,233 @@ +package sharry.common + +import java.net.URL + +import fs2.Stream +import cats.implicits._ +import cats.data.NonEmptyList +import cats.effect.{Blocker, ContextShift, Sync} +import sharry.common.LenientUri.Path +import io.circe.{Decoder, Encoder} +import java.net.URLEncoder +import scodec.bits.ByteVector +import cats.effect.Resource +import java.net.HttpURLConnection + +/** A URI. + * + * It is not compliant to rfc3986, but covers most use cases in a convenient way. + */ +case class LenientUri( + scheme: NonEmptyList[String], + authority: Option[String], + path: LenientUri.Path, + query: Option[String], + fragment: Option[String] +) { + + def /(segment: String): LenientUri = + copy(path = path / segment) + + def ++(np: Path): LenientUri = + copy(path = np.segments.foldLeft(path)(_ / _)) + + def ++(np: String): LenientUri = { + val rel = LenientUri.stripLeading(np, '/') + ++(LenientUri.unsafe(s"a:$rel").path) + } + + def withQuery(name: String, value: String): LenientUri = + withQueryPlain(name, URLEncoder.encode(value, "UTF-8")) + + def withQueryPlain(name: String, value: String): LenientUri = + copy(query = query.map(q => q + "&" + name + "=" + value).orElse(Option(s"$name=$value"))) + + def withFragment(f: String): LenientUri = + copy(fragment = Some(f)) + + def toJavaUrl: Either[String, URL] = + Either.catchNonFatal(new URL(asString)).left.map(_.getMessage) + + def open[F[_]: Sync]: Either[String, Resource[F, HttpURLConnection]] = + toJavaUrl.map { url => + Resource + .make(Sync[F].delay(url.openConnection().asInstanceOf[HttpURLConnection]))( + conn => Sync[F].delay(conn.disconnect()) + ) + } + + def readURL[F[_]: Sync: ContextShift](chunkSize: Int, blocker: Blocker): Stream[F, Byte] = + Stream + .emit(Either.catchNonFatal(new URL(asString))) + .covary[F] + .rethrow + .flatMap( + url => fs2.io.readInputStream(Sync[F].delay(url.openStream()), chunkSize, blocker, true) + ) + + def host: Option[String] = + authority.map( + a => + a.indexOf(':') match { + case -1 => a + case n => a.substring(0, n) + } + ) + + def asString: String = { + val schemePart = scheme.toList.mkString(":") + val authPart = authority.map(a => s"//$a").getOrElse("") + val pathPart = path.asString + val queryPart = query.map(q => s"?$q").getOrElse("") + val fragPart = fragment.map(f => s"#$f").getOrElse("") + s"$schemePart:$authPart$pathPart$queryPart$fragPart" + } +} + +object LenientUri { + + sealed trait Path { + def segments: List[String] + def isRoot: Boolean + def isEmpty: Boolean + def /(segment: String): Path + def asString: String + } + case object RootPath extends Path { + val segments = Nil + val isRoot = true + val isEmpty = false + def /(seg: String): Path = + NonEmptyPath(NonEmptyList.of(seg)) + def asString = "/" + } + case object EmptyPath extends Path { + val segments = Nil + val isRoot = false + val isEmpty = true + def /(seg: String): Path = + NonEmptyPath(NonEmptyList.of(seg)) + def asString = "" + } + case class NonEmptyPath(segs: NonEmptyList[String]) extends Path { + def segments = segs.toList + val isEmpty = false + val isRoot = false + def /(seg: String): Path = + copy(segs = segs.append(seg)) + def asString = segs.head match { + case "." => segments.map(percentEncode).mkString("/") + case ".." => segments.map(percentEncode).mkString("/") + case _ => "/" + segments.map(percentEncode).mkString("/") + } + } + + def unsafe(str: String): LenientUri = + parse(str).fold(sys.error, identity) + + def fromJava(u: URL): LenientUri = + unsafe(u.toExternalForm) + + def parse(str: String): Either[String, LenientUri] = { + def makePath(str: String): Path = str.trim match { + case "/" => RootPath + case "" => EmptyPath + case _ => + NonEmptyList.fromList(stripLeading(str, '/').split('/').toList.map(percentDecode)) match { + case Some(nl) => NonEmptyPath(nl) + case None => sys.error(s"Invalid url: $str") + } + } + + def makeNonEmpty(str: String): Option[String] = + Option(str).filter(_.nonEmpty) + def makeScheme(s: String): Option[NonEmptyList[String]] = + NonEmptyList.fromList(s.split(':').toList.filter(_.nonEmpty).map(_.toLowerCase)) + + def splitPathQF(pqf: String): (Path, Option[String], Option[String]) = + pqf.indexOf('?') match { + case -1 => + pqf.indexOf('#') match { + case -1 => + (makePath(pqf), None, None) + case n => + (makePath(pqf.substring(0, n)), None, makeNonEmpty(pqf.substring(n + 1))) + } + case n => + pqf.indexOf('#', n) match { + case -1 => + (makePath(pqf.substring(0, n)), makeNonEmpty(pqf.substring(n + 1)), None) + case k => + ( + makePath(pqf.substring(0, n)), + makeNonEmpty(pqf.substring(n + 1, k)), + makeNonEmpty(pqf.substring(k + 1)) + ) + } + } + + str.split("//", 2) match { + case Array(p0, p1) => + // scheme:scheme:authority/path + val scheme = makeScheme(p0) + val (auth, pathQF) = p1.indexOf('/') match { + case -1 => (Some(p1), "") + case n => (Some(p1.substring(0, n)), p1.substring(n)) + } + val (path, query, frag) = splitPathQF(pathQF) + scheme match { + case None => + Left(s"No scheme found: $str") + case Some(nl) => + Right(LenientUri(nl, auth, path, query, frag)) + } + case Array(p0) => + // scheme:scheme:path + p0.lastIndexOf(':') match { + case -1 => + Left(s"No scheme found: $str") + case n => + val scheme = makeScheme(p0.substring(0, n)) + val (path, query, frag) = splitPathQF(p0.substring(n + 1)) + scheme match { + case None => + Left(s"No scheme found: $str") + case Some(nl) => + Right(LenientUri(nl, None, path, query, frag)) + } + } + } + } + + private[this] val delims: Set[Char] = ",/?:@&$# %".toSet + + private def percent(s: String): String = + "%" + ByteVector.encodeUtf8(s).fold(throw _, identity).toHex + + def percentEncode(s: String): String = + s.flatMap(c => if (delims.contains(c)) percent(c.toString) else c.toString) + + def percentDecode(s: String): String = + if (!s.contains("%")) s + else + s.foldLeft(("", ByteVector.empty)) { + case ((acc, res), c) => + if (acc.length == 2) ("", res ++ ByteVector.fromValidHex(acc.drop(1) + c)) + else if (acc.startsWith("%")) (acc :+ c, res) + else if (c == '%') ("%", res) + else (acc, res :+ c.toByte) + } + ._2 + .decodeUtf8 + .fold(throw _, identity) + + private def stripLeading(s: String, c: Char): String = + if (s.length > 0 && s.charAt(0) == c) s.substring(1) + else s + + implicit val encodeLenientUri: Encoder[LenientUri] = + Encoder.encodeString.contramap(_.asString) + + implicit val decodeLenientUri: Decoder[LenientUri] = + Decoder.decodeString.emap(LenientUri.parse) +} diff --git a/modules/common/src/main/scala/sharry/common/Password.scala b/modules/common/src/main/scala/sharry/common/Password.scala new file mode 100644 index 00000000..cd4e45ec --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/Password.scala @@ -0,0 +1,29 @@ +package sharry.common + +import io.circe.{Decoder, Encoder} + +final class Password(val pass: String) extends AnyVal { + + def isEmpty: Boolean = pass.isEmpty + + def nonEmpty: Boolean = !isEmpty + + override def toString: String = + if (pass.isEmpty) "" else "***" + +} + +object Password { + + val empty = Password("") + + def apply(pass: String): Password = + new Password(pass) + + implicit val passwordEncoder: Encoder[Password] = + Encoder.encodeString.contramap(_.pass) + + implicit val passwordDecoder: Decoder[Password] = + Decoder.decodeString.map(Password(_)) + +} diff --git a/modules/common/src/main/scala/sharry/common/SignupMode.scala b/modules/common/src/main/scala/sharry/common/SignupMode.scala new file mode 100644 index 00000000..4482a13f --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/SignupMode.scala @@ -0,0 +1,35 @@ +package sharry.common + +import io.circe._ + +sealed trait SignupMode { self: Product => + final def name: String = + productPrefix.toLowerCase +} +object SignupMode { + + case object Open extends SignupMode + + case object Invite extends SignupMode + + case object Closed extends SignupMode + + def fromString(str: String): Either[String, SignupMode] = + str.toLowerCase match { + case "open" => Right(Open) + case "invite" => Right(Invite) + case "closed" => Right(Closed) + case _ => Left(s"Invalid signup mode: $str") + } + def unsafe(str: String): SignupMode = + fromString(str).fold(sys.error, identity) + + def open: SignupMode = Open + def invite: SignupMode = Invite + def closed: SignupMode = Closed + + implicit val jsonEncoder: Encoder[SignupMode] = + Encoder.encodeString.contramap(_.name) + implicit val jsonDecoder: Decoder[SignupMode] = + Decoder.decodeString.emap(fromString) +} diff --git a/modules/common/src/main/scala/sharry/common/ThreadFactories.scala b/modules/common/src/main/scala/sharry/common/ThreadFactories.scala new file mode 100644 index 00000000..b2231bfe --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/ThreadFactories.scala @@ -0,0 +1,20 @@ +package sharry.common + +import java.util.concurrent.atomic.AtomicLong +import java.util.concurrent.{Executors, ThreadFactory} + +object ThreadFactories { + + def ofName(prefix: String): ThreadFactory = + new ThreadFactory { + + val counter = new AtomicLong(0) + + override def newThread(r: Runnable): Thread = { + val t = Executors.defaultThreadFactory().newThread(r) + t.setName(s"$prefix-${counter.getAndIncrement()}") + t + } + } + +} diff --git a/modules/common/src/main/scala/sharry/common/Timestamp.scala b/modules/common/src/main/scala/sharry/common/Timestamp.scala new file mode 100644 index 00000000..e77468c2 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/Timestamp.scala @@ -0,0 +1,48 @@ +package sharry.common + +import java.time.{Instant, LocalDate, ZoneId} + +import cats.effect.Sync +import io.circe.{Decoder, Encoder} + +case class Timestamp(value: Instant) { + + def toMillis: Long = value.toEpochMilli + + def toSeconds: Long = value.toEpochMilli / 1000L + + def minus(d: Duration): Timestamp = + Timestamp(value.minusNanos(d.nanos)) + + def plus(d: Duration): Timestamp = + Timestamp(value.plusNanos(d.nanos)) + + def minusHours(n: Long): Timestamp = + Timestamp(value.minusSeconds(n * 60 * 60)) + + def isBefore(other: Timestamp): Boolean = + value.isBefore(other.value) + + def isAfter(other: Timestamp): Boolean = + value.isAfter(other.value) + + def toDate: LocalDate = + value.atZone(ZoneId.of("UTC")).toLocalDate + + def asString: String = value.toString +} + +object Timestamp { + + val Epoch = Timestamp(Instant.EPOCH) + + def current[F[_]: Sync]: F[Timestamp] = + Sync[F].delay(Timestamp(Instant.now)) + + implicit val encodeTimestamp: Encoder[Timestamp] = + BaseJsonCodecs.encodeInstantEpoch.contramap(_.value) + + implicit val decodeTimestamp: Decoder[Timestamp] = + BaseJsonCodecs.decodeInstantEpoch.map(Timestamp(_)) + +} diff --git a/modules/common/src/main/scala/sharry/common/base64.scala b/modules/common/src/main/scala/sharry/common/base64.scala deleted file mode 100644 index 7f5cf080..00000000 --- a/modules/common/src/main/scala/sharry/common/base64.scala +++ /dev/null @@ -1,23 +0,0 @@ -package sharry.common - -import java.util.Base64 -import scodec.bits.ByteVector - -/** Wrapper around java8 base64 */ -object base64 { - - final class Codec(enc: Base64.Encoder, dec: Base64.Decoder) { - def decode(s: String): ByteVector = ByteVector.view(dec.decode(s)) - def decode(b: ByteVector): ByteVector = ByteVector.view(dec.decode(b.toByteBuffer)) - def decode(b: Array[Byte]): Array[Byte] = dec.decode(b) - - def encodeToString(b: ByteVector): String = enc.encodeToString(b.toArray) - def encode(b: ByteVector): ByteVector = ByteVector.view(enc.encode(b.toByteBuffer)) - def encodeToString(b: Array[Byte]): String = enc.encodeToString(b) - def encode(b: Array[Byte]): Array[Byte] = enc.encode(b) - } - - val basic = new Codec(Base64.getEncoder, Base64.getDecoder) - val mime = new Codec(Base64.getMimeEncoder, Base64.getMimeDecoder) - val url = new Codec(Base64.getUrlEncoder, Base64.getUrlDecoder) -} diff --git a/modules/common/src/main/scala/sharry/common/data/Account.scala b/modules/common/src/main/scala/sharry/common/data/Account.scala deleted file mode 100644 index e954d010..00000000 --- a/modules/common/src/main/scala/sharry/common/data/Account.scala +++ /dev/null @@ -1,94 +0,0 @@ -package sharry.common.data - -import cats.data.{Validated, ValidatedNel} -import cats.implicits._ -import io.circe._, io.circe.generic.semiauto._ - -case class Account( - login: String, - password: Option[String], - email: Option[String] = None, - enabled: Boolean = true, - admin: Boolean = false, - extern: Boolean = false) { - - Account.validateLogin(login) match { - case Validated.Invalid(err) => sys.error(err.toList.mkString(", ")) - case _ => - } - - def noPass = password.map(_ => copy(password = Some("***"))).getOrElse(this) -} - - -object Account { - - /** Validate a login string. Return a list of error messages or the - * login if it is correct. */ - def validateLogin(login: String): ValidatedNel[String, String] = { - def validate(b: => Boolean, err: String) = - if (b) Validated.valid(()) else Validated.invalidNel(err) - - val alpha = ('a' to 'z') ++ ('A' to 'Z') - val v1 = validate(login.nonEmpty, "login must not be empty") - val v2 = validate(login.nonEmpty && (alpha contains login(0)), "login must start with a letter") - val v3 = validate(login.matches("[a-zA-Z0-9_]+"), "login must be alphanumeric plus _") - (v1 |+| v2 |+| v3).map(_ => login) - } - - def validate(a: Account): ValidatedNel[String, Account] = { - // internal accounts need a password - val v1: ValidatedNel[String, Unit] = - if (a.extern || a.password.isDefined) Validated.valid(()) - else Validated.invalidNel("Internal accounts require a password") - - val v2: ValidatedNel[String, Unit] = validateLogin(a.login).map(_ => ()) - - (v1 |+| v2).map(_ => a) - } - - def tryApply( - login: String, - password: Option[String], - email: Option[String] = None, - enabled: Boolean = true, - admin: Boolean = false, - extern: Boolean = false): ValidatedNel[String, Account] = { - - validateLogin(login).map { _ => - Account(login, password, email, enabled, admin, extern) - } - } - - def newInternal(login: String, password: String) = - Account(login, Some(password), extern = false, enabled = true) - - def newExtern(login: String) = - Account(login, None, extern = true, enabled = true) - - object Internal { - def unapply(a: Account): Option[(String, Option[String])] = - if (a.extern) None - else Some((a.login, a.password)) - } - - object External { - def unapply(a: Account): Option[String] = - if (a.extern) Some(a.login) - else None - } - - private def nonEmpty(o: Option[String]): Option[String] = - o.map(_.trim).filter(_.nonEmpty) - - implicit val _accountDec: Decoder[Account] = { - val dec = Decoder.forProduct6("login", "password", "email", "enabled", "admin", "extern")(Account.tryApply) - dec.emap(_.toEither.leftMap(errs => errs.toList.mkString(", "))). - map(a => a.copy(password = nonEmpty(a.password), email = nonEmpty(a.email))) - } - - implicit val _accountEnc: Encoder[Account] = deriveEncoder[Account]. - contramap(a => a.copy(password = a.password.map(_ => "***"))) - - -} diff --git a/modules/common/src/main/scala/sharry/common/data/AliasUpdate.scala b/modules/common/src/main/scala/sharry/common/data/AliasUpdate.scala deleted file mode 100644 index 4343c425..00000000 --- a/modules/common/src/main/scala/sharry/common/data/AliasUpdate.scala +++ /dev/null @@ -1,10 +0,0 @@ -package sharry.common.data - -import io.circe._, io.circe.generic.semiauto._ - -case class AliasUpdate(id: String, login: String, name: String, validity: String, enable: Boolean) - -object AliasUpdate { - implicit val _jsonDecoder: Decoder[AliasUpdate] = deriveDecoder[AliasUpdate] - implicit val _jsonEncoder: Encoder[AliasUpdate] = deriveEncoder[AliasUpdate] -} diff --git a/modules/common/src/main/scala/sharry/common/data/ChunkInfo.scala b/modules/common/src/main/scala/sharry/common/data/ChunkInfo.scala deleted file mode 100644 index 694a700b..00000000 --- a/modules/common/src/main/scala/sharry/common/data/ChunkInfo.scala +++ /dev/null @@ -1,14 +0,0 @@ -package sharry.common.data - -/** Info provided by every chunk that is uploaded. The {{{token}}} is - * the upload id. */ -case class ChunkInfo( - token: String - , chunkNumber: Int - , chunkSize: Int - , currentChunkSize: Int - , totalSize: Long - , fileIdentifier: String - , filename: String - , totalChunks: Int -) diff --git a/modules/common/src/main/scala/sharry/common/data/FileMeta.scala b/modules/common/src/main/scala/sharry/common/data/FileMeta.scala deleted file mode 100644 index fe136a8d..00000000 --- a/modules/common/src/main/scala/sharry/common/data/FileMeta.scala +++ /dev/null @@ -1,32 +0,0 @@ -package sharry.common.data - -import java.time._ -import java.util.UUID -import io.circe._, io.circe.generic.semiauto._ -import sharry.common.JsonCodec -import sharry.common.mime._ -import sharry.common.sizes._ - -case class FileMeta( - id: String, - timestamp: Instant, - mimetype: MimeType, - length: Size, - checksum: String, - chunks: Int, - chunksize: Size -) { - - def incLength(n: Size) = copy(length = length + n) - def incChunks(n: Int) = copy(chunks = chunks + n) - def setMimeType(mt: MimeType) = copy(mimetype = mt.orElse(mimetype)) -} - -object FileMeta { - import JsonCodec._ - - def randomId: String = UUID.randomUUID().toString - - implicit val _fileMetaDec: Decoder[FileMeta] = deriveDecoder[FileMeta] - implicit val _fileMetaEnc: Encoder[FileMeta] = deriveEncoder[FileMeta] -} diff --git a/modules/common/src/main/scala/sharry/common/data/Pass.scala b/modules/common/src/main/scala/sharry/common/data/Pass.scala deleted file mode 100644 index 1adc877d..00000000 --- a/modules/common/src/main/scala/sharry/common/data/Pass.scala +++ /dev/null @@ -1,9 +0,0 @@ -package sharry.common.data - -import io.circe._, io.circe.generic.semiauto._ - -case class Pass(password: String) - -object Pass { - implicit val jsonDecoder: Decoder[Pass] = deriveDecoder[Pass] -} diff --git a/modules/common/src/main/scala/sharry/common/data/RemoteConfig.scala b/modules/common/src/main/scala/sharry/common/data/RemoteConfig.scala deleted file mode 100644 index 3f8f1ce3..00000000 --- a/modules/common/src/main/scala/sharry/common/data/RemoteConfig.scala +++ /dev/null @@ -1,28 +0,0 @@ -package sharry.common.data - -import io.circe._, io.circe.generic.semiauto._ - -case class RemoteConfig( - urls: Map[String, String] - , appName: String - , authEnabled: Boolean - , cookieAge: Long - , chunkSize: Long - , simultaneousUploads: Int - , maxFiles: Int - , maxFileSize: Long - , maxValidity: String - , projectName: String - , aliasHeaderName: String - , mailEnabled: Boolean - , highlightjsTheme: String - , welcomeMessage: String - , version: String -) - -object RemoteConfig { - val empty = RemoteConfig(Map.empty, "", false, 0, 0, 1, 0, 0, "PT1H", "", "", false, "", "", "") - - implicit val _remoteConfigEnc: Encoder[RemoteConfig] = deriveEncoder[RemoteConfig] - implicit val _remoteConfigDec: Decoder[RemoteConfig] = deriveDecoder[RemoteConfig] -} diff --git a/modules/common/src/main/scala/sharry/common/data/Upload.scala b/modules/common/src/main/scala/sharry/common/data/Upload.scala deleted file mode 100644 index a4b47d6e..00000000 --- a/modules/common/src/main/scala/sharry/common/data/Upload.scala +++ /dev/null @@ -1,111 +0,0 @@ -package sharry.common.data - -import java.time.Instant -import cats.data.{Validated, NonEmptyList => Nel} -import cats.implicits._ -import io.circe._, io.circe.generic.semiauto._ -import com.github.t3hnar.bcrypt._ - -import sharry.common.JsonCodec -import sharry.common.duration._ - -case class Upload ( - id: String - , login: String - , validity: Duration - , maxDownloads: Int - , alias: Option[String] = None - , description: Option[String] = None - , password: Option[String] = None - , created: Instant = Instant.now - , downloads: Int = 0 - , lastDownload: Option[Instant] = None - , publishId: Option[String] = None - , publishDate: Option[Instant] = None - , aliasName: Option[String] = None - , name: Option[String] = None -) { - - lazy val validUntil = publishDate.map(pd => pd.plus(validity.asJava)) - -} - -object Upload { - val empty = Upload("","",Duration.zero,0) - - def isValid(up: Upload, now: Instant, downloads: Int): Validated[Nel[String], Unit] = - up.publishDate match { - case Some(pd) => - val until = - if (pd.plus(up.validity.asJava).isAfter(now)) Validated.valid(()) - else Validated.invalid(Nel.of("The validity time has expired.")) - - val dls = - if (up.maxDownloads > downloads) Validated.valid(()) - else Validated.invalid(Nel.of("The maximum number of downloads is reached.")) - - List(until, dls).reduce(_ combine _) - - case None => - Validated.invalid(Nel.of("This is not a published upload")) - } - - def checkPassword(up: Upload, pw: Option[String]): Validated[String, Unit] = - (up.password, pw) match { - case (Some(db), Some(given)) => - if (given.isBcrypted(db)) Validated.valid(()) - else Validated.invalid("The password is not valid") - case (Some(_), _) => - Validated.invalid("Access requires a password.") - case _ => - Validated.valid(()) - } - - def checkUpload(up: Upload, now: Instant, downloads: Int, password: Option[String]): Validated[Nel[String], Unit] = - isValid(up, now, downloads).combine(checkPassword(up, password).toValidatedNel) - - implicit val _uploadDec: Decoder[Upload] = { - import JsonCodec._ - deriveDecoder[Upload] - } - - implicit val _uploadEnc: Encoder[Upload] = { - UploadWeb._uploadWebEnc.contramap(fromUpload _) - } - private def fromUpload(up: Upload): UploadWeb = - UploadWeb(up.id - , up.login - , up.alias - , up.aliasName - , up.validity - , up.maxDownloads - , up.password.isDefined - , Upload.isValid(up, Instant.now, up.downloads).swap.toOption.map(_.toList).getOrElse(Nil) - , up.description - , up.created - , up.downloads - , up.lastDownload - , up.publishId - , up.publishDate - , up.validUntil - , up.name - ) - -} - - -case class UploadFile( - uploadId: String - , fileId: String - , filename: String - , downloads: Int - , lastDownload: Option[Instant] - , clientFileId: String -) - -object UploadFile { - import JsonCodec._ - - implicit val _uploadFileDec: Decoder[UploadFile] = deriveDecoder[UploadFile] - implicit val _uploadFileEnc: Encoder[UploadFile] = deriveEncoder[UploadFile] -} diff --git a/modules/common/src/main/scala/sharry/common/data/UploadCreate.scala b/modules/common/src/main/scala/sharry/common/data/UploadCreate.scala deleted file mode 100644 index 85735097..00000000 --- a/modules/common/src/main/scala/sharry/common/data/UploadCreate.scala +++ /dev/null @@ -1,17 +0,0 @@ -package sharry.common.data - -import sharry.common.duration._ -import io.circe._, io.circe.generic.semiauto._ - -/** Used to create uploads */ -case class UploadCreate(id: String, description: String, validity: String, maxdownloads: Int, password: String) - -object UploadCreate { - def parseValidity(s: String): Either[String, Duration] = { - Duration.parse(s).toEither - } - - implicit val _uploadMetaDec: Decoder[UploadCreate] = deriveDecoder[UploadCreate] - implicit val _uploadMetaEnc: Encoder[UploadCreate] = deriveEncoder[UploadCreate] - -} diff --git a/modules/common/src/main/scala/sharry/common/data/UploadInfo.scala b/modules/common/src/main/scala/sharry/common/data/UploadInfo.scala deleted file mode 100644 index b84dd28b..00000000 --- a/modules/common/src/main/scala/sharry/common/data/UploadInfo.scala +++ /dev/null @@ -1,25 +0,0 @@ -package sharry.common.data - -import io.circe._, io.circe.generic.semiauto._ - -case class UploadInfo( - upload: Upload - , files: Seq[UploadInfo.File] -) - -object UploadInfo { - - case class File( - meta: FileMeta - , filename: String - , clientFileId: String - ) - - object File { - implicit val _uploadInfoFileDec: Decoder[UploadInfo.File] = deriveDecoder[UploadInfo.File] - implicit val _uploadInfoFileEnc: Encoder[UploadInfo.File] = deriveEncoder[UploadInfo.File] - } - - implicit val _uploadInfoDec: Decoder[UploadInfo] = deriveDecoder[UploadInfo] - implicit val _uploadInfoEnc: Encoder[UploadInfo] = deriveEncoder[UploadInfo] -} diff --git a/modules/common/src/main/scala/sharry/common/data/UploadUpdate.scala b/modules/common/src/main/scala/sharry/common/data/UploadUpdate.scala deleted file mode 100644 index 153990c7..00000000 --- a/modules/common/src/main/scala/sharry/common/data/UploadUpdate.scala +++ /dev/null @@ -1,11 +0,0 @@ -package sharry.common.data - -import io.circe._, io.circe.generic.semiauto._ - -case class UploadUpdate(name: String) - -object UploadUpdate { - implicit val _uploadUpdateDec: Decoder[UploadUpdate] = deriveDecoder[UploadUpdate] - implicit val _uploadUpdateEnc: Encoder[UploadUpdate] = deriveEncoder[UploadUpdate] - -} diff --git a/modules/common/src/main/scala/sharry/common/data/UploadWeb.scala b/modules/common/src/main/scala/sharry/common/data/UploadWeb.scala deleted file mode 100644 index a43e78e2..00000000 --- a/modules/common/src/main/scala/sharry/common/data/UploadWeb.scala +++ /dev/null @@ -1,35 +0,0 @@ -package sharry.common.data - -import java.time.Instant -import io.circe._, io.circe.generic.semiauto._ -import sharry.common.JsonCodec -import sharry.common.duration._ - -/** Used when retrieving an upload from the server */ -// TODO rename -case class UploadWeb( - id: String - , login: String - , alias: Option[String] - , aliasName: Option[String] - , validity: Duration - , maxDownloads: Int - , requiresPassword: Boolean - , validated: List[String] - , description: Option[String] = None - , created: Instant = Instant.now - , downloads: Int = 0 - , lastDownload: Option[Instant] = None - , publishId: Option[String] = None - , publishDate: Option[Instant] = None - , validUntil: Option[Instant] = None - , name: Option[String] = None -) - -object UploadWeb { - import JsonCodec._ - - implicit val _uploadWebDec: Decoder[UploadWeb] = deriveDecoder[UploadWeb] - implicit val _uploadWebEnc: Encoder[UploadWeb] = deriveEncoder[UploadWeb] - -} diff --git a/modules/common/src/main/scala/sharry/common/data/UserPass.scala b/modules/common/src/main/scala/sharry/common/data/UserPass.scala deleted file mode 100644 index a139b5b9..00000000 --- a/modules/common/src/main/scala/sharry/common/data/UserPass.scala +++ /dev/null @@ -1,11 +0,0 @@ -package sharry.common.data - -import io.circe._, io.circe.generic.semiauto._ - -/** Tuple used for authenticating */ -case class UserPass(login: String, pass: String) - -object UserPass { - implicit val _userPassDec: Decoder[UserPass] = deriveDecoder[UserPass] - implicit val _userPassEnc: Encoder[UserPass] = deriveEncoder[UserPass] -} diff --git a/modules/common/src/main/scala/sharry/common/duration.scala b/modules/common/src/main/scala/sharry/common/duration.scala deleted file mode 100644 index 7f6e0bd7..00000000 --- a/modules/common/src/main/scala/sharry/common/duration.scala +++ /dev/null @@ -1,361 +0,0 @@ -package sharry.common - -import java.time.{Duration => JDur} -import java.time.temporal.Temporal -import scala.concurrent.duration.{Duration => SDur, FiniteDuration, MILLISECONDS} -import cats.data.Validated -import cats.{Order, Monoid} -import cats.implicits._ - -/** Finite duration bit more convenient to use with this code base. It - * consolidates usages of {{{java.time.Duration}}} and the scala - * variant in {{{scala.concurrent}}}. - * - * Duration values can be parsed using different parsers and - * formatted using different formatters to human readable output or - * an exact representation. - * - * The default parser first tries the hh:mm[:ss] format, then a - * verbose one (like '1 days 15 minutes') and then using - * javas {{{Duration}}} class. - */ -object duration { - - case class Duration(millis: Long) { - - def +(other: Duration): Duration = - Duration(millis + other.millis) - - def *(factor: Double): Duration = - Duration((millis * factor).toLong) - - def *(factor: Int): Duration = - Duration((millis * factor).toLong) - - def *(factor: Long): Duration = - Duration((millis * factor).toLong) - - def -(other: Duration): Duration = - Duration(millis - other.millis) - - def isNegative: Boolean = millis < 0 - - def isPositive: Boolean = millis > 0 - - def isZero: Boolean = millis == 0 - - def >=(other: Duration): Boolean = millis >= other.millis - - def <=(other: Duration): Boolean = millis <= other.millis - - def asScala: FiniteDuration = FiniteDuration(millis, MILLISECONDS) - - def asJava: JDur = JDur.ofMillis(millis) - - def seconds: Long = millis / 1000 - - def minutes: Long = seconds / 60 - - def hours: Long = minutes / 60 - - def days: Long = hours / 24 - - def parts: List[Long] = { - val d = days - val h = (this - d.days).hours - val m = (this - d.days - h.hours).minutes - val s = (this - d.days - h.hours - m.minutes).seconds - val ms = (this - d.days - h.hours - m.minutes - s.seconds).millis - List(d,h,m,s,ms) - } - - def format(implicit fmt: DurationFormat): String = - fmt.format(this) - - def formatExact = format(DurationFormat.java) - - override def toString(): String = s"Duration($formatExact)" - } - - object Duration { - - val zero: Duration = Duration(0L) - - def between(ta: Temporal, tb: Temporal): Duration = - fromJava(JDur.between(ta,tb)) - - def parse(str: String)(implicit parser: DurationParser): Validated[String, Duration] = - parser.parse(str.trim) - - def fromJava(dur: JDur): Duration = Duration(dur.toMillis) - - def fromScala(dur: SDur): Duration = Duration(dur.toMillis) - - def unsafeParse(str: String): Duration = - parse(str) match { - case Validated.Valid(d) => d - case Validated.Invalid(msg) => throw new IllegalArgumentException(msg) - } - - implicit val monoid: Monoid[Duration] = new Monoid[Duration] { - val empty: Duration = Duration.zero - def combine(a: Duration, b: Duration) = - Duration(Monoid[Long].combine(a.millis, b.millis)) - } - - implicit val order: Order[Duration] = - Order.by(_.millis) - } - - trait DurationFormat { - def format(d: Duration): String - } - - object DurationFormat { - implicit val defaultFormat = wordy - - case object hhmmss extends DurationFormat { - def format(duration: Duration) = { - val List(d,hh,m,s,ms) = duration.parts - val h = hh + (d * 24) - if ((h+m+s) == 0) s"${duration.millis}ms" - else if (h > 0) "%d:%02d:%02d".format(h,m,s) - else "%02d:%02d".format(m,s) - } - } - - case object wordy extends DurationFormat { - def format(duration: Duration) = { - val List(d,h,m,s,ms) = duration.parts - def mk(n: Long, single: String, multiple: String): String = - n match { - case 0 => "" - case 1 => s"$n $single " - case _ => s"$n $multiple " - } - - val days = mk(d, "day", "days") - val hours = mk(h, "hour", "hours") - val mins = mk(m, "min", "min") - val secs = mk(s, "sec", "secs") - if ((d+h+m+s) == 0) s"${duration.millis}ms" - else (days + hours + mins + secs).trim - } - } - - case object java extends DurationFormat { - def format(duration: Duration) = - duration.asJava.toString - } - } - - trait DurationParser { self => - def parser: DurationParser.internal.P[Duration] - - def parse(s: String): Validated[String, Duration] = parser.parse(s.trim) - - def or(next: DurationParser): DurationParser = new DurationParser { - def parser = self.parser.or(next.parser) - } - } - object DurationParser { - import internal._ - - implicit val defaultParser: DurationParser = hhmmss.or(wordy).or(java) - - object hhmmss extends DurationParser { - val sign:P[Int] = P.literal("-").opt.map(_.map(_ => -1).getOrElse(1)) - val hhhh = (P.int ~ P.literal(":")).cut.map(_._1) - val mm = P.int. - mapV(n => Validated.valid(n).ensure("Minutes must be between 0 and 59")(n => n >= 0 && n <= 59)) - - val ss = (P.literal(":") ~ P.int. - mapV(n => Validated.valid(n).ensure("Seconds must be between 0 and 59")(n => n >= 0 && n <= 59))). - map(_._2). - opt - - val parser = (sign ~ hhhh ~ mm ~ ss ~ P.done).map { - case ((((sign, h), m),s),_) => s match { - case Some(n) => - (h.hours + m.minutes + n.seconds) * sign - case None => - (h.minutes + m.seconds) * sign - } - } - } - - object wordy extends DurationParser { - val toDay: P[Double => Duration] = P.literalsOr("days", "day", "d").map(_ => (n => n.days)) - val toHour: P[Double => Duration] = P.literalsOr("hours", "hour", "h").map(_ => (n => n.hours)) - val toMin: P[Double => Duration] = P.literalsOr("minutes", "minute", "min", "m").map(_ => (n => n.minutes)) - val toSec: P[Double => Duration] = P.literalsOr("seconds", "secs", "s").map(_ => (n => n.seconds)) - - val p0 = (P.number ~ P.ws ~ (P.oneOf("d","h","m","s").peek.cut) ~ (toDay or toHour or toMin or toSec)).map { - case (((n, _), _), f) => f(n) - } - - val parser = (P.repeat1(p0 ~ P.ws).map(_.map(_._1)) ~ P.done).map { - case (ds, _) => Monoid[Duration].combineAll(ds) - } - } - - object millis extends DurationParser { - val parser = P.int.map(_.millis) - } - - object java extends DurationParser { - val parser = P { in => - Validated.catchNonFatal(Duration.fromJava(JDur.parse(in.current))). - map(d => (in.moveToEnd, d)). - leftMap(ex => (in, ex.getMessage)) - } - } - - object internal { - case class Input(in: String, pos: Int = 0, cut: Int = 0) { - val current = in.substring(pos) - def next(p: Int) = copy(pos = pos + p) - def consumeWs: Input = current.takeWhile(Set(' ', '\t').contains).size match { - case 0 => this - case n => copy(pos = pos + n) - } - def moveToEnd: Input = copy(pos = in.length) - } - - trait P[A] extends (Input => Validated[(Input, String), (Input, A)]) { self => - - def map[B](f: A => B): P[B] = P { in => - self(in).map { case (nin, a) => - (nin, f(a)) - } - } - def mapV[B](f: A => Validated[String, B]): P[B] = P { in => - self(in).andThen { case (nin, a) => - f(a).map(b => (nin, b)).leftMap(s => (nin, s)) - } - } - - def ~[B](next: P[B]): P[(A,B)] = P { in => - self(in).andThen { case (nin,a) => - next(nin).map { case (nin2, b) => - (nin2, (a,b)) - } - } - } - - def opt: P[Option[A]] = P { in => - self(in). - map(t => (t._1, Some(t._2))). - fold(e => Validated.valid((e._1, None)), Validated.valid) - } - - def cut: P[A] = P { in => - self(in).map { case (nin, a) => - (nin.copy(cut = nin.pos), a) - } - } - - def or[B >: A](p: P[B]): P[B] = { in => - self(in) match { - case v@Validated.Valid(_) => v - case e@Validated.Invalid((nin, err)) => - if (nin.cut <= in.pos) p(in) - else e - } - } - - def peek: P[A] = P { in => - self(in).map({ case (nin, a) => (in, a) }) - } - - def parse(in: String): Validated[String, A] = - self(Input(in)). - map(_._2). - leftMap({ case (rest, err) => - s"Cannot read '$in' near position ${rest.pos}: $err" - }) - } - object P { - def apply[A](f: Input => Validated[(Input, String), (Input,A)]): P[A] = new P[A] { - def apply(in: Input) = f(in) - } - - def regex(reg: String): P[String] = P { in => - reg.r.findFirstMatchIn(in.current). - map(m => Validated.valid((in.next(m.end), m.group(0)))). - getOrElse(Validated.invalid((in, s"Expected matching $reg, but got: ${in.current}"))) - } - def literal(lit: String): P[String] = P { in => - if (in.current.startsWith(lit)) Validated.valid((in.next(lit.length), lit)) - else Validated.invalid((in, s"Expected '$lit', but got: ${in.current}")) - } - - def literalsOr(lit0: String, litN: String*): P[String] = - (lit0 +: litN).map(literal).reduce(_ or _) - - def oneOf(s0: String, s1: String, sN: String*): P[String] = { - val words = (s0 +: s1 +: sN).toSet - P { in => - words.find(in.current.startsWith). - map(w => Validated.valid((in.next(w.length), w))). - getOrElse(Validated.invalid((in, s"Expected one of: ${words.toList.sorted.mkString(", ")}, but got: ${in.current}"))) - } - } - - def number: P[Double] = - regex("^\\d+(\\.\\d+)?").mapV(s => Validated.catchNonFatal(s.toDouble).leftMap(_.getMessage)) - - def int: P[Int] = - regex("^\\d+").map(_.toInt) - - def ws: P[Unit] = P { in => - Validated.valid((in.consumeWs, ())) - } - - def done: P[Unit] = P { in => - if (in.current.isEmpty) Validated.valid((in, ())) - else Validated.invalid((in, s"Expected end of string, but got: ${in.current}")) - } - - def repeat1[A](p: P[A]): P[Seq[A]] = P { pin => - @annotation.tailrec - def go(in: Input, result: Vector[A]): Validated[(Input, String), (Input, Vector[A])] = { - if (in.current.isEmpty) - if (result.isEmpty) Validated.invalid((in, "Unexpected end of input")) - else Validated.valid(in -> result) - else p(in) match { - case Validated.Valid((next, a)) => - go(next, result :+ a) - case e@Validated.Invalid((next, err)) => - if (result.isEmpty) e - else Validated.valid(next -> result) - } - } - go(pin, Vector.empty) - } - } - } - } - - implicit class LongToDuration(val n: Long) extends AnyVal { - def millis = Duration(n) - def seconds = (n * 1000).millis - def minutes = (n * 60).seconds - def hours = (n * 60).minutes - def days = (n * 24).hours - } - implicit class IntToDuration(val n: Int) extends AnyVal { - def millis = Duration(n.toLong) - def seconds = (n.toLong * 1000).millis - def minutes = (n.toLong * 60).seconds - def hours = (n.toLong * 60).minutes - def days = (n.toLong * 24).hours - } - implicit class DoubleToDuration(val n: Double) extends AnyVal { - def millis = Duration(n.toLong) - def seconds = (n * 1000).millis - def minutes = (n * 60).seconds - def hours = (n * 60).minutes - def days = (n * 24).hours - } -} diff --git a/modules/common/src/main/scala/sharry/common/file.scala b/modules/common/src/main/scala/sharry/common/file.scala deleted file mode 100644 index ca276b17..00000000 --- a/modules/common/src/main/scala/sharry/common/file.scala +++ /dev/null @@ -1,65 +0,0 @@ -package sharry.common - -import java.nio.file.{Files, Path, Paths, StandardOpenOption} -import fs2.{io, Stream} -import cats.effect.IO -import scala.collection.JavaConverters._ -import _root_.io.circe.Encoder, _root_.io.circe.syntax._ - -import sizes._ - -object file { - - def apply(s: String): Path = - Paths.get(s) - - implicit class PathOps(path: Path) { - val absolute = path.normalize.toAbsolutePath - def name: String = path.getFileName.toString - def parent: Path = path.getParent - - def /(child: String): Path = absolute resolve child - - def exists: Boolean = Files.exists(path) - - def toExisting: Option[Path] = if (exists) Some(absolute) else None - - def isDirectory: Boolean = Files.isDirectory(path) - - def length: Long = Files.size(path) - - def list: Iterator[Path] = - Files.list(path).iterator.asScala - - def mkdirs(): IO[Path] = IO { - Files.createDirectories(path) - path - } - - def moveTo(target: Path): IO[Path] = IO { - val file = if (isDirectory) target/name else target - Files.move(path, file) - file - } - - def copyTo(target: Path): IO[Path] = IO { - val file = if (isDirectory) target/name else target - Files.copy(absolute, file) - file - } - - def delete: IO[Unit] = IO { - Files.delete(path) - } - - def readAll(chunkSize: Size): Stream[IO,Byte] = - io.file.readAll[IO](path, chunkSize.bytes) - - def write(str: String): Path = - Files.write(path, str.getBytes("UTF-8"), StandardOpenOption.CREATE_NEW) - - def write[A](value: A)(implicit enc: Encoder[A]): Path = - write(value.asJson.noSpaces) - } - -} diff --git a/modules/common/src/main/scala/sharry/common/mime.scala b/modules/common/src/main/scala/sharry/common/mime.scala deleted file mode 100644 index 699f6e9a..00000000 --- a/modules/common/src/main/scala/sharry/common/mime.scala +++ /dev/null @@ -1,73 +0,0 @@ -package sharry.common - -import javax.activation.{MimeType => JMimeType} -import scala.collection.JavaConverters._ -import scala.util.Try -import io.circe._ - -/** Utility around `javax.activation.MimeType'. */ -object mime { - - case class MimeType( - primary: String, - sub: String, - params: Map[String, String] = Map.empty) { - - def orElse(other: MimeType): MimeType = - if (this == MimeType.unknown) other else this - - def baseType = s"${primary}/${sub}" - - def param(name: String): Option[String] = - params.get(name.toLowerCase) - - def param(name: String, value: String): MimeType = - copy(params = params.updated(name, value)) - - def baseEqual(other: MimeType): Boolean = - baseType == other.baseType - - def asString = { - params.foldLeft(baseType) { case (s, (name, value)) => - s + s"; $name=$value" - } - } - } - - object MimeType { - val `application/octet-stream` = MimeType("application", "octet-stream") - val unknown = `application/octet-stream` - val `application/pdf` = MimeType("application", "pdf") - val `text/html` = MimeType("text", "html") - val `application/x-xz` = MimeType("application", "x-xz") - val `application/zip` = MimeType("application", "zip") - - def apply(primary: String, subtype: String): MimeType = - normalize(new JMimeType(primary, subtype).asScala) - - def parse(mt: String): Try[MimeType] = - Try(new JMimeType(mt)).map(_.asScala).map(normalize) - - def normalize(mt: MimeType): MimeType = - if (!mt.baseType.contains("unknown")) mt - else unknown - - implicit val _mimeTypeDec: Decoder[MimeType] = Decoder.decodeString.map(s => MimeType.parse(s).get) - implicit val _mimeTypeEnc: Encoder[MimeType] = Encoder.encodeString.contramap[MimeType](_.asString) - } - - object BaseType { - def unapply(mt: MimeType): Option[(String, String)] = - Some(mt.primary -> mt.sub) - } - - implicit class MimeTypeOps(mt: JMimeType) { - def asScala: MimeType = { - val paramNames = mt.getParameters.getNames.asScala.map(_.toString) - val params = paramNames.foldLeft(Map.empty[String, String]) { - (map, name) => map.updated(name.toLowerCase, mt.getParameter(name)) - } - MimeType(mt.getPrimaryType, mt.getSubType, params) - } - } -} diff --git a/modules/common/src/main/scala/sharry/common/pureconfig/Implicits.scala b/modules/common/src/main/scala/sharry/common/pureconfig/Implicits.scala new file mode 100644 index 00000000..0f333684 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/pureconfig/Implicits.scala @@ -0,0 +1,37 @@ +package sharry.common.pureconfig + +import sharry.common._ +import _root_.pureconfig._ +import _root_.pureconfig.error.{CannotConvert, FailureReason} +import scodec.bits.ByteVector + +import scala.reflect.ClassTag + +object Implicits { + implicit val lenientUriReader: ConfigReader[LenientUri] = + ConfigReader[String].emap(reason(LenientUri.parse)) + + implicit val durationReader: ConfigReader[Duration] = + ConfigReader[scala.concurrent.duration.Duration].map(sd => Duration(sd)) + + implicit val passwordReader: ConfigReader[Password] = + ConfigReader[String].map(Password(_)) + + implicit val identReader: ConfigReader[Ident] = + ConfigReader[String].emap(reason(Ident.fromString)) + + implicit val byteVectorReader: ConfigReader[ByteVector] = + ConfigReader[String].emap(reason(str => { + if (str.startsWith("hex:")) ByteVector.fromHex(str.drop(4)).toRight("Invalid hex value.") + else if (str.startsWith("b64:")) + ByteVector.fromBase64(str.drop(4)).toRight("Invalid Base64 string.") + else ByteVector.fromHex(str).toRight("Invalid hex value.") + })) + + implicit val byteSizeReader: ConfigReader[ByteSize] = + ConfigReader[String].emap(reason(ByteSize.parse)) + + def reason[A: ClassTag](f: String => Either[String, A]): String => Either[FailureReason, A] = + in => + f(in).left.map(str => CannotConvert(in, implicitly[ClassTag[A]].runtimeClass.toString, str)) +} diff --git a/modules/common/src/main/scala/sharry/common/rng.scala b/modules/common/src/main/scala/sharry/common/rng.scala deleted file mode 100644 index 34442036..00000000 --- a/modules/common/src/main/scala/sharry/common/rng.scala +++ /dev/null @@ -1,77 +0,0 @@ -package sharry.common - -import java.security.SecureRandom -import cats._ -import cats.data.State -import cats.implicits._ -import scodec.bits.ByteVector - -/** Taken from the book “Functional Programming In Scala”, chapter - * 5. The rng is a LCG as described here: - * https://en.wikipedia.org/wiki/Linear_congruential_generator and - * the values are taken from GCC (as stated at the wikipedia page).*/ -object rng { - - trait Rng { - def nextLong: (Rng, Long) - } - - object Rng { - private val secureRandom = new SecureRandom() - def apply(seed: Long = secureRandom.nextLong): Rng = new Rng { - def nextLong: (Rng, Long) = { - val newSeed = (seed * 1103515245L + 12345) % Int.MaxValue - val nextRng = apply(newSeed) - (nextRng, newSeed) - } - } - } - - type Gen[A] = State[Rng, A] - - object Gen { - def apply[A](f: Rng => (Rng, A)): Gen[A] = State(f) - def apply(): Gen[Long] = Gen(_.nextLong) - - def unit[A](a: A): Gen[A] = apply(rng => (rng, a)) - - def int = apply().map(_.##) - - def positiveInt: Gen[Int] = - int.map(i => if (i < 0) -(i + 1) else i) - - def bool: Gen[Boolean] = int.map(_ % 2 == 0) - - def boundedInt(min: Int, max: Int): Gen[Int] = - positiveInt.map(n => n % (max - min) + min) - - def chars(alphabet: IndexedSeq[Char], min: Int, max: Int): Gen[List[Char]] = - for { - len <- boundedInt(min, max) - ints <- Traverse[List].sequence(List.fill(len)(boundedInt(0, alphabet.length))) - } yield ints.map(alphabet) - - def string(alphabet: IndexedSeq[Char], min: Int, max: Int): Gen[String] = - chars(alphabet, min, max).map(_.mkString) - - def alphaNum(min: Int, max: Int): Gen[String] = - string(('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9'), min, max) - - def ident(min: Int, max: Int): Gen[String] = { - require(min > 1, "idents must be >1 chars") - val chars = ('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9') ++ "_-" - for { - first <- alphaNum(1,2) - rest <- string(chars, min-1, max-1) - } yield first + rest - } - - def bytes(len: Int): Gen[ByteVector] = - string("1234567890abcdef", len * 2, len * 2 + 1).map(s => ByteVector.fromValidHex(s)) - - } - - implicit class GenOps[A](val gen: Gen[A]) extends AnyVal { - def generate(rng: Rng = Rng()): A = gen.runA(rng).value - } -} diff --git a/modules/common/src/main/scala/sharry/common/sha.scala b/modules/common/src/main/scala/sharry/common/sha.scala deleted file mode 100644 index 3c2dc07b..00000000 --- a/modules/common/src/main/scala/sharry/common/sha.scala +++ /dev/null @@ -1,57 +0,0 @@ -package sharry.common - -import java.nio.file.Path -import java.nio.charset.StandardCharsets -import java.security.MessageDigest -import scodec.bits.ByteVector -import fs2.Pipe -import cats.effect.IO - -import file._ -import sizes._ - -object sha { - private def create: MessageDigest = - MessageDigest.getInstance("SHA-256") - - private def hex(bytes: Array[Byte]): String = - ByteVector.view(bytes).toHex - - def apply(s: String): String = { - val digest = create - digest.update(s.getBytes(StandardCharsets.UTF_8)) - hex(digest.digest()) - } - - def apply(path: Path): IO[String] = - path.readAll(64.kbytes) - .through(makeShaArray) - .compile.toVector - .map(_.head) - - def apply(bytes: ByteVector): String = { - val digest = create - digest.update(bytes.toArray) - hex(digest.digest()) - } - - def makeShaBV[F[_]]: Pipe[F, ByteVector, String] = - _.fold(sha.newBuilder)(_ update _).map(_.get) - - def makeShaArray[F[_]]: Pipe[F, Byte, String] = - _.chunks.fold(sha.newBuilder)(_ update _.toArray).map(_.get) - - def newBuilder = new ShaBuilder - final class ShaBuilder { - private val digest = create - def update(data: ByteVector): ShaBuilder = - update(data.toArray) - - def update(data: Array[Byte]): ShaBuilder = { - digest.update(data) - this - } - - def get: String = hex(digest.digest()) - } -} diff --git a/modules/common/src/main/scala/sharry/common/sign.scala b/modules/common/src/main/scala/sharry/common/sign.scala deleted file mode 100644 index 0016848b..00000000 --- a/modules/common/src/main/scala/sharry/common/sign.scala +++ /dev/null @@ -1,26 +0,0 @@ -package sharry.common - -import javax.crypto.Mac -import javax.crypto.spec.SecretKeySpec -import scodec.bits.ByteVector - -object sign { - - private def createNew = Mac.getInstance("HMACSHA256") - - def sign(key: Array[Byte], data: String): ByteVector = { - val mac = createNew - val seckey = new SecretKeySpec(key, mac.getAlgorithm) - mac.init(seckey) - mac.update(data.getBytes) - val sig = mac.doFinal - ByteVector.view(sig) - } - - def sign(key: ByteVector, data: String): ByteVector = - sign(key.toArray, data) - - def sign(key: String, data: String): ByteVector = - sign(key.getBytes("UTF-8"), data) - -} diff --git a/modules/common/src/main/scala/sharry/common/sizes.scala b/modules/common/src/main/scala/sharry/common/sizes.scala deleted file mode 100644 index 126dcdd5..00000000 --- a/modules/common/src/main/scala/sharry/common/sizes.scala +++ /dev/null @@ -1,86 +0,0 @@ -package sharry.common - -import io.circe._ - -object sizes { - - sealed abstract class Size { - def toBytes: Long - def bytes: Int = toBytes.toInt - def asString: String - - def + (other: Size): Size = - Bytes(toBytes + other.toBytes) - - def > (other: Size): Boolean = - toBytes > other.toBytes - - def >= (other: Size): Boolean = - toBytes >= other.toBytes - - def < (other: Size): Boolean = - toBytes < other.toBytes - - def <= (other: Size): Boolean = - toBytes <= other.toBytes - - def notZero: Boolean = this > Size.zero - - override def equals(o: Any): Boolean = - o match { - case sz: Size => Size.equals(this, sz) - case _ => false - } - } - - object Size { - val zero: Size = Bytes(0L) - - def equals(s1: Size, s2: Size): Boolean = - s1.toBytes == s2.toBytes - - implicit val _sizeDec: Decoder[Size] = Decoder.decodeLong.map(b => Bytes(b)) - implicit val _sizeEnc: Encoder[Size] = Encoder.encodeLong.contramap[Size](_.toBytes) - - private[sizes] def format(d: Double) = "%.2f".formatLocal(java.util.Locale.ROOT, d) - } - - case class Bytes(value: Long) extends Size { - def toBytes = value - def asString = - if (value < 1024) s"${value}B" - else KBytes(value / 1024.0).asString - } - - case class KBytes(value: Double) extends Size { - def toBytes = (value * 1024).toLong - def asString = - if (value < 1024) s"${Size.format(value)}K" - else MBytes(value / 1024.0).asString - } - - case class MBytes(value: Double) extends Size { - def toBytes = (value * 1024 * 1024).toLong - def asString = - if (value < 1024) s"${Size.format(value)}M" - else GBytes(value / 1024.0).asString - } - - case class GBytes(value: Double) extends Size { - def toBytes = (value * 1024 * 1024 * 1024).toLong - def asString = s"${Size.format(value)}G" - } - - implicit final class IntSizeOps(val n: Int) extends AnyVal { - def gbytes: Size = GBytes(n.toDouble) - def mbytes: Size = MBytes(n.toDouble) - def kbytes: Size = KBytes(n.toDouble) - def bytes: Size = Bytes(n.toLong) - } - implicit final class LongSizeOps(val n: Long) extends AnyVal { - def gbytes: Size = GBytes(n.toDouble) - def mbytes: Size = MBytes(n.toDouble) - def kbytes: Size = KBytes(n.toDouble) - def bytes: Size = Bytes(n) - } -} diff --git a/modules/common/src/main/scala/sharry/common/streams.scala b/modules/common/src/main/scala/sharry/common/streams.scala deleted file mode 100644 index 41c988d8..00000000 --- a/modules/common/src/main/scala/sharry/common/streams.scala +++ /dev/null @@ -1,63 +0,0 @@ -package sharry.common - -import java.io.InputStream -import scodec.bits.ByteVector -import fs2.{io, Chunk, Pipe, Stream} -import cats.effect.IO -import cats.effect.Sync -import org.log4s._ - -import sizes._ - -/** Some utility for fs2.Stream */ -object streams { - - def toByteChunks[F[_]]: Pipe[F, Byte, ByteVector] = - _.chunks.map(c => ByteVector.view(c.toArray)) - - /** Reads all bytes into a single ByteVector */ - def append[F[_]]: Pipe[F, Byte, ByteVector] = - _.through(toByteChunks).fold(ByteVector.empty)(_ ++ _) - - def unchunk[F[_]]: Pipe[F, ByteVector, Byte] = - _.flatMap(bv => Stream.chunk(Chunk.bytes(bv.toArray))) - - def readIs[F[_]](is: F[InputStream], size: Size)(implicit F: Sync[F]): Stream[F, Byte] = - io.readInputStream(is, size.bytes, true) //.rechunk(size.bytes, true) - - def noWeirdChars[F[_]]: Pipe[F, Byte, Byte] = { - val valid: Byte => Boolean = - b => b > 31 || b < 0 || b == 13 || b == 10 || b == 9 - _.filter(valid) - } - - def optionToEmpty[F[_], I]: Pipe[F, Option[I], I] = - _.flatMap { - case Some(i) => Stream.emit(i) - case None => Stream.empty - } - - def ifEmpty[F[_],A](s: Stream[F,A]): Pipe[F,A,A] = in => { - val sn = in.noneTerminate - sn.head.flatMap { - case Some(a) => Stream.emit(a) ++ sn.tail.unNoneTerminate - case None => s - } - } - - def log[F[_], A](f: Logger => Unit)(implicit l: Logger, F: Sync[F]): Pipe[F, A, A] = - s => s ++ slog(f) - - def logEach[F[_], A](f: (A, Logger) => Unit)(implicit l: Logger, F: Sync[F]): Pipe[F,A,A] = - _.flatMap(a => slog(f.curried(a)) ++ Stream.emit(a)) - - def logEmpty[F[_], A](f: Logger => Unit)(implicit l: Logger, F: Sync[F]): Pipe[F,A,A] = - ifEmpty(slog(f)) - - def slog[F[_]](f: Logger => Unit)(implicit l: Logger, F: Sync[F]): Stream[F, Nothing] = { - Stream.eval(F.delay{ f(l) }).drain - } - - def slogT(f: Logger => Unit)(implicit l: Logger): Stream[IO, Nothing] = - slog[IO](f) -} diff --git a/modules/common/src/main/scala/sharry/common/syntax/LoggerSyntax.scala b/modules/common/src/main/scala/sharry/common/syntax/LoggerSyntax.scala new file mode 100644 index 00000000..f29d5eeb --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/syntax/LoggerSyntax.scala @@ -0,0 +1,35 @@ +package sharry.common.syntax + +import cats.effect.Sync +import fs2.Stream +import org.log4s.Logger + +trait LoggerSyntax { + + implicit final class LoggerOps(logger: Logger) { + + def ftrace[F[_]: Sync](msg: => String): F[Unit] = + Sync[F].delay(logger.trace(msg)) + + def fdebug[F[_]: Sync](msg: => String): F[Unit] = + Sync[F].delay(logger.debug(msg)) + + def sdebug[F[_]: Sync](msg: => String): Stream[F, Nothing] = + Stream.eval(fdebug(msg)).drain + + def finfo[F[_]: Sync](msg: => String): F[Unit] = + Sync[F].delay(logger.info(msg)) + + def sinfo[F[_]: Sync](msg: => String): Stream[F, Nothing] = + Stream.eval(finfo(msg)).drain + + def fwarn[F[_]: Sync](msg: => String): F[Unit] = + Sync[F].delay(logger.warn(msg)) + + def ferror[F[_]: Sync](msg: => String): F[Unit] = + Sync[F].delay(logger.error(msg)) + + def ferror[F[_]: Sync](ex: Throwable)(msg: => String): F[Unit] = + Sync[F].delay(logger.error(ex)(msg)) + } +} diff --git a/modules/common/src/main/scala/sharry/common/syntax/StreamSyntax.scala b/modules/common/src/main/scala/sharry/common/syntax/StreamSyntax.scala new file mode 100644 index 00000000..6ecbb966 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/syntax/StreamSyntax.scala @@ -0,0 +1,30 @@ +package sharry.common.syntax + +import cats.effect.Sync +import fs2.Stream +import cats.implicits._ +import io.circe._ +import io.circe.parser._ + +trait StreamSyntax { + + implicit class StringStreamOps[F[_]](s: Stream[F, String]) { + + def parseJsonAs[A](implicit d: Decoder[A], F: Sync[F]): F[Either[Throwable, A]] = + s.fold("")(_ + _) + .compile + .last + .map( + optStr => + for { + str <- optStr + .map(_.trim) + .toRight(new Exception("Empty string cannot be parsed into a value")) + json <- parse(str).leftMap(_.underlying) + value <- json.as[A] + } yield value + ) + + } + +} diff --git a/modules/common/src/main/scala/sharry/common/syntax/StringSyntax.scala b/modules/common/src/main/scala/sharry/common/syntax/StringSyntax.scala new file mode 100644 index 00000000..955adec3 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/syntax/StringSyntax.scala @@ -0,0 +1,21 @@ +package sharry.common.syntax + +import cats.implicits._ +import io.circe.Decoder +import io.circe.parser._ + +trait StringSyntax { + + implicit final class EvenMoreStringOps(s: String) { + + def asNonBlank: Option[String] = + Option(s).filter(_.trim.nonEmpty) + + def parseJsonAs[A](implicit d: Decoder[A]): Either[Throwable, A] = + for { + json <- parse(s).leftMap(_.underlying) + value <- json.as[A] + } yield value + } + +} diff --git a/modules/common/src/main/scala/sharry/common/syntax/all.scala b/modules/common/src/main/scala/sharry/common/syntax/all.scala new file mode 100644 index 00000000..93cb12e1 --- /dev/null +++ b/modules/common/src/main/scala/sharry/common/syntax/all.scala @@ -0,0 +1,3 @@ +package sharry.common.syntax + +object all extends StringSyntax with LoggerSyntax with StreamSyntax diff --git a/modules/common/src/main/scala/sharry/common/version.scala b/modules/common/src/main/scala/sharry/common/version.scala deleted file mode 100644 index 3612119d..00000000 --- a/modules/common/src/main/scala/sharry/common/version.scala +++ /dev/null @@ -1,17 +0,0 @@ -package sharry.common - -object version { - def longVersion: String = { - val v = - BuildInfo.version + - BuildInfo.gitDescribedVersion.map(c => s" ($c)").getOrElse("") - - if (BuildInfo.gitUncommittedChanges) v + " [dirty workingdir]" else v - } - - def shortVersion = BuildInfo.version - - def projectString: String = { - s"Sharry ${longVersion}" - } -} diff --git a/modules/common/src/main/scala/sharry/common/zip.scala b/modules/common/src/main/scala/sharry/common/zip.scala deleted file mode 100644 index be289db8..00000000 --- a/modules/common/src/main/scala/sharry/common/zip.scala +++ /dev/null @@ -1,113 +0,0 @@ -package sharry.common - -import java.io.OutputStream -import java.nio.file.{Files, Path} -import java.util.zip.ZipEntry -import java.util.zip.ZipOutputStream -import scala.concurrent.ExecutionContext - -import fs2.{async, io, Chunk, Pipe, Sink, Stream, Segment} -import scala.concurrent.SyncVar -import cats.effect.{Effect, IO} - -object zip { - - /** This implemenation is from @wedens and @pchlupacek - * https://gitter.im/functional-streams-for-scala/fs2?at=592affb6c4d73f445af10e45 - * http://lpaste.net/9043000581702025216 - */ - def zip[F[_]](chunkSize: Int)(implicit F: Effect[F], EC: ExecutionContext): Pipe[F, (String, Stream[F,Byte]), Byte] = entries => - Stream.eval(fs2.async.synchronousQueue[F, Option[Chunk[Byte]]]).flatMap { q => - def writeEntry(zos: ZipOutputStream): Sink[F, (String, Stream[F, Byte])] = - _.flatMap { - case (name, data) => - val mkEntry = Stream.eval(F.delay { - val ze = new ZipEntry(name) - zos.putNextEntry(ze) - }) - val writeData = data.to( - io.writeOutputStream( - F.delay(zos), - closeAfterUse = false)) - val closeEntry = Stream.eval(F.delay(zos.closeEntry())) - - mkEntry ++ writeData ++ closeEntry - } - - Stream.suspend { - val os = new OutputStream { - private def enqueueChunkSync(a: Option[Chunk[Byte]]) = { - val done = new SyncVar[Either[Throwable, Unit]] - //F.unsafeRunAsync(q.enqueue1(a))(done.put) - async.unsafeRunAsync(q.enqueue1(a))(e => IO(done.put(e))) - done.get.fold(throw _, identity) - } - - @annotation.tailrec - private def addChunk(c: Chunk[Byte]): Unit = { - val free = chunkSize - chunk.size - if (c.size > free) { - enqueueChunkSync(Some((Segment.chunk(chunk) ++ Segment.chunk(c.take(free))).force.toChunk)) - chunk = Chunk.empty - addChunk(c.drop(free)) - } else { - chunk = (Segment.chunk(chunk) ++ Segment.chunk(c)).force.toChunk - } - } - - - private var chunk: Chunk[Byte] = Chunk.empty - - override def close(): Unit = { - enqueueChunkSync(Some(chunk)) - chunk = Chunk.empty - enqueueChunkSync(None) - } - - override def write(bytes: Array[Byte]): Unit = - addChunk(Chunk.bytes(bytes)) - override def write(bytes: Array[Byte], off: Int, len: Int): Unit = - addChunk(Chunk.bytes(bytes, off, len)) - override def write(b: Int): Unit = - addChunk(Chunk.singleton(b.toByte)) - } - - val zos = new ZipOutputStream(os) - val write = entries.to(writeEntry(zos)) - .onFinalize(F.delay(zos.close())) - - q.dequeue - .unNoneTerminate - .flatMap(Stream.chunk(_)) - .concurrently(write) - } - } - - - def zip[F[_]](entries: Stream[F, (String, Stream[F, Byte])], chunkSize: Int)(implicit F: Effect[F], EC: ExecutionContext): Stream[F, Byte] = { - entries.through(zip(chunkSize)) - } - - - def dirEntries[F[_]](dir: Path, include: Path => Boolean = _ => true)(implicit F: Effect[F]): Stream[F, Path] = - Stream.bracket(F.delay(Files.newDirectoryStream(dir)))( - dirs => Stream.unfold(dirs.iterator) { - iter => if (iter.hasNext) Some((iter.next, iter)) else None - }, - dirs => F.delay(dirs.close)). - filter(include) - - def dirEntriesRecursive[F[_]](dir: Path, include: Path => Boolean = _ => true)(implicit F: Effect[F],EC: ExecutionContext): Stream[F, Path] = - dirEntries[F](dir).flatMap { p => - val r = if (include(p)) Stream.emit(p) else Stream.empty - if (Files.isDirectory(p)) r ++ dirEntriesRecursive(p, include) - else r - } - - - def zipDir[F[_]](dir: Path, chunkSize: Int, include: Path => Boolean = _ => true)(implicit F: Effect[F], EC: ExecutionContext): Stream[F, Byte] = { - val entries = dirEntriesRecursive(dir, e => !Files.isDirectory(e) && include(e)) - zip(entries. - map(e => dir.relativize(e).toString -> io.file.readAll(e, chunkSize)), chunkSize) - } -} diff --git a/modules/common/src/test/resources/logback-test.xml b/modules/common/src/test/resources/logback-test.xml deleted file mode 100644 index e26c57f8..00000000 --- a/modules/common/src/test/resources/logback-test.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %level [%thread] %logger [%file:%line] %msg%n - - - - - - - - - diff --git a/modules/common/src/test/scala/sharry/common/DurationSpec.scala b/modules/common/src/test/scala/sharry/common/DurationSpec.scala deleted file mode 100644 index 4b3c0a8f..00000000 --- a/modules/common/src/test/scala/sharry/common/DurationSpec.scala +++ /dev/null @@ -1,91 +0,0 @@ -package sharry.common - -import org.scalatest._ -import cats.data.Validated -import cats.data.Validated.{invalid, valid} - -import sharry.common.duration._ -import sharry.common.duration.{DurationParser => parser} - -class DurationSpec extends FlatSpec with Matchers { - - "Duration" should "create values" in { - 1.hours.minutes should be (60) - 2.hours.minutes should be (120) - 1.hours.days should be (0) - 1.hours.seconds should be (3600) - 1.days.hours should be (24) - 2.days.hours should be (48) - 10.days.hours should be (240) - 100.days.hours should be (2400) - 200.days.hours should be (4800) - 500.days.minutes should be (720000) - - 1.5.days.hours should be (36) - 200.5.days.hours should be (4812) - 0.days should be (0.minutes) - 0.seconds should be (0.minutes) - 0.hours should be (Duration.zero) - - (-2).minutes.seconds should be (-120) - } - - it should "calculate" in { - 96.minutes * 2 should be (192.minutes) - 10.minutes + 5.minutes should be (15.minutes) - 5.minutes - 10.minutes should be (-5.minutes) - -4.hours.isNegative should be (true) - } - - it should "parse hh:mm:ss format" in { - parser.hhmmss.parse("1:36:00") should be (valid(96.minutes)) - parser.hhmmss.parse("1:10") should be (valid(1.minutes + 10.seconds)) - parser.hhmmss.parse("1:10:10") should be (valid(1.hours + 10.minutes + 10.seconds)) - parser.hhmmss.parse("1:1:1") should be (valid(1.hours + 1.minutes + 1.seconds)) - parser.hhmmss.parse("100:1") should be (valid(100.minutes + 1.seconds)) - parser.hhmmss.parse("2:1") should be (valid(2.minutes + 1.seconds)) - parser.hhmmss.parse("-2:1") should be (valid((2.minutes + 1.seconds) * -1)) - - parser.hhmmss.parse("1:100:1") should be (invalid("Cannot read '1:100:1' near position 5: Minutes must be between 0 and 59")) - parser.hhmmss.parse("1:1x:2") should be (invalid("Cannot read '1:1x:2' near position 3: Expected end of string, but got: x:2")) - parser.hhmmss.parse("1:1x") should be (invalid("Cannot read '1:1x' near position 3: Expected end of string, but got: x")) - parser.hhmmss.parse(":10") should be (invalid("Cannot read ':10' near position 0: Expected matching ^\\d+, but got: :10")) - } - - it should "parse the verbose format" in { - parser.wordy.parse("12 days 20hours 14min 10secs") should be (valid(12.days + 20.hours + 14.minutes + 10.seconds)) - parser.wordy.parse("20hours 14min 12 days 10secs") should be (valid(12.days + 20.hours + 14.minutes + 10.seconds)) - parser.wordy.parse("1 day 20hours") should be (valid(1.days + 20.hours)) - parser.wordy.parse(454841.seconds.format(DurationFormat.wordy)) should be (valid(454841.seconds)) - - parser.wordy.parse("1x days") should be (invalid("Cannot read '1x days' near position 1: Expected one of: d, h, m, s, but got: x days")) - parser.wordy.parse("3days HAHAHA 6day 1d") should be (Validated.invalid("Cannot read '3days HAHAHA 6day 1d' near position 6: Expected end of string, but got: HAHAHA 6day 1d")) - parser.wordy.parse("3days 6day 1d") should be (Validated.valid(10.days)) - } - - it should "not backtrack parsing on some inputs" in { - Duration.parse("1:mx") should be (invalid("Cannot read '1:mx' near position 2: Expected matching ^\\d+, but got: mx")) - Duration.parse("1 day X") should be (invalid("Cannot read '1 day X' near position 6: Expected end of string, but got: X")) - } - - it should "format a duration to hh:mm[:ss]" in { - 96.minutes.format(DurationFormat.hhmmss) should be ("1:36:00") - 150.millis.format(DurationFormat.hhmmss) should be ("150ms") - 1.seconds.format(DurationFormat.hhmmss) should be ("00:01") - 63.seconds.format(DurationFormat.hhmmss) should be ("01:03") - 150.millis.formatExact should be ("PT0.15S") - (42.days + 10.minutes).format(DurationFormat.hhmmss) should be ("1008:10:00") - } - - it should "format a duration to wordy format" in { - 96.minutes.format(DurationFormat.wordy) should be ("1 hour 36 min") - DurationFormat.wordy.format(96.minutes) should be ("1 hour 36 min") - - 454841.seconds.format(DurationFormat.wordy) should be ("5 days 6 hours 20 min 41 secs") - 433241.seconds.format(DurationFormat.wordy) should be ("5 days 20 min 41 secs") - 12.seconds.format(DurationFormat.wordy) should be ("12 secs") - - (42.days + 10.minutes).format(DurationFormat.wordy) should be ("42 days 10 min") - 120.millis.format(DurationFormat.wordy) should be ("120ms") - } -} diff --git a/modules/common/src/test/scala/sharry/common/ZipSpec.scala b/modules/common/src/test/scala/sharry/common/ZipSpec.scala deleted file mode 100644 index 3ea85199..00000000 --- a/modules/common/src/test/scala/sharry/common/ZipSpec.scala +++ /dev/null @@ -1,41 +0,0 @@ -package sharry.common - -import java.io.ByteArrayInputStream -import java.util.zip.ZipInputStream -import org.scalatest._ -import fs2.{io, Stream} -import cats.effect.IO -import scala.concurrent.ExecutionContext.Implicits.global - -import sharry.common.rng._ - -class ZipSpec extends FlatSpec with Matchers { - - "zip" should "add entries with data" in { - - val data = Stream.emits[(String, Stream[IO,Byte])](Seq( - ("file1.txt", Stream.emit(Gen.bytes(100).generate()).through(streams.unchunk)), - ("file2.txt", Stream.emit(Gen.bytes(100).generate()).through(streams.unchunk)) - )) - - val zipped = data. - covary[IO]. - through(zip.zip(8192)). - compile.toVector. - unsafeRunSync - - val zin = new ZipInputStream(new ByteArrayInputStream(zipped.toArray)) - val e0 = zin.getNextEntry - e0.getName should be ("file1.txt") - val bytes0 = io.readInputStream[IO](IO(zin), 500, false).compile.toVector.unsafeRunSync - bytes0 should be (data.toList.head._2.compile.toVector.unsafeRunSync) - - val e1 = zin.getNextEntry - e1.getName should be ("file2.txt") - val bytes1 = io.readInputStream[IO](IO(zin), 500, false).compile.toVector.unsafeRunSync - bytes1 should be (data.toList.apply(1)._2.compile.toVector.unsafeRunSync) - - zin.getNextEntry should be (null) - zin.close - } -} diff --git a/modules/docs/src/main/scala/sharry/docs/md/ManualContext.scala b/modules/docs/src/main/scala/sharry/docs/md/ManualContext.scala deleted file mode 100644 index 6eecbb98..00000000 --- a/modules/docs/src/main/scala/sharry/docs/md/ManualContext.scala +++ /dev/null @@ -1,16 +0,0 @@ -package sharry.docs.md - -import yamusca.imports._ -import yamusca.implicits._ - -case class ManualContext( - versionLong: String - , versionShort: String - , `default-configuration`: String - , `default-cli-config`: String - , `cli-help`: String) - -object ManualContext { - implicit val valueConverter: ValueConverter[ManualContext] = - ValueConverter.deriveConverter[ManualContext] -} diff --git a/modules/docs/src/main/scala/sharry/docs/md/ManualPage.scala b/modules/docs/src/main/scala/sharry/docs/md/ManualPage.scala deleted file mode 100644 index 742c33a1..00000000 --- a/modules/docs/src/main/scala/sharry/docs/md/ManualPage.scala +++ /dev/null @@ -1,53 +0,0 @@ -package sharry.docs.md - -import java.net.URL -import fs2.{io, text, Stream} -import cats.effect.IO -import scodec.bits.ByteVector -import yamusca.imports._ -import yamusca.converter.syntax._ -import sharry.mdutil.{Document, Link} - -case class ManualPage( - name: String - , checksum: String - , mimetype: String - , size: Long - , url: URL) { - - - def readAll(chunkSize: Int): Stream[IO, Byte] = - io.readInputStream(IO(url.openStream), chunkSize) - - def read(ctx: ManualContext, pathPrefix: String, linkPrefix: String): Stream[IO, ByteVector] = { - if (name.endsWith(".md")) { - readAll(16384). - through(text.utf8Decode). - fold1(_ + _). - map(mustache.parse). - map(_.left.map(err => new Exception(s"${err._2} at ${err._1.pos}"))). - rethrow. - map(ctx.render). - map(replaceLinks(pathPrefix, linkPrefix)). - through(text.utf8Encode). - segmentN(16384, true). - map(seg => ByteVector.view(seg.force.toArray)) - } else { - readAll(16384). - chunks.map(c => ByteVector.view(c.toArray)) - } - } - - private def replaceLinks(pathPrefix: String, mdLinkPrefix: String)(content: String): String = { - if (mdLinkPrefix == "") content - else { - val doc = Document.parse(content). - mapLinks(link => { - val pre = if (link.path.endsWith(".md")) mdLinkPrefix else pathPrefix - if (toc.names.contains(link.path)) Link(pre + link.path) - else link - }) - doc.renderMd - } - } -} diff --git a/modules/docs/src/main/scala/sharry/docs/md/TocAccess.scala b/modules/docs/src/main/scala/sharry/docs/md/TocAccess.scala deleted file mode 100644 index 647e48f9..00000000 --- a/modules/docs/src/main/scala/sharry/docs/md/TocAccess.scala +++ /dev/null @@ -1,17 +0,0 @@ -package sharry.docs.md - -trait TocAccess { - - // the abstract method is implemented by an sbt generated object `toc.scala` - def contents: List[(String, String, String, Long)] - - lazy val names = contents.map(_._1) - - def find(path: String): Option[ManualPage] = - contents.find(_._1 == path). - flatMap { - case (path, chs, mime, size) => - Option(getClass.getResource(path)). - map(url => ManualPage(path, chs, mime, size, url)) - } -} diff --git a/modules/docs/src/main/scala/sharry/docs/route.scala b/modules/docs/src/main/scala/sharry/docs/route.scala deleted file mode 100644 index 9ef955f6..00000000 --- a/modules/docs/src/main/scala/sharry/docs/route.scala +++ /dev/null @@ -1,75 +0,0 @@ -package sharry.docs - -import fs2.Stream -import cats.effect.IO -import shapeless.{::, HNil} -import scodec.bits.{ByteVector, BitVector} -import spinoco.fs2.http.HttpResponse -import spinoco.fs2.http.body._ -import spinoco.fs2.http.routing._ -import spinoco.protocol.mime._ -import spinoco.protocol.http.{HttpStatusCode, HttpResponseHeader} -import spinoco.protocol.http.header._ -import spinoco.protocol.http.header.value._ - -import md.ManualContext - -object route { - - def ifNoneMatch: Matcher[IO, Option[String]] = - header[`If-None-Match`].? map { - case Some(`If-None-Match`(EntityTagRange.Range(List(EntityTag(tag, false))))) => Some(tag) - case _ => None - } - - def restPath: Matcher[IO, String] = - path.map(p => p.segments.mkString("/")) - - def linkPrefix: Matcher[IO, String] = - param[String]("mdLinkPrefix").?.map { - case Some(p) => p - case None => "" - } - - def manual(prefix: Matcher[IO, String], ctx: ManualContext): Route[IO] = - Get >> ifNoneMatch :: prefix :/: restPath :: linkPrefix map { - case noneMatch :: otherPrefix :: p :: mdPrefix :: HNil => - md.toc.find(p) match { - case Some(mf) => - val tag = mf.checksum + mdPrefix - if (Some(tag) == noneMatch) Stream.emit(emptyResponse[IO](NotModified)).covary[IO] - else Stream.emit(emptyResponse(Ok). - withHeader(ETag(EntityTag(tag, false))). - withStreamBody(mf.read(ctx, otherPrefix+"/", mdPrefix))(encoder(mf.mimetype))) - - case None => - Stream.emit(emptyResponse[IO](NotFound)).covary[IO] - } - } - - - private val Ok = HttpStatusCode.Ok - private val NotFound = HttpStatusCode.NotFound - private val NotModified = HttpStatusCode.NotModified - - private def emptyResponse[F[_]](status: HttpStatusCode): HttpResponse[F] = - HttpResponse( - HttpResponseHeader( - status = status, - reason = "", - headers = Nil), - Stream.empty - ) - - private def encoder(mt: String): StreamBodyEncoder[IO, ByteVector] = - StreamBodyEncoder.byteVectorEncoder.withContentType(asContentType(mt)) - - private def asContentType(mt: String): ContentType = { - val ct = ContentType.codec.decodeValue(BitVector(mt.getBytes)).require - ct match { - case ContentType.TextContent(mt, None) => ContentType.TextContent(mt, Some(MIMECharset.`UTF-8`)) - case _ => ct - } - } - -} diff --git a/modules/mdutil/src/main/scala/sharry/mdutil/Document.scala b/modules/mdutil/src/main/scala/sharry/mdutil/Document.scala deleted file mode 100644 index 742ab9b8..00000000 --- a/modules/mdutil/src/main/scala/sharry/mdutil/Document.scala +++ /dev/null @@ -1,60 +0,0 @@ -package sharry.mdutil - -import com.vladsch.flexmark.ast.{Document => MDocument} -import com.vladsch.flexmark.html.HtmlRenderer; -import com.vladsch.flexmark.parser.Parser; -import com.vladsch.flexmark.util.options.MutableDataSet -import com.vladsch.flexmark.formatter.internal.Formatter -import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughExtension -import com.vladsch.flexmark.ext.gfm.tables.TablesExtension - -import scala.collection.JavaConverters._ - -/** A markdown document. Only exposing the little features needed in sharry. */ -trait Document { - - def renderHtml: String - - def renderMd: String - - def mapLinks(f: Link => Link): Document -} - -object Document { - - def parse(md: String): Document = - new DocumentImpl(parser.parse(md)) - - - private[mdutil] val formatter = { - val opts = new MutableDataSet() - Formatter.builder(opts).build - } - - private[mdutil] val parser = { - val opts = new MutableDataSet() - opts.set(Parser.EXTENSIONS, List(StrikethroughExtension.create, TablesExtension.create).asJava) - Parser.builder(opts).build - } - - private[mdutil] val htmlRenderer = { - val opts = new MutableDataSet() - HtmlRenderer.builder(opts).build - } - - private class DocumentImpl(delegate: MDocument) extends Document { - def copy: MDocument = parser.parse(delegate.getChars) - - def renderHtml: String = - htmlRenderer.render(delegate) - - def renderMd: String = - Document.formatter.render(delegate) - - def mapLinks(f: Link => Link): Document = { - val d = copy - LinkProcessor(f).processDocument(d) - new DocumentImpl(d) - } - } -} diff --git a/modules/mdutil/src/main/scala/sharry/mdutil/Link.scala b/modules/mdutil/src/main/scala/sharry/mdutil/Link.scala deleted file mode 100644 index 8a83b0a8..00000000 --- a/modules/mdutil/src/main/scala/sharry/mdutil/Link.scala +++ /dev/null @@ -1,3 +0,0 @@ -package sharry.mdutil - -case class Link(path: String) diff --git a/modules/mdutil/src/main/scala/sharry/mdutil/LinkProcessor.scala b/modules/mdutil/src/main/scala/sharry/mdutil/LinkProcessor.scala deleted file mode 100644 index 3376be3f..00000000 --- a/modules/mdutil/src/main/scala/sharry/mdutil/LinkProcessor.scala +++ /dev/null @@ -1,70 +0,0 @@ -package sharry.mdutil - -import com.vladsch.flexmark.ast._ -import com.vladsch.flexmark.ast.{Document => MDocument, Link => MLink} -import com.vladsch.flexmark.util.sequence._ -import org.jsoup.nodes.{Document => JsoupDocument} -import scala.collection.JavaConverters._ - -private[mdutil] class LinkProcessor(f: Link => Link) { self => - - private val visitor = new NodeVisitor( - visitHandler[Image](self.process), - visitHandler[MLink](self.process), - visitHandler[Reference](self.process), - visitHandler[HtmlBlock](self.processHtmlBlock), - visitHandler[HtmlInline](self.processHtmlInline) - ) - - def processDocument(doc: MDocument): Unit = - visitor.visit(doc) - - // note, this is copied from this example: - // https://github.com/vsch/flexmark-java/blob/7b140d97c04e359ec8dfa4c2160241b810596437/flexmark-java-samples/src/com/vladsch/flexmark/samples/FormatterWithMods.java - private def process(n: LinkNodeBase): Unit = { - val org = Link(n.getPageRef.normalizeEOL) - val next = f(org) - if (next != org) { - n.setUrlChars(PrefixedSubSequence.of(next.path, n.getPageRef.subSequence(0,0))) - n.setChars(SegmentedSequence.of(n.getSegmentsForChars().toList.asJava, n.getChars)) - } - } - - private def processHtmlInline(html: HtmlInline): Unit = { - val doc = org.jsoup.Jsoup.parse(html.getChars.normalizeEOL) - val changed = changeAttr(doc, "src") | changeAttr(doc, "href") - if (changed) { - val tag = doc.body.child(0) - val cnt = tag.outerHtml() - // must cut off the closing tag inserted by jsoup - html.setChars(chars(cnt.dropRight(tag.nodeName.length + 3))) - } - } - - private def processHtmlBlock(html: HtmlBlock): Unit = { - val doc = org.jsoup.Jsoup.parse(html.getSpanningChars.normalizeEOL) - val changed = changeAttr(doc, "src") | changeAttr(doc, "href") - if (changed) { - html.setChars(chars(doc.body.html + "\n")) - } - } - - private def changeAttr(html: JsoupDocument, attr: String): Boolean = { - html.select(s"[$attr]").asScala. - foldLeft(false) { (flag, el) => - val org = Link(el.attr(attr)) - val next = f(org) - if (next != org) { - el.attr(attr, next.path) - true - } else flag - } - } -} - -private[mdutil] object LinkProcessor { - - def apply(f: Link => Link): LinkProcessor = - new LinkProcessor(f) - -} diff --git a/modules/mdutil/src/main/scala/sharry/mdutil/package.scala b/modules/mdutil/src/main/scala/sharry/mdutil/package.scala deleted file mode 100644 index 7a81be8a..00000000 --- a/modules/mdutil/src/main/scala/sharry/mdutil/package.scala +++ /dev/null @@ -1,19 +0,0 @@ -package sharry - -import com.vladsch.flexmark.util.sequence._ -import com.vladsch.flexmark.ast._ -import scala.reflect._ - -package object mdutil { - - private[mdutil] def chars(s: String): BasedSequence = - CharSubSequence.of(s) - - - private[mdutil] def visitHandler[T <: Node : ClassTag](f: T => Unit): VisitHandler[T] = { - val c = classTag[T].runtimeClass.asInstanceOf[Class[T]] - new VisitHandler[T](c, new Visitor[T] { - override def visit(node: T): Unit = f(node) - }) - } -} diff --git a/modules/mdutil/src/test/scala/sharry/mdutil/DocumentSpec.scala b/modules/mdutil/src/test/scala/sharry/mdutil/DocumentSpec.scala deleted file mode 100644 index 454c23a5..00000000 --- a/modules/mdutil/src/test/scala/sharry/mdutil/DocumentSpec.scala +++ /dev/null @@ -1,77 +0,0 @@ -package sharry.mdutil - -import org.scalatest._ - -class DocumentSpec extends FlatSpec with Matchers { - - "renderMd" should "return initial md text" in { - val md = "# title1\n\nA paragraph with [link](./text.txt)." - Document.parse(md).renderMd.trim should be (md) - } - - "renderHtml" should "return html" in { - val md = "# title1\n\nA paragraph with [link](./text.txt)." - Document.parse(md).renderHtml should be ("

title1

\n

A paragraph with link.

\n") - } - - "mapLinks" should "rewrite markdown links" in { - val test = """|# title1 - |this is an inline [link](./local.txt).""".stripMargin - - val doc = Document.parse(test).mapLinks(_ => Link("http://google.com")) - doc.renderMd should be ( - """|# title1 - | - |this is an inline [link](http://google.com). - |""".stripMargin - ) - } - - it should "not change on identity" in { - val test = """|# title 1 - | - |- [git](http://git-scm.org) - | - |text - |""".stripMargin - - val doc = Document.parse(test).mapLinks(identity _) - doc.renderMd should be (test) - } - - it should "create a new document" in { - val test = """|# title1 - | - |this is an inline [link](./local.txt). - |""".stripMargin - - val doc1 = Document.parse(test) - val doc2 = doc1.mapLinks(_ => Link("bla")) - doc1.renderMd should be (test) - doc2.renderMd should be (test.replace("./local.txt", "bla")) - } - - it should "rewrite html links" in { - val testMd = """# title1 - | - |and some text with bla
    aha
- | - |and images & - | - | - | - |end.""".stripMargin - val doc = Document.parse(testMd).mapLinks(l => Link("http://google.com")) - // indentation is not preserved, which is ok - doc.renderMd should be ( """# title1 - | - |and some text with bla
    aha
- | - |and images & - | - | - | - |end. - |""".stripMargin) - } -} diff --git a/modules/microsite/docs/doc/configure.md b/modules/microsite/docs/doc/configure.md new file mode 100644 index 00000000..c7c2a664 --- /dev/null +++ b/modules/microsite/docs/doc/configure.md @@ -0,0 +1,407 @@ +--- +layout: docs +title: Configuring +permalink: doc/configure +--- + +# {{ page.title }} + +Sharry's executable can take one argument – a configuration file. If +that is not given, the defaults are used. The config file overrides +default values, so only values that differ from the defaults are +necessary to specify. + + +## File Format + +The format of the configuration files can be +[HOCON](https://github.com/lightbend/config/blob/master/HOCON.md#hocon-human-optimized-config-object-notation), +JSON or whatever the used [config +library](https://github.com/lightbend/config) understands. The default +values below are in HOCON format, which is recommended, since it +allows comments and has some [advanced +features](https://github.com/lightbend/config/blob/master/README.md#features-of-hocon). Please +refer to their documentation for more on this. + + +## Important Config Options + +The configuration for the REST server is below `sharry.restserver`. + +### JDBC + +This configures the connection to the database. By default, a H2 +database in the current `/tmp` directory is configured. This will +create the database on demand in this directory. + +The config looks like this: + +``` +sharry.restserver.backend.jdbc { + url = ... + user = ... + password = ... +} +``` + +The `url` is the connection to the database. It must start with +`jdbc`, followed by name of the database. The rest is specific to the +database used: it is either a path to a file for H2 or a host/database +url for MariaDB and PostgreSQL. + +When using H2, the user is `sa`, the password can be empty and the url +must include these options: + +``` +;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE +``` + +#### Examples + +PostgreSQL: +``` +url = "jdbc:postgresql://localhost:5432/sharrydb" +``` + +MariaDB: +``` +url = "jdbc:mariadb://localhost:3306/sharrydb" +``` + +H2 +``` +url = "jdbc:h2:///path/to/a/file.db;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE" +``` + +### Bind + +The host and port the http server binds to. + +``` +sharry.restsserver.bind { + address = localhost + port = 9090 +} +``` + +By default, it binds to `localhost` and some predefined port. + +### baseurl + +The base url is an important setting that defines the http URL where +sharry can be reached. The REST server uses this url to create +absolute urls and to configure the authenication cookie. These URLs +are sent to the client, so they must resolve back to the sharry +server. If you see "network error" error messages in the browser, then +this setting is probably not correct. + +By default it is build using the information from the `bind` setting. + + +``` +sharry.restserver.baseurl = ... +``` + +#### Examples + +``` +sharry.restserver.baseurl = "https://sharry.example.com" +``` + + +### registration options + +This defines if and how new users can create accounts. There are 3 +options: + +- *closed* no new user can sign up +- *open* new users can sign up +- *invite* new users can sign up but require an invitation key + + +``` +sharry.restserver.signup { + mode = "open" + + # If mode == 'invite', a password must be provided to generate + # invitation keys. It must not be empty. + new-invite-password = "" + + # If mode == 'invite', this is the period an invitation token is + # considered valid. + invite-time = "3 days" +} +``` + +The mode `invite` is intended to open the application only to some +users. An admin user can create invitation keys and distribute them to +the desired people. While the user must be admin, it is also necessary +to provide the `new-invite-password`. The idea is that only the person +who installs sharry knows this. If it is not set (must be non-empty), +then invitation won't work. New invitation keys can be generated from +within the web application or via REST calls (using `curl`, for +example). + +``` +curl -X POST -H 'Sharry-Auth: {{apikey}}' -d '{"password":"blabla"}' "http://localhost:7880/api/v1/open/signup/newinvite" +``` + +## Authentication + +The initial authentication will generate an authentication token which +is valid for a some time. Subsequent calls to secured routes can use +this token. The token can be given as a normal http header or via a +cookie header. + +The following options configure this token: + +``` +sharry.restserver.auth { + server-secret = "hex:caffee" # or "b64:Y2FmZmVlCg==" + session-valid = "5 minutes" +} +``` + +The `server-secret` is used to sign the token. If multiple REST +servers are deployed, all must share the same server secret. Otherwise +tokens from one instance are not valid on another instance. The secret +can be given as Base64 encoded string or in hex form. Use the prefix +`hex:` and `b64:`, respectively. + +The `session-valid` deterimens how long a token is valid. This can be +just some minutes, the web application obtains new ones +periodically. So a short time is recommended. + + +### Login Modules + +Login modules are used to initially authenticate a user given some +credentials. There are some modules that take a username/password pair +and hand it to an external service or program for verification. If +valid, sharry creates an account transparently. Then there is the +`oauth` setting which supports authentication via OAuth using “OAuth +Code Flow”. + +All login modules can be enabled/disabled and have an `order` property +that defines the order the login modules are tried. The modules are +tried in the specified order until one gives a response. + +#### Fixed + +This is a simple login module for bootstrapping. It defines an admin +account using the supplied username and password (plain text) from the +config file. + +``` +fixed { + enabled = false + user = "admin" + password = "admin" + order = 10 +} +``` + +It is disabled by default. If the given username doesn't match the +configured username this login module is skipped and the next is +tried. + +#### Http + +The http login module issues a http request with the username/password +pair as payload. The response status code determines valid +authentication. + +``` +http { + enabled = false + url = "{% raw %}http://localhost:1234/auth?user={{user}}&password={{pass}}{% endraw %}" + method = "POST" + body = "" + content-type = "" + order = 20 +} +``` + +If the method is `POST`, the body is sent as specified using the given +content type. The body and url are processed before as mustache +templates, where `{% raw %}{{user}}{% endraw %}` and `{% raw +%}{{pass}}{% endraw %}` are replaced by their actual values. For other +requests than `POST`, the body is ignored. + + +#### Http Basic + +The http-basic login module issues a http request with an +`Authorization` header against some configured url. The header uses +the [Basic](https://en.wikipedia.org/wiki/Basic_access_authentication) +scheme to transport the username/password pair. + +``` +http-basic { + enabled = false + url = "http://somehost:2345/path" + method = "GET" + order = 30 +} +``` + +If the response is successful (in `2xx`), the user is authenticated. + + +#### Command + +Allows to validate a username/password pair using some external system +command. This is the most flexible approach. + +``` +command { + enabled = false + program = [ + "/path/to/someprogram" + "{% raw %}{{login}}{% endraw %}" + "{% raw %}{{pass}}{% endraw %}" + ] + # the return code to consider successful verification + success = 0 + order = 30 +} +``` + +The return code of the command is used to determine valid +authentication. The `program` value is an array where the first item +is the path to the program and subsequent elements define its +arguments. + +All arguments are processed as a mustache template and variables `{% +raw %}{{user}}{% endraw %}` and `{% raw %}{{pass}}{% endraw %}` are +replaced by their actual values. + + +#### Internal + +The internal login module simply authenticates against the sharry +database. If it is disabled, you should disable signup, too, because those +user won't be authenticated. + + +#### OAuth + +There is now an option to authenticate using a external provider +supporting the OAuth “code flow”. There are two examples in the config +file for Github and Google. I tried to generalise it as much as +possible, but (it seems to me) OAuth is not really a protocol, every +provider may choose to do it little differently. + +The `oauth` login module can be configured with multiple such +providers. Here is an example: + +``` +oauth = [ + { + enabled = false + id = "github" + name = "Github" + icon = "github" + authorize-url = "https://github.com/login/oauth/authorize" + token-url = "https://github.com/login/oauth/access_token" + user-url = "https://api.github.com/user" + user-id-key = "login" + client-id = "" + client-secret = "" + } +] +``` + +Each such entry in the array results in a button on the login screen. + + + +Here is how it roughly works: If a user clicks this button, it reaches +a specific url in sharry. Sharry will read the corresponding config +entry and redirect to the provider adding all the necessary details. +The user then authenticates at the provider, which redirects back to +sharry – so this method only works if sharry is publicly available, +obviously. Then sharry does one more request to turn the code from the +redirect into a different code. And then it tries to get the account +name. + +Let's go through the config values of one entry: + +- `enabled`: allows to disable this entry without removing it from the + file. +- `id`: the id that is used in the url behind the button on the login + screen. It is also used to amend the account name. +- `name`: The name rendered as button text. +- `icon`: a [semantic-ui icon + name](https://semantic-ui.com/elements/icon.html) for the button +- `authorize-url` this is the URL of the provider where sharry + redirects to at first, attaching `client_id` and the redirect uri + back to sharry. +- `token-url`: The url to the provdier where the response from the + `authorize-url` can be turned into a token. +- `user-url`: The url to the provider that retrieves the user + information given a token as obtained from `token-url`. +- `user-id-key`: Now it get's a bit hairy…. The protocol doesn't + define (afaik) a common way how to exchange user data. So google + does it different from github. Sharry supports JSON responses only + and uses the value of `user-id-key` to lookup a value in that + response structure. For example, the github response is a simple + JSON object, where the login name is at field `login`. The path must + evaluate to a string. This value is used for the new account inside + sharry. +- `client-id` and `client-secret` These are provider specific values + that you need to obtain there. With github, for example, you + register a new "app" which generates these values. + +Once sharry gets the account name, it creates a new account (if it not +exists already) using the account name from the provider amended with +`@`. + +I only tested this with github and google, I would appreciate any +information on how it works with other providers. + + +## Default Config + + +``` +{% include server.conf %} +``` + +## Logging + +By default, sharry logs to stdout. This works well, when managed by +systemd or other inits. Logging is done by +[logback](https://logback.qos.ch/). Please refer to its documentation +for how to configure logging. + +If you created your logback config file, it can be added as argument +to the executable using this syntax: + +``` +/path/to/sharry -Dlogback.configurationFile=/path/to/your/logging-config-file +``` + +To get started, the default config looks like this: + +``` xml + + + true + + + [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n + + + + + + + + +``` + +The `` means, that only log statements with level +"INFO" will be printed. But the `` above says, that for loggers with name "sharry" +statements from level "DEBUG" on will be printed, too. diff --git a/modules/microsite/docs/doc/dev.md b/modules/microsite/docs/doc/dev.md new file mode 100644 index 00000000..6d5aeb5d --- /dev/null +++ b/modules/microsite/docs/doc/dev.md @@ -0,0 +1,66 @@ +--- +layout: docs +title: Development +permalink: doc/dev +--- + +# {{ page.title }} + +## Building + +[Sbt](https://scala-sbt.org) is used to build the application. Clone +the sources and run: + +- `make` to compile all sources (Elm + Scala) +- `restserver/universal:packageBin` to create zip packages +- `restserver/debian:packageBin` to create debian packages + +The zip files can be found afterwards in: + +``` +modules/restserver/target/universal +``` + + +## Starting Servers with `reStart` + +When developing, it's very convenient to use the [revolver sbt +plugin](https://github.com/spray/sbt-revolver). Start the sbt console +and then run: + +``` +sbt:sharry-root> restserver/reStart +``` + +This starts a REST server. Prefixing the commads with `~`, results in +recompile+restart once a source file is modified. + +Note that with current sbt the revolver plugin will not restart the +server if elm files are changed. But this is not really necessary: +just run a second sbt shell with `~ compile` and sbt will *compile* +all elm files on change and the final js file is immediately +available. Only a browser refresh is necessary to load the new web +app. + +## Custom config file + +The sbt build is setup such that a file `local/dev.conf` (from the +root of the source tree) is picked up as config file, if it exists. So +you can create a custom config file for development. For example, a +custom database for development may be setup this way: + +``` +#jdbcurl = "jdbc:h2:///home/dev/workspace/projects/sharry/local/sharry-demo.db;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE" +#jdbcurl = "jdbc:mariadb://localhost:3306/sharrydev" +jdbcurl = "jdbc:postgresql://localhost:5432/sharrydev" + +sharry.restserver { + backend { + jdbc { + url = ${jdbcurl} + user = "dev" + password = "dev" + } + } +} +``` diff --git a/modules/microsite/docs/doc/index.md b/modules/microsite/docs/doc/index.md new file mode 100644 index 00000000..4da20349 --- /dev/null +++ b/modules/microsite/docs/doc/index.md @@ -0,0 +1,68 @@ +--- +layout: docs +title: Documentation +--- + +# Sharry + +Sharry allows to share files with others in a simple way. It is a +self-hosted web application. The basic concept is: upload files and get +a url back that can then be shared. + + + +## How it works + +### Authenticated users → others + +Authenticated users can upload their files on a web site together with +an optional password and a time period. The time period defines how long +the file is available for download. Then a public URL is generated that +can be shared, e.g. via email, with everyone. + +While the download page is hard to guess, everyone who knows it can +access the files. + +### Others → Authenticated users + +Anonymous can send files to registered users. Each registered user can +maintain *alias pages*. An alias page is also behind a “hard-to-guess” +URL (just like the download page) and allows everyone to upload files +to the corresponding user. The user belonging to the alias can be +notified via email. + +## Features + +- *Both ways:* Receive and send files to/from anonymous users. +- *Integration:* Sharry aims to be easy to integrate in other + environments. + - Authentication: There are many ways to authenticate users from + different sources and/or use internal user management. + - [REST Api](rest) exposing all the features, making it available for + scripts. +- *Reliable up- and downloads* + - Uploads: While the server accepts standard multipart requests, it + also supports the [tus protocol](https://tus.io) allowing for + resumable uploads. In case network goes down in the middle of + uploading a large file, simply upload the same file again and it + will start where it left off. + - Downloads: Using ETag and [range + requests](https://en.wikipedia.org/wiki/Byte_serving) allows the + clients (the browser, mostly) to cache files and to download only + portions of files. This makes it possible to efficiently view + videos in the browser (being able to click into the timeline). +- *Web client* for managing and accessing shares. +- *Signup* Let all users create new accounts, only invited ones or none. +- *Restrict public download pages* using three properties: a lifetime, a + password (acting as a second secret) and download-limit. +- *Periodic cleanup* will remove expired shares +- *Send E-Mails* from within Sharry (if configured) +- *DBMS* Data is stored in a relational database, supporting + [PostgreSQL](https://postgresql.org), [MariaDB](https://mariadb.org) + and [H2](https://h2database.com) (not using a separate database + server). + +## License + +This project is distributed under the +[GPLv3+](https://spdx.org/licenses/GPL-3.0-or-later.html) diff --git a/modules/microsite/docs/doc/install.md b/modules/microsite/docs/doc/install.md new file mode 100644 index 00000000..93bca3d6 --- /dev/null +++ b/modules/microsite/docs/doc/install.md @@ -0,0 +1,150 @@ +--- +layout: docs +title: Installation +permalink: doc/install +--- + +# {{ page.title }} + +This page contains detailed installation instructions. For a quick +start, refer to [this page](quickstart). + +Sharry is a *REST Server* that also provides the web application. The +web application runs in the browser and talks to the server using the +[REST Api](rest). + +The [download page](https://github.com/eikek/sharry/releases) +provides pre-compiled packages and the [development page](dev.html) +contains build instructions. + + +## Prerequisites + +### Java + +Very often, Java is already installed. You can check this by opening a +terminal and typing `java -version`. Otherwise install Java using your +package manager or see [this site](https://adoptopenjdk.net/) for +other options. + +It is enough to install the JRE. The JDK is required, if you want to +build sharry from source. + +Sharry has been tested with Java version 1.8 (or sometimes referred +to as JRE 8 and JDK 8, respectively). The pre-build packages are also +build using JDK 8. But a later version of Java should work as well. + + +## Database + +Sharry stores all its information (files, accounts etc) in a database. +The following products are supported: + +- PostreSQL +- MariaDB +- H2 + +The H2 database is an interesting option for personal and mid-size +setups, as it requires no additional work (i.e. no separate db +server). It is integrated into sharry and works really well. It is +also configured as the default database. + +For large installations, PostgreSQL or MariaDB is recommended. Create +a database and a user with enough privileges (read, write, create +table) to that database. + +When using H2, make sure to add the options +`;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE` at the end of the url. See +the [default config](configure.html) for an example. + + +## Installing from ZIP files + +After extracting the zip files, you'll find a start script in the +`bin/` folder. + + +## Installing from DEB packages + +The DEB packages can be installed on Debian, or Debian based Distros: + +``` bash +$ sudo dpkg -i sharry*.deb +``` + +Then the start scripts are in your `$PATH`. Run `sharry-restserver` +from a terminal window. + +The packages come with a systemd unit file that will be installed to +autostart the services. + + +## Running + +Run the start script (in the corresponding `bin/` directory when using +the zip files): + +``` +$ ./sharry-restserver*/bin/sharry-restserver +``` + +This will startup using the default configuration. The configuration +should be adopted to your needs. For example, the database connection +is configured to use a H2 database that is created in the `/tmp` +directory. Please refer to the [configuration page](configure) +for how to create a custom config file. Once you have your config +file, simply pass it as argument to the command: + +``` +$ ./sharry-restserver*/bin/sharry-restserver /path/to/server-config.conf +``` + +After starting the rest server, you can reach the web application at +path `/app`, so using default values it would be +`http://localhost:9090/app`. + +You should be able to create a new account and sign in. + + +### Options + +The start scripts support some options to configure the JVM. One often +used setting is the maximum heap size of the JVM. By default, java +determines it based on properties of the current machine. You can +specify it by given java startup options to the command: + +``` +$ ./sharry-restserver*/bin/sharry-restserver -J-Xmx1G -- /path/to/server-config.conf +``` + +This would limit the maximum heap to 1GB. The double slash separates +internal options and the arguments to the program. Another frequently +used option is to change the default temp directory. Usually it is +`/tmp`, but it may be desired to have a dedicated temp directory, +which can be configured: + +``` +$ ./sharry-restserver*/bin/sharry-restserver -J-Xmx1G -Djava.io.tmpdir=/path/to/othertemp -- /path/to/server-config.conf +``` + +The command: + +``` +$ ./sharry-restserver*/bin/sharry-restserver -h +``` + +gives an overview of supported options. + + +### System properties + +All options that are given with `-D` are called system properties. +These can be used to overwrite certain configuration values. System +properties always take precedence over values defined in config files. + +This can be handy to temporarily change some configuration, for +example, enable the fixed admin account like this: + +``` +$ ./sharry-restserver*/bin/sharry-restserver -Dsharry.restserver.backend.auth.fixed.enabled=true -- /path/to/server-config.conf +``` diff --git a/modules/microsite/docs/doc/migration.md b/modules/microsite/docs/doc/migration.md new file mode 100644 index 00000000..93b24b67 --- /dev/null +++ b/modules/microsite/docs/doc/migration.md @@ -0,0 +1,97 @@ +--- +layout: docs +title: Migration +permalink: doc/migration +--- + +# {{ page.title }} + +For users of Sharry version 0.6.x, the database schema must be +migrated (kind of) manually. The application doesn't do it +automatically. However, there is a built-in script that converts the +old schema into the new one. + +But: At first, please backup the data. If you don't care, then its +probably easier to just start with a new database :). + +When migrating from Sharry version < 0.6.x, you'll need first to run a +0.6 version against the database. This will evolve the db schema to +the point where the migration-script from 1.0 can take it further. +Then follow this guide. + +## Postgres and MariaDB + +For these databases, you can start the restserver binary with a +special option `-Dsharry.migrate-old-dbschema=true`. + +``` +./sharry-restserver-@VERSION@/bin/sharry-restserver -Dsharry.migrate-old-dbschema=true ./sharry-new.conf +``` + +This will not start the restserver but rather run the migration +against the database configured in given config file. + +If that completes successfully, you can startup sharry as normal +(without that option). + + +## H2 + +H2 is a little more involved. This is because the database +initialization changed and the parameters given with the URL cannot be +changed afterwards. + +The steps are roughly this: + +- create a dump +- change the dump to make it postgres compatible +- import it into a new database (using the new connection settings) +- run the migration from above + +### Dump + +The dump can be created using a tool provided by h2: `ScriptTool` +([doc](https://h2database.com/javadoc/org/h2/tools/Script.html)). It +is in the jar file that is on your disk if you have sharry installed. +So the dump can be created like this: + +``` +java -cp sharry-restserver-@VERSION@/lib/com.h2database.h2-1.4.200.jar org.h2.tools.ScriptTool -url "jdbc:h2:///var/data/sharry/sharry-old-db" -user sa -password "" +``` + +This will create a `backup.sql` file in the current directory. + + +### Change the Dump + +This dump uses some incompatible things: all identifiers are upper +case and the datatype for a blob is called bytea in postgres. This can +be changed with GNU Sed: + +``` +sed -i 's,"CHUNKDATA" BLOB NOT NULL,"CHUNKDATA" BYTEA NOT NULL,g' backup.sql +sed -i 's,"[_A-Z]*",\L&,g' backup.sql +``` + +The first command fixes the datatype thing and the second converts all +words in quotes into lowercase. + +Note: for the second command, the GNU version of Sed is required. + +### Import the Dump + +Now the changed dump must be imported into a new database. Since h2 +creates one on demand, just run the command and specify now the new +connection – to an unexisting file and with the required settings +`MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE`. Again, a tool from h2 can be +used (`RunScript`, +[doc](https://h2database.com/javadoc/org/h2/tools/RunScript.html)): + +``` +java -cp sharry-restserver-@VERSION@/lib/com.h2database.h2-1.4.200.jar org.h2.tools.RunScript -url "jdbc:h2:///var/data/sharry/sharry-newdb;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE" -user sa -password "" +``` + +### Migrate + +Now run sharry with the migration setting as described above for +Postgres and MariaDB. diff --git a/modules/microsite/docs/doc/quickstart.md b/modules/microsite/docs/doc/quickstart.md new file mode 100644 index 00000000..3b339876 --- /dev/null +++ b/modules/microsite/docs/doc/quickstart.md @@ -0,0 +1,25 @@ +--- +layout: docs +title: Quickstart +permalink: doc/quickstart +--- + +# Quickstart + +To quickly try out sharry, follow these steps: + +1. Download a zip (version @VERSION@) from the [release + page](https://github.com/eikek/sharry/releases). + - e.g. [sharry-restserver-@VERSION@.zip](https://github.com/eikek/sharry/releases/download/release%2F@VERSION@/sharry-restserver-@VERSION@.zip) +2. Unpack it to some place. + ```bash + $ unzip sharry-restserver-@VERSION@.zip + ``` +3. Run the executable: + ```bash + $ /path/to/extracted-zip/bin/sharry-restserver + ``` +4. Goto , signup and login + +If you want to know more, for example what can be +[configured](configure), checkout these pages. diff --git a/modules/microsite/docs/doc/rest.md b/modules/microsite/docs/doc/rest.md new file mode 100644 index 00000000..10c9d1f7 --- /dev/null +++ b/modules/microsite/docs/doc/rest.md @@ -0,0 +1,64 @@ +--- +layout: docs +title: Rest Api +permalink: doc/rest +--- + +# REST Api + +Sharry is provided as a REST server and a web application client. The +REST Api is specified using openapi 3.0 and it's static documentation +can be seen [here](../openapi/sharry-openapi.html). + +The "raw" `openapi.yml` specification file can be found +[here](../openapi/sharry-openapi.yml). + +The calls are divided into 4 categories: + +- `/open/*`: no authentication is required to access +- `/sec/*`: an authenticated user is required +- `/alias/*`: these routes are allowed with a valid *alias id* given + as header `Sharry-Alias` +- `/admin/*`: an authenticated user that is admin is required + +Authentication works by logging in with username/password (or an +oauth2 flow) that generates a token that has to be sent with every +request to a secured and admin route. It is possible to sent it via a +`Cookie` header or the special `Sharry-Auth` header. + +Files can be uploaded using different methods. There is an endpoint +that can take all files and meta data from one single request. For +more reliable uploads, the server implements the [tus +protocol](https://tus.io/protocols/resumable-upload.html) that allows +to resume failed or paused uploads. + +## Authentication + +The unprotected route `/open/auth/login` can be used to login with +account name and password. The response contains a token that can be +used for accessing protected routes. The token is only valid for a +restricted time which can be configured (default is 5 minutes). + +New tokens can be generated using an existing valid token and the +protected route `/sec/auth/session`. This will return the same +response as above, giving a new token. + +This token can be added to requests in two ways: as a cookie header or +a "normal" http header. If a cookie header is used, the cookie name +must be `sharry_auth` and a custom header must be named +`Sharry-Auth`. + +## Live Api + +Besides the statically generated documentation at this site, the rest +server provides a openapi generated documenation, that allows playing +around with the api. It requires a running sharry rest server. If it +is deployed at `http://localhost:9090`, then check this url: + +``` +http://localhost:909/api/doc +``` + +## Examples + +TODO diff --git a/modules/microsite/docs/doc/screenshots.md b/modules/microsite/docs/doc/screenshots.md new file mode 100644 index 00000000..3ed4c5b1 --- /dev/null +++ b/modules/microsite/docs/doc/screenshots.md @@ -0,0 +1,38 @@ +--- +layout: docs +title: Screenhots +permalink: doc/screenshots +--- + +# Screenshots + +These are some screenshots to get a little impression of the web +client. It might be outdated, though. + +## Home Screen + + + +## Uploading a file + + + +## View Share Details + + + +## View Link to public page + + + +## View Files + + +## View Files with preview + + + + + +## Preview a single file + diff --git a/modules/microsite/docs/doc/webapp.md b/modules/microsite/docs/doc/webapp.md new file mode 100644 index 00000000..9c339eb4 --- /dev/null +++ b/modules/microsite/docs/doc/webapp.md @@ -0,0 +1,197 @@ +--- +layout: docs +title: Webapplication +permalink: doc/webapp +--- + +# Webapplication + +The web client is written in [Elm](https://elm-lang.org), an awesome +programming language for the web :-). The [tus javascript client +library](https://github.com/tus/tus-js-client) is used to realize the +resumable uploads. All the css is provided by +[Semantic-UI](https://semantic-ui.com/). + + +## Creating a new share + +After logging in, you can create new shares: + + + +The details are all optional and can also be changed afterwards. It is +required to specfiy a description, some files or both. Otherwise +submitting won't work. + +The detail options are explained below. + +### Name + +A share may have a name. This name is only for the owner and helps to +find shares easier in the list view. The name will also be used as the +head line, if the description doesn't contain a markdown headline (a +line starting with `#`). + + +### Description + +You can add some text to a share which will be displayed at the +download page. The description can be +[markdown](http://daring-fireball.net) and is converted to HTML when +being displayed. + +Furthermore, the description text is processed as a +[mustache](http://mustache.github.io/mustache.5.html) template and +allows to refer to the attached files. You can access the following +properties of any uploaded file: + +- `id` +- `filename` +- `url` +- `mimetype` +- `size` +- `length` +- `checksum` + +The `size` is the file size as a human readable string, while `length` +is the number in bytes. You can refer to files using their name or +index in the list. When using the file name, all dots in there must be +removed. + +{% raw %} +``` +{{#file.0}}{{url}}{{/file.0}} +``` +{% endraw %} + +or + +{% raw %} +``` +{{filename.dsc0100JPG.url}} +``` +{% endraw %} + +This makes it possible to embed files in the description, for example +to display an image file, you could write the following description: + +{% raw %} +``` +![an image]({{filename.DSCF0343JPG.url}}) +``` +{% endraw %} + +There is also a `files` property that can be used to iterate through +all uploaded files. So this would render the id and url of all files: + +{% raw %} +``` +{{#files}} +- {{id}}: {{url}} +{{/files}} +``` +{% endraw %} + +### Validity Time + +Every upload has a validity time after which the uploaded files are +“expired”. Then the public download page is not visible anymore and +the files can't be downloaded from non-protected urls. + +The files are there and the user that owns them still has access. They +are eventually removed by a cleanup job. + + +### Password + +The files can be further protected by a password. The download page +requires this password in order to download the files. + +The idea is that this password is a second secret, next to the url. +You can share the URL using one channel (maybe e-mail) and the +password using another channel. A person must have both things in +order to see the files. + + +### Maximum Views + +This setting restricts the number of accesses to the download page. If +the download page is accessed more than this number, it will not work +anymore. + + +## Publish / Unpublish / Republish + +A share that has not been published can only be accessed by its owner. +In order to create a link for everyone else, click the `Publish` +button in the top right of the detail view of a share. + + + +Once a share is published that circle is green. + + + +The expiry time is calculated from the validity time added to the +point in time the share is publshed. You'll see it in the details +pane. + +If the share is published you can get the link clicking on the *Share +Link* pane. You can copy&paste it, scan the QR code or send it via +e-Mail (if sharry is configured for that, it can be sent directly in +the webapp). + +You can unpublish a share at any time. The public link will +immediately stop working and the circle will be empty. Then there are +two options for publishing it again: one will generate a new random +link, the other option reuses the current public link. If you hit the +*Publish* button in the top right corner again, the share will be +published anew – meaning the current validity time is added to the +current point in time, but the public link will *not* change. All +people that you have shared it with earlier can immediately open the +site again. + +If you rather like to publish it to a new URL, click the black publish +button at the bottom of the *Detail* pane (see the screenshot below). + + +## Edit Details + +The share properties can be changed in the detail view of a share. The +detail view consists of a top menu, then follows the description, then +the file list menu and finally the list of files. + +Open the *Detail* tab in the top menu to see all properties. + + + +Properties that have the little blue edit icon in front of their names +can be changed by clicking that icon. + +The description can be edited by clicking the edit icon next to the +`Publish` button in the top right corner. + +It is also possible to add or remove files of that share. Click the +right menu item of the file list menu and the upload form appears. + + +## Alias Pages + +The alias page is a way to let other users upload files for you. The +idea is the same as with shared downloads: there is a cryptic URL you +can share with others. This url allows to upload files that will be +associated to the owner of that alias page. + +Click in the top right menu that opens a drop down menu and choose +*Aliases*. There you can create, edit and remove alias pages. + +Alias pages are also convenient for quickly uploading files for +yourself, as they don't require any authentication. For example, using +curl you could do: + +``` +$ curl -H'Sharry-Alias: E5EohHtJHxN' -F file=@test.jpg -F file=@logo.jpg http://localhost:9090/api/v2/alias/upload +{"success":true,"message":"Share created.","id":"FDQvHK2LVGe-SjkDjQxMiSo-8fPyBqKX3AY-nmWWnDsrRX3"} +``` + +See the [REST page](rest) for more details on the various routes. diff --git a/modules/microsite/docs/index.md b/modules/microsite/docs/index.md new file mode 100644 index 00000000..454f06c9 --- /dev/null +++ b/modules/microsite/docs/index.md @@ -0,0 +1,7 @@ +--- +layout: homeFeatures +features: + - first: ["Send files…", "Send your files while receivers are not required to have an account."] + - second: ["Receive files…", "Receive files from peers without requiring them to sign up either."] + - third: ["Reliable Up- and Downloads", "Up- and downloads are resumable so working under unreliable network conditions is possible."] +--- diff --git a/modules/microsite/docs/screenshots/20191216-222321.jpg b/modules/microsite/docs/screenshots/20191216-222321.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4761a04da2c233beb1643e823bedd65cbbea13c GIT binary patch literal 86202 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∈L$73<1$32&#;eu0%gJuVxNxB@mmh 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 literal 0 HcmV?d00001 diff --git a/modules/microsite/docs/screenshots/20191216-223105.jpg b/modules/microsite/docs/screenshots/20191216-223105.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4291436bbeb367fa1887d6abba1871a7c0c9c4ef GIT binary patch literal 132764 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%0A+IY6!SJS35Sg@OeeJx_aY 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 z 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 literal 0 HcmV?d00001 diff --git a/modules/microsite/docs/screenshots/20191216-223128.jpg b/modules/microsite/docs/screenshots/20191216-223128.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ab224fd82f6e6460fc891bea6bde78cd1c140c1 GIT binary patch literal 223884 zcmeFZbwE_z_CI_GDN!V)K}3-5W&jllDG}*z2|+rf6j5mb>6AudL}CC5krIhfYG_nq z7={pL=z0(8eZ2QR_xiox=li(Z z96$y91CGBiV6Xc+*a3j5DmOp`0003%k8=vZ0VzH3VE9R!f%Ih@yzlwAAT5N03!DMZ zU_(F{q^ZEOCwMqK!T(<8DM+V*2iV2;>%X0qRW)w13iAsI@(YQAEd_<7q=kf~g~VBf zg{8$Lq=iMm+Bi8s`Z*cHNdiZO^MmUNE1aKnH&}uTjtK9h3Yd@gb94mYCBfg()IaHy zdN{a0_z-~gaevbD^d}5XdO7(!{(Bjn@C9ogPXN~dA_4+Jf>T6Rgb4Gea3YkOyR?*!Kg&cCG}!2SsrIfx4vA0H2&@B|kQ zt`B(Nk>j7bAVffMMVrvljgn3H0TI>JxEGbJ#1}f@3ytzR z(!J-G!oux#gg6F_qPh=?%blq;OBl&@<^WT4!S+`VO|wF*7lJO)PcgoC|;*Pur=0Dt?@ z*Q49cTB`!{s;Tk~E!#i48~)K9@aCkU_IDl}Hb+axz>N8!qX_4={?XnsfWC>le9}_s zJCoFe{nGyz_C8;^La-Lt@&02swny+^qch z$4KTL6x)T`V zljb(eMTMwX$mQ(Yo^O9KD*x=3Sac+hAUkX|BIL^IB@{xwqHV&cu1(=d6kb(ar{sZT zVVAu<)oEN~B{uDlW^>xvgHwQ&d_+{|*j+yM8KJO5TLz!J5KTy@g4`3B`s(OZ!C_d_ zq~nK#&exY+a>%nB6lp$8JR)Li{)= zr!LGIcQxVO+buYx%XtVpmGQ0p<|(pjM`J+zhVcuwD>0eDd&4e-sh;}6V3XsF2%#w#+4{|u(bM5+4;2kKCPt zy?$-{bYn_=twHjgIZ4^|Y|M&YmsV$j!_j`wb7%P(*MSq!e80N;fAETGlRBNWApy-B z&s`pocW%OuF9QeLCI4kc+47|0A6?N&JvaVfL1IVZO|WRpXjkQYX+$&gw3%_&R^ElP zFO^S^ZkC%q*g8DD~qnuBC*Bo>*=9D zs_aK$on}a|_U=dgA)VXtDv)UDe}=@}xZWnKLHeOXwHsjWf?PMq4dK2{MN`|XNc15z zr;P<^=p)S(Jzd0{Co0U4@{aozF9CJrS-C* z*EM+Fu-S{9>V+$Yy<2^6c?{r)38ZDO1kZ3Zd)4g>er5up(Y) z!#m162KKOJ4*ju3vS4&_I@%TWD>*_OZa6KF?U)CNzzMaEfw#d&AF6qq#eJKR_)Q^% zuR@Oj=v95HmzPVc7LNfj`EfALXfQhl*Bk=@X}gC(g1#lQN)%&fFTI)~8xxlap4`{vu-(5#j(?!J{T9H^Huom3NENQ7MC z%mMFuMa|dF;m)$V?`sXBlrC=_uI$2P4?kUtycT_@dyF~yN8`L7aLq_(Xk-nuTkMa4 zAo;ybx*gcpPsacs?=i5}bqts#Mr#HBW1rdSU$-NltdD^aG4`lQafbH5Od67Wgm(;V zF21S=Jo69S&81EqB&uugshX-{TnQ&;}cf zCHn491vfa7Gg>Xe7t~dcNSX3NAdn|U8vI{YvFS3YZVMW?Dx;|QoHUq<^*N*)T`Q!M z3#+Yg>WbSZM}Kf8e#FOuK9TCgFMefV;-9S<5shOH!&5jEf%o!Epx+(?cX)&E-l>=0 zSmQi;#MLpDI;&6X0a>_n~`v^_1mcsCFZ{lH8hD z)7ZksyRD@wzH5zVdZMi7=XCjNyjBuBeYhhW4NH;Mt4O-88y#7X#4B%}b)2ex6YSIU z*q3Ty@DiQSt7oAf@digy$)@%2^KgkobETGz9?zHMvozUDc22r!#Y;h79ckY@EBUtH zaVXgKPT~zUuwOBUzMlloBU@IkGo6mRo`PGE>37veM*8eecZl%1NI8FLF&kbs z$2IoZ+U_MLCQy(K?z!=;XO|xz$8MtW9Nl9Gh;guN@pD*G3{%7kOU)Ik+xg=(8# zka_~USflStw(V4s)HYtyZKdo8Pg$z$Yh)hAYh5wLPqOhYyq0fbCS<@i6{Fe@9H0t$ z7zZczb$wu4<)u$Yc%D28m_IArL^e=rBKDGoWVPLgr}{pUGvbY~OO*ZN(nj4^+BW?k zm83&;^FzlUqzW)8tdHc!>Dotx$n|^-o--Q^Mvn*_;_HRkFPd)%IJ9h{&mTSHxte2n zo$4meO%qR}tem>VY8(g^sNa*rmu!V3Y_pt_kZ^e;c=2k}UUTr_i?`DKk5Aw2r2tI` zmkMV-sdWy=@PYNKLUvqVvjd?Z;jz!)0BI@>q5o-{>fP_E?9wgRP8f^NE>p~R3$pu*EGWS+!-Fq zg|b!759qit&<6&&NR3 zNN(d`mLyF2TwV#FD``ll)2XCWvn|}w^*n@>%-l#hP1vp4y4W&Kjh&oJ&xSMW&CBZ! zbPU~IJd4+D?=!7(8^;kHeafsj*hES}oer~D1?9u9aGv4=m$nl|>%Q!X1|g|ixJ@me z@kHdG_K*hD9s~Qg$|sT*&OJ{w)2%GO^iuGBr?jqA*(dGPS1%jm{Yhp;HCQJN0<(CM zFRNS%YvZn%`6>x6!x6>#Ezi5yx!&_(Wa4}M;5q|Ux6_xr8j@r#i|#w*NZjg)v{0GM zNV-@d-&rY8LzJIo;B0+v;@SC_3c`|?-g}Ad&v^MRTn@bxyQ8odY-Bez5YXgdd^Ihm z&^@!eTvk%7gbB}2k?YdB$q_844?i03wbp~!sf@W`=@m-dh!5??#uq5%_c|dO9^+AE zE_o?TFZQ#I3ZeB9lB&I1+PU~~raMZVK4jO{^jFrR+njxwXz%&>Bb5DcZ@gS4aHJ9_feD8SHU}+cO6Virg$EKQ9955O~S&yNhe-bcONa&X}jT%^Whi>yTWBIs;C

|L?dw#)?ek1DMaBHme1O)8 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

7I_r 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%0AC~`I4?Lr=feKhbq(Xu5>-6&P3Ak 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 W0Okk0{|O_1aaU`0KR*BGn|}l5GBI5M literal 0 HcmV?d00001 diff --git a/modules/microsite/docs/screenshots/20191216-223153.jpg b/modules/microsite/docs/screenshots/20191216-223153.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0b438cda4f28d44641388d00fe30854267a08274 GIT binary patch literal 233405 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

CGPPQmL#Kv|MGM{VJ$L3mrIDLilj^WEl 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 }C|ar5Nv4|OM%!w_{*)J1X0mP^ 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%0D0GDF&)M4qWLiXa;3D-U}}I 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 nmZhvE1lAaDX2XZU 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 literal 0 HcmV?d00001 diff --git a/modules/microsite/docs/screenshots/20191216-223216.jpg b/modules/microsite/docs/screenshots/20191216-223216.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eed338357c2f187e369cab94674921fba9ddda4c GIT binary patch literal 301390 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⁢-A?%%x33a^QK~L&U3? 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 Qew_ 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 OS7crL2$PxL^ZyH@ZPDof literal 0 HcmV?d00001 diff --git a/modules/microsite/docs/screenshots/20191217-210812.jpg b/modules/microsite/docs/screenshots/20191217-210812.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cd9a17c9a64967221d8e0ad49b73492ddb1fe7f3 GIT binary patch literal 141599 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 z%0A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

8Fq5Q1c9faG|%=7u}&X9&s%{JHrGxp-X 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�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

v#R#<-LDAVuAiV=RKF8GHR2L4@>$6v$ks3^ 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沈TZ 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�$gf-xUC(b87-9gFkQZPHV52!8> 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 literal 0 HcmV?d00001 diff --git a/modules/microsite/docs/screenshots/publish_empty.jpg b/modules/microsite/docs/screenshots/publish_empty.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6ba553fe17056e8eb03b49c407648def86c4633a GIT binary patch literal 55677 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 + + + + + image/svg+xml + + + + + + + + + + + + + + features01 + Created with Sketch. + + + + + + + + diff --git a/modules/microsite/src/main/resources/microsite/img/light-navbar-brand.svg b/modules/microsite/src/main/resources/microsite/img/light-navbar-brand.svg new file mode 120000 index 00000000..44539840 --- /dev/null +++ b/modules/microsite/src/main/resources/microsite/img/light-navbar-brand.svg @@ -0,0 +1 @@ +../../../../../../../artwork/icon_small.svg \ No newline at end of file diff --git a/modules/microsite/src/main/resources/microsite/img/light-sidebar-brand.svg b/modules/microsite/src/main/resources/microsite/img/light-sidebar-brand.svg new file mode 120000 index 00000000..44539840 --- /dev/null +++ b/modules/microsite/src/main/resources/microsite/img/light-sidebar-brand.svg @@ -0,0 +1 @@ +../../../../../../../artwork/icon_small.svg \ No newline at end of file diff --git a/modules/microsite/src/main/resources/microsite/img/second-feature-icon.svg b/modules/microsite/src/main/resources/microsite/img/second-feature-icon.svg new file mode 100644 index 00000000..48125095 --- /dev/null +++ b/modules/microsite/src/main/resources/microsite/img/second-feature-icon.svg @@ -0,0 +1,113 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + features02 + Created with Sketch. + + + + + + diff --git a/modules/microsite/src/main/resources/microsite/img/third-feature-icon.svg b/modules/microsite/src/main/resources/microsite/img/third-feature-icon.svg new file mode 100644 index 00000000..7c6c7d1f --- /dev/null +++ b/modules/microsite/src/main/resources/microsite/img/third-feature-icon.svg @@ -0,0 +1,100 @@ + + + + + + image/svg+xml + + + + + + + + features03 + Created with Sketch. + + + + + + + diff --git a/modules/restapi/src/main/resources/sharry-openapi.yml b/modules/restapi/src/main/resources/sharry-openapi.yml new file mode 100644 index 00000000..3d802d4d --- /dev/null +++ b/modules/restapi/src/main/resources/sharry-openapi.yml @@ -0,0 +1,1836 @@ +openapi: 3.0.0 + +info: + title: Sharry + version: 1.0.0-SNAPSHOT + description: | + Sharry provides a way to share files with others in a convenient + way. The core functionality is provided by a server that can be + controlled via REST calls. + + The calls are divided into 4 categories: + + - `/open/*`: no authentication is required to access + - `/sec/*`: an authenticated user is required + - `/alias/*`: these routes are allowed with a valid *alias id* + given as header `Sharry-Alias` + - `/admin/*`: an authenticated user that is admin is required + + Authentication works by logging in with username/password (or an + oauth2 flow) that generates a token that has to be sent with every + request to a secured and admin route. It is possible to sent it + via a `Cookie` header or the special `Sharry-Auth` header. + + Files can be uploaded using different methods. There is an + endpoint that can take all files and meta data from one single + request. For more reliable uploads, the server implements the [tus + protocol](https://tus.io/protocols/resumable-upload.html) that + allows to resume failed or paused uploads. + +tags: + - name: Information + description: Get information about this API. + - name: Authentication + description: Various methods to authenticate. + - name: Registration + description: Register a new account. + - name: Account Management + description: Admins can create/update/delete accounts. + - name: Alias + description: Edit your alias pages. + - name: Shares + description: Edit shares. + - name: Shares Upload + description: Create or Add Files +servers: + - url: /api/v2 + description: Current host + +paths: + /open/info/version: + get: + tags: [ Information ] + summary: Version information. + description: | + Returns version information about server application. + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/VersionInfo" + /open/info/appconfig: + get: + tags: [ Information ] + summary: Basic configuration. + description: | + Return basic information for setting up a web client. + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AppConfig" + + /open/auth/login: + post: + tags: [ Authentication ] + summary: Authenticate with account name and password. + description: | + Authenticate with account name and password. + + If successful, an authentication token is returned that can be + used for subsequent calls to protected routes. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/UserPass" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AuthResult" + /open/auth/oauth/{id}: + get: + tags: [ Authentication ] + summary: Authenticate via OAuth2 + description: | + The `id` must be a configured OAuth provider. This requests + will redirect the client to the configured provider. After + authentication there, the provider will redirect back to + sharry. + + This only works, if sharry uses TLS (https), and the correct + callback-url is configured at the provider. + parameters: + - $ref: "#/components/parameters/id" + responses: + '303': + description: See other + /open/auth/oauth/{id}/resume: + post: + tags: [ Authentication ] + summary: Callback url from OAuth2 providers. + description: | + This endpoint is for OAuth2 providers when delegating control + back to sharry. At this stage, sharry will do basic validation + and then finishes logging into the application. + parameters: + - $ref: "#/components/parameters/id" + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + code: + type: string + responses: + '200': + description: OK + '403': + description: Forbidden + /sec/auth/session: + post: + tags: [ Authentication ] + summary: Authentication with a token + description: | + Authenticate with a token. This can be used to get a new + authentication token based on another valid one. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AuthResult" + /sec/auth/logout: + post: + tags: [ Authentication ] + summary: Logout. + description: | + This route informs the server about a logout. This is not + strictly necessary. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + /open/signup/register: + post: + tags: [ Registration ] + summary: Register a new account. + description: | + Create a new account. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/Registration" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + /admin/signup/newinvite: + post: + tags: [ Registration ] + summary: Generate a new invite. + description: | + When signup mode is set to "invite", sharry requires an + invitation key when signing up. These keys can be created + here. Creating such keys requires an admin user. It also asks + for a password that must be set in the configuration file. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/GenInvite" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/InviteResult" + + /admin/account: + get: + tags: [ Account Management ] + summary: List all accounts. + description: | + Lists all available (internal and external) accounts. An + optional query parameter can be used to narrow the list down + by username. It is a simple substring search in the username + property. + parameters: + - $ref: "#/components/parameters/q" + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AccountList" + post: + tags: [ Account Management ] + summary: Create a new account. + description: | + Creates a new account. The account is marked as internal and + the provided password is used when authenticating. Sharry + supports external authentication, these accounts however, + cannot be directly created. They are created on demand. + + The username and password properties are mandatory. The others + are optional or have a sensible default. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AccountCreate" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /admin/account/{id}: + parameters: + - $ref: "#/components/parameters/id" + get: + tags: [ Account Management ] + summary: Details about one account. + description: | + Returns details about the account with the given id. Note that + the id is *not* the username, but the account-id. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AccountDetail" + post: + tags: [ Account Management ] + summary: Modify an account. + description: | + Modifies an existing account. It is only possible to modify + `state`, `email` and the `admin` property. + + If the `email` property is not supplied, an existing email is + removed from the account. + + The password can be changed for an account. If it is `null` or + empty, it is left unchanged. Also, if the account is not + internal, a given password is ignored. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AccountModify" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + /sec/settings/email: + get: + tags: [ Account Management ] + summary: Get your E-Mail address. + description: | + Allows the current user to get their e-mail address. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/EmailInfo" + post: + tags: [ Account Management ] + summary: Edit your E-Mail. + description: | + Allows the current user to change their e-mail address. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/EmailChange" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + delete: + tags: [ Account Management ] + summary: Removed your E-Mail. + description: | + Allows the current user to remove their e-mail address. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/settings/password: + post: + tags: [ Account Management ] + summary: Change your password. + description: | + Allows users to change their password. This is only valid for + internal accounts. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PasswordChange" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/alias: + get: + tags: [ Alias ] + summary: List all aliases. + description: | + Lists all aliases of the current user. + parameters: + - $ref: "#/components/parameters/q" + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AliasList" + post: + tags: [ Alias ] + summary: Create new alias + description: | + Create a new alias. The id is generated to some random string + if not specified, such that the URLs resulting from this alias + are not guessable. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AliasChange" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/IdResult" + /sec/alias/{id}: + parameters: + - $ref: "#/components/parameters/id" + get: + tags: [ Alias ] + summary: Details about one alias. + description: | + Returns details about an alias for the given id. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/AliasDetail" + post: + tags: [ Alias ] + summary: Change an alias + description: | + Change some properties of an existing alias. + + The id is optional; if it is not specified a new random one + will be generated. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/AliasChange" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/IdResult" + delete: + tags: [ Alias ] + summary: Delete an alias. + description: | + Deletes an alias. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /alias/upload: + $ref: "#/paths/~1sec~1upload" + + /sec/upload: + post: + tags: + - Shares Upload + summary: Upload files to create a share. + description: | + Allows to create a new share by uploading data using + `multipart/form-data` requests. All requests must have content + type `multipart/form-data`. + + All parts of a `multipart/form-data` request are treated as + files except if one with name *"meta"* is found. This is + expected to contain a JSON structure with the metadata + (validity, password etc). If this is missing, default values + will be used. All other parts are added as files to the new + share. It is allowed to send only a "meta" part or even an + empty body. In these cases the new share will be created + without files.. + + If this route is at `/alias/` a `Sharry-Alias` header is + required. + security: + - authTokenHeader: [] + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + meta: + $ref: "#/components/schemas/ShareProperties" + file: + type: array + items: + type: string + format: binary + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/IdResult" + + /sec/share/search: + get: + tags: + - Shares + summary: Search your shares. + security: + - authTokenHeader: [] + description: | + Returns a list of all shares of the current user. + parameters: + - $ref: "#/components/parameters/q" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/ShareList" + + /alias/upload/new: + $ref: "#/paths/~1sec~1upload~1new" + + /sec/upload/new: + post: + tags: + - Shares Upload + summary: Create a new empty share. + description: | + This endpoint allows to only upload json data to create a new + empty share. + + The same thing can be achieved by using `multipart/form-data` + requests to the `/sec/upload` endpoint containing only one part + named "meta". But this endpoint may be more convenient to use. + + If this route is at `/alias/` a `Sharry-Alias` header is + required. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/ShareProperties" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/IdResult" + + /open/share/{pid}: + get: + tags: + - Shares (Public) + summary: Get details about a share. + description: | + Returns all details about a share. + + If the share is password protected, the password must be + supplied using the header `Sharry-Password`. If it is not + supplied, a 401 response is sent. If it is wrong, a 403 + response will be returned. + parameters: + - $ref: "#/components/parameters/pid" + - $ref: "#/components/parameters/SharryPassword" + responses: + 401: + description: Unauthorized + 403: + description: Forbidden + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/ShareDetail" + + /sec/share/{id}: + parameters: + - $ref: "#/components/parameters/id" + get: + tags: + - Shares + summary: Get details about a share. + security: + - authTokenHeader: [] + description: | + Returns all details about a share. + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/ShareDetail" + + delete: + tags: + - Shares + summary: Delete a share. + description: | + Allows to delete a share and all associated files. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /alias/upload/{id}/files/add: + $ref: "#/paths/~1sec~1upload~1%7Bid%7D~1files~1add" + + /sec/upload/{id}/files/add: + post: + tags: + - Shares Upload + summary: Add more files to a share. + description: | + This endpoint can be used to add more files to an existing + share. It must be a `multipart/form-data` request, where each + part results in a new file added to the share. + + If this route is at `/alias/` a `Sharry-Alias` header is + required. + security: + - authTokenHeader: [] + parameters: + - $ref: "#/components/parameters/id" + requestBody: + content: + multipart/form-data: + schema: + type: object + properties: + file: + type: array + items: + type: string + format: binary + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/share/{id}/name: + post: + tags: + - Shares + summary: Set a new name. + description: | + Sets the name of the share. + parameters: + - $ref: "#/components/parameters/id" + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SingleString" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + delete: + tags: + - Shares + summary: Deletes the name of a share. + description: | + A name is optional and can be removed via this route. + parameters: + - $ref: "#/components/parameters/id" + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + + /sec/share/{id}/validity: + post: + tags: + - Shares + summary: Set a new validity time. + parameters: + - $ref: "#/components/parameters/id" + security: + - authTokenHeader: [] + description: | + Sets the validity property of the share to a new value. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SingleNumber" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + + /sec/share/{id}/description: + post: + tags: + - Shares + summary: Set a new description. + parameters: + - $ref: "#/components/parameters/id" + security: + - authTokenHeader: [] + description: | + Sets the description of share. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SingleString" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/share/{id}/maxviews: + post: + tags: + - Shares + summary: Set new maximum downloads. + parameters: + - $ref: "#/components/parameters/id" + security: + - authTokenHeader: [] + description: | + Sets the maximum downloads property. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SingleNumber" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/share/{id}/password: + parameters: + - $ref: "#/components/parameters/id" + post: + tags: + - Shares + summary: Sets a password to this share. + description: | + Sets or changes the password of the share. If the share + already has a password defined, it must be given with the + request. Otherwise it may be empty. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SingleString" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + delete: + tags: + - Shares + summary: Removes the password from the share. + security: + - authTokenHeader: [] + description: | + Removes the password that has been set for this share. If this + share has no password set, a successful response is sent. + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/share/{id}/publish: + parameters: + - $ref: "#/components/parameters/id" + post: + tags: + - Shares + summary: Publishes a share. + security: + - authTokenHeader: [] + description: | + A share can be published. That means it is accessible by + everyone (no access protection!) using a different url and id. + This link can then be shared. Once the validity time is + expired, the public link won't work anymore. + + If the share is already published, this is a no-op (resulting + in a successful response). + + If the share was previously published the request can control, + wether the old id should be reused (resulting in the same + links as before), or a new random one should be generated. + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/PublishData" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + delete: + tags: + - Shares + summary: Unpublish a share. + security: + - authTokenHeader: [] + description: | + If a share is currently published it can be un-published using + this endpoint. + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /open/share/{pid}/file/{fid}: + get: + tags: + - Shares (Public) + summary: Retrieve a file from the share. + description: | + Returns a file from a share. + + The response supports byte-serving and ETag. + parameters: + - $ref: "#/components/parameters/pid" + - $ref: "#/components/parameters/fid" + responses: + 200: + description: Ok + content: + "*/*": + schema: + type: string + format: binary + + /sec/share/{id}/file/{fid}: + parameters: + - $ref: "#/components/parameters/id" + - $ref: "#/components/parameters/fid" + get: + tags: + - Shares + summary: Retrieve a file from the share. + description: | + Returns a file from a share. + + The response supports byte-serving and ETag. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + "*/*": + schema: + type: string + format: binary + delete: + tags: + - Shares + summary: Remove a file from a share. + description: | + Deletes a file from a share. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /alias/upload/{id}/files/tus: + $ref: "#/paths/~1sec~1upload~1%7Bid%7D~1files~1tus" + + /sec/upload/{id}/files/tus: + parameters: + - $ref: "#/components/parameters/id" + options: + tags: + - Shares Upload + summary: "[Tus] Protocol information." + description: | + Implements the TUS protocol OPTIONS request to return common + information about what parts of the tus protocol are supported + by this server. + + Please see the + [protocol](https://tus.io/protocols/resumable-upload.html) + specification for more details. + + If this is the `/alias` route, a `Sharry-Alias` header is + required. + security: + - authTokenHeader: [] + responses: + 204: + description: NoContent + headers: + Tus-Resumable: + schema: + type: string + Tus-Extension: + schema: + type: string + Tus-Version: + schema: + type: string + post: + tags: + - Shares Upload + summary: "[Tus] Create new (empty) files using tus protocol" + description: | + Create a new (empty) file via tus' *creation* extension. + + This follows the tus protocol, but uses different headers for + transporting the filename and filetype. While the tus protocol + defines a `Upload-Metadata` header, what it can contain is not + specified. It requires custom negotiation between server and + client, so we can as well use different headers that are + easier to read and write: + + - `Sharry-File-Name` specifies the filename (percent-encoded) + - `Sharry-File-Type` specifies the content type + - `Sharry-File-Length` can be used to specifiy the total + length in bytes. If not found `Upload-Length` is used. + + The total length must be specified, name and content type are + optional. + + Please see the + [protocol](https://tus.io/protocols/resumable-upload.html) + specification for more details. + security: + - authTokenHeader: [] + parameters: + - $ref: "#/components/parameters/SharryFileName" + - $ref: "#/components/parameters/SharryFileType" + - $ref: "#/components/parameters/SharryFileLength" + - $ref: "#/components/parameters/UploadLength" + responses: + 201: + description: Created + headers: + Tus-Resumable: + schema: + type: string + Location: + schema: + type: string + + /alias/upload/{id}/files/tus/{fid}: + $ref: "#/paths/~1sec~1upload~1%7Bid%7D~1files~1tus~1%7Bfid%7D" + + /sec/upload/{id}/files/tus/{fid}: + parameters: + - $ref: "#/components/parameters/id" + - $ref: "#/components/parameters/fid" + patch: + tags: + - Shares Upload + summary: "[Tus] Upload binary data" + description: | + Endpoint for receiving the binary data belonging to a file. + The file must have been created before using a POST request to + the parent path url. + + The `Upload-Offset` header must be specified, it may be set to + `0`. + + You may also use the `POST` method instead. + + Please see the + [protocol](https://tus.io/protocols/resumable-upload.html) + specification for more details. + security: + - authTokenHeader: [] + parameters: + - $ref: "#/components/parameters/UploadOffset" + requestBody: + content: + application/offset+octet-stream: + schema: + type: string + format: binary + responses: + 204: + description: NoContent + headers: + Tus-Resumable: + schema: + type: string + Upload-Offset: + schema: + type: integer + format: int64 + 404: + description: Not Found + head: + tags: + - Shares Upload + summary: "[Tus] Information about a file." + description: | + Returns the upload status of the file. Returns the total + expected length and the number of bytes that have really been + saved. This is used by clients to determine the next + `Upload-Offset` to use. + + Please see the + [protocol](https://tus.io/protocols/resumable-upload.html) + specification for more details. + security: + - authTokenHeader: [] + responses: + 200: + description: Ok + headers: + Tus-Resumable: + schema: + type: string + Upload-Offset: + schema: + type: integer + format: int64 + Upload-Length: + schema: + type: integer + format: int64 + + /alias/mail/notify/{id}: + post: + tags: + - Mail + summary: Notify the owner. + description: | + After uploading some files via an alias page, the client can + request to notify the owner via e-mail that an upload just + finished. + + The corresponding user must have an e-mail address in their + account and the mail feautre must be enabled in the config + file. + security: + - aliasTokenHeader: [] + parameters: + - $ref: "#/components/parameters/id" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + + /sec/mail/template/share/{id}: + get: + tags: + - Mail + summary: Get the mail template for a published share. + description: | + To send a link to a published share via e-mail, templates can + be specified in the configuration file. The server can then + insert the required data (like the cryptic url), so the user + is freed from copy-pasting things. + security: + - authTokenHeader: [] + parameters: + - $ref: "#/components/parameters/id" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/MailTemplate" + /sec/mail/template/alias/{aid}: + get: + tags: + - Mail + summary: Get the mail template for a published share. + description: | + To send a link to an alias page via e-mail, templates can be + specified in the configuration file. The server can then + insert the required data (like the cryptic url), so the user + is freed from copy-pasting things. + security: + - authTokenHeader: [] + parameters: + - $ref: "#/components/parameters/aliasId" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/MailTemplate" + /sec/mail/send: + post: + tags: + - Mail + summary: Send an e-mail. + description: | + This will send the given e-mail as is to the specified + recipients. This will only work, if the server enabled the + mail feature. + security: + - authTokenHeader: [] + requestBody: + content: + application/json: + schema: + $ref: "#/components/schemas/SimpleMail" + responses: + 200: + description: Ok + content: + application/json: + schema: + $ref: "#/components/schemas/BasicResult" + +components: + schemas: + SimpleMail: + description: | + A simple e-mail. + required: + - recipients + - subject + - body + properties: + recipients: + type: array + items: + type: string + subject: + type: string + body: + type: string + MailTemplate: + description: | + Contents of a mail template. + required: + - subject + - body + properties: + subject: + type: string + body: + type: string + PublishData: + description: | + Input when publishing a share. + required: + - reuseId + properties: + reuseId: + type: boolean + SingleString: + description: | + Sending a single string value. + required: + - value + properties: + value: + type: string + SingleNumber: + description: | + For sending a single number. + required: + - value + properties: + value: + type: integer + format: int64 + ShareDetail: + description: | + Details about a single share. + required: + - id + - validity + - maxViews + - password + - created + - files + properties: + id: + type: string + format: ident + name: + type: string + aliasId: + type: string + format: ident + aliasName: + type: string + validity: + type: integer + format: duration + maxViews: + type: integer + password: + type: boolean + descriptionRaw: + type: string + description: + type: string + created: + type: integer + format: date-time + publishInfo: + $ref: "#/components/schemas/SharePublish" + files: + type: array + items: + $ref: "#/components/schemas/ShareFile" + SharePublish: + description: | + Information about a published share. + required: + - id + - enabled + - views + - publishDate + - publishUntil + - expired + properties: + id: + type: string + format: ident + enabled: + type: boolean + views: + type: integer + format: int32 + publishDate: + type: integer + format: date-time + publishUntil: + type: integer + format: date-time + expired: + type: boolean + lastAccess: + type: integer + format: date-time + ShareFile: + description: | + Details about a file belonging to a share. + required: + - id + - filename + - size + - mimetype + - checksum + - storedSize + properties: + id: + type: string + format: ident + filename: + type: string + size: + type: integer + format: size + mimetype: + type: string + checksum: + type: string + storedSize: + type: integer + format: size + ShareList: + description: | + A list of shares + required: + - items + properties: + items: + type: array + items: + $ref: "#/components/schemas/ShareListItem" + ShareListItem: + description: | + Some details about a share used when searching for shares. + required: + - id + - validity + - maxViews + - password + - created + - files + - size + properties: + id: + type: string + format: ident + name: + type: string + aliasName: + type: string + validity: + type: integer + format: duration + maxViews: + type: integer + format: int32 + password: + type: boolean + created: + type: integer + format: date-time + files: + type: integer + size: + type: integer + format: size + published: + type: boolean + ShareProperties: + description: | + Describes a share. + required: + - validity + - maxViews + properties: + name: + type: string + validity: + type: integer + format: duration + description: + type: string + maxViews: + type: integer + format: int32 + password: + type: string + format: password + IdResult: + description: | + Some basic result of an operation and an identifier. The + identifier is valid on success only. + required: + - success + - message + - id + properties: + success: + type: boolean + message: + type: string + id: + type: string + format: ident + AliasList: + description: | + A list of aliases. + required: + - items + properties: + items: + type: array + items: + $ref: "#/components/schemas/AliasDetail" + AliasDetail: + description: | + Details about one alias. + required: + - id + - name + - validity + - enabled + - created + properties: + id: + type: string + format: ident + name: + type: string + validity: + type: integer + format: duration + enabled: + type: boolean + created: + type: integer + format: date-time + AliasChange: + description: | + Data for changing alias properties. + required: + - name + - validity + - enabled + properties: + id: + type: string + format: ident + name: + type: string + validity: + type: integer + format: duration + enabled: + type: boolean + EmailInfo: + description: | + Accounts may optionally have an e-mail address registered. + properties: + email: + type: string + EmailChange: + description: | + Change your email. + required: + - email + properties: + email: + type: string + PasswordChange: + description: | + Change your password. + required: + - oldPassword + - newPassword + properties: + oldPassword: + type: string + format: password + newPassword: + type: string + format: password + AccountList: + description: | + A list of accounts. + required: + - items + properties: + items: + type: array + items: + $ref: "#/components/schemas/AccountDetail" + AccountDetail: + description: | + Information about an account. + required: + - id + - login + - source + - state + - admin + - loginCount + - shares + - created + properties: + id: + type: string + format: ident + login: + type: string + format: ident + source: + type: string + format: accountsource + state: + type: string + format: accountstate + admin: + type: boolean + email: + type: string + loginCount: + type: integer + format: int32 + shares: + type: integer + format: int32 + lastLogin: + type: integer + format: date-time + created: + type: integer + format: date-time + AccountCreate: + description: | + Create an account. + required: + - login + - admin + - state + - password + properties: + login: + type: string + format: ident + state: + type: string + format: accountstate + admin: + type: boolean + password: + type: string + format: password + email: + type: string + AccountModify: + description: | + Modify an existing account. + required: + - admin + - state + properties: + state: + type: string + format: accountstate + admin: + type: boolean + email: + type: string + password: + type: string + format: password + AppConfig: + description: | + Initial configuration. + required: + - appName + - baseUrl + - assetsPath + - signupMode + - oauthConfig + - chunkSize + - retryDelays + - maxValidity + - maxSize + - mailEnabled + properties: + appName: + type: string + baseUrl: + type: string + format: uri + assetsPath: + type: string + signupMode: + type: string + format: signupmode + oauthConfig: + type: array + items: + $ref: "#/components/schemas/OAuthItem" + chunkSize: + type: integer + format: int64 + retryDelays: + type: array + items: + type: integer + format: int64 + maxValidity: + type: integer + format: duration + maxSize: + type: integer + format: size + mailEnabled: + type: boolean + OAuthItem: + description: | + Information about a configured OAuth provider. + required: + - id + - name + properties: + id: + type: string + format: ident + name: + type: string + icon: + type: string + GenInvite: + description: | + A request to generate a new invitation key. + required: + - password + properties: + password: + type: string + format: password + InviteResult: + description: | + The result when requesting new invitation keys. + required: + - success + - message + properties: + success: + type: boolean + message: + type: string + key: + type: string + format: ident + Registration: + description: | + Data for registering a new account. + required: + - login + - password + properties: + login: + type: string + format: ident + password: + type: string + format: password + invite: + type: string + format: ident + BasicResult: + description: | + Some basic result of an operation. + required: + - success + - message + properties: + success: + type: boolean + message: + type: string + UserPass: + description: | + Account name and password. + required: + - account + - password + properties: + account: + type: string + password: + type: string + AuthResult: + description: | + The response to a authentication request. + required: + - id + - user + - admin + - success + - message + - validMs + properties: + id: + type: string + format: ident + user: + type: string + format: ident + admin: + type: boolean + success: + type: boolean + message: + type: string + token: + description: | + The authentication token that should be used for + subsequent requests to secured endpoints. + type: string + validMs: + description: | + How long the token is valid in ms. + type: integer + format: int64 + VersionInfo: + description: | + Information about the software. + required: + - version + - builtAtMillis + - builtAtString + - gitCommit + - gitVersion + properties: + version: + type: string + builtAtMillis: + type: integer + format: int64 + builtAtString: + type: string + gitCommit: + type: string + gitVersion: + type: string + securitySchemes: + authTokenHeader: + type: apiKey + in: header + name: Sharry-Auth + aliasTokenHeader: + type: apiKey + in: header + name: Sharry-Alias + parameters: + aliasId: + name: aid + in: path + description: The alias identifier. + required: true + schema: + type: string + fid: + name: fid + in: path + description: A file identifier + required: true + schema: + type: string + id: + name: id + in: path + description: A share identifier + required: true + schema: + type: string + pid: + name: pid + in: path + description: A public share identifier + required: true + schema: + type: string + q: + name: q + in: query + description: A query string + required: false + schema: + type: string + SharryFileName: + name: Sharry-File-Name + in: header + required: false + schema: + type: string + SharryFileLength: + name: Sharry-File-Length + in: header + required: false + schema: + type: integer + format: int64 + SharryFileType: + name: Sharry-File-Type + in: header + required: false + schema: + type: string + UploadLength: + name: Upload-Length + in: header + required: true + schema: + type: integer + format: int64 + UploadOffset: + name: Upload-Offset + in: header + required: true + schema: + type: integer + format: int64 + SharryPassword: + name: Sharry-Password + in: header + required: false + schema: + type: string diff --git a/modules/restserver/src/main/resources/logback.xml b/modules/restserver/src/main/resources/logback.xml new file mode 100644 index 00000000..00bd9ea4 --- /dev/null +++ b/modules/restserver/src/main/resources/logback.xml @@ -0,0 +1,16 @@ + + + true + + + [%thread] %highlight(%-5level) %cyan(%logger{15}) - %msg %n + + + + + + + + + + diff --git a/modules/restserver/src/main/resources/reference.conf b/modules/restserver/src/main/resources/reference.conf new file mode 100644 index 00000000..c53c4a1a --- /dev/null +++ b/modules/restserver/src/main/resources/reference.conf @@ -0,0 +1,327 @@ +sharry.restserver { + + # This is the base URL this application is deployed to. This is used + # to create absolute URLs and to configure the cookie. + # + # Note: Currently deploying behind a path is not supported. The URL + # should not end in a slash. + base-url = "http://localhost:9090" + + + # Where the server binds to. + bind { + address = "localhost" + port = 9090 + } + + webapp { + # This is shown in the top right corner of the web application + app-name = "Sharry" + + # Chunk size used for one request. The server will re-chunk the + # stream into smaller chunks. But the client can transfer more in + # one requests, resulting in faster uploads. + # + # You might need to adjust this value depending on your setup. A + # higher value usually means faster uploads. + chunk-size = "100M" + + # Number of milliseconds the client should wait before doing a new + # upload attempt after something failed. The length of the array + # denotes the number of retries. + retry-delays = [0, 3000, 6000, 12000, 24000, 48000] + } + + backend { + + # Authentication is flexible to let Sharry be integrated in other + # environments. + auth { + + # The secret for this server that is used to sign the authenicator + # tokens. You can use base64 or hex strings (prefix with b64: and + # hex:, respectively) + server-secret = "hex:caffee" + + # How long an authentication token is valid. The web application + # will get a new one periodically. + session-valid = "5 minutes" + + #### Login Modules + ## + ## The following settings configure how users are authenticated. + ## There are several ways possible. The simplest is to + ## authenticate agains the internal database. But often there is + ## already a user management component and sharry can be + ## configured to authenticated against other services. + + # A fixed login module simply checks the username and password + # agains the information provided here. This only applies if the + # user matches, otherwise the next login module is tried. + fixed { + enabled = false + user = "admin" + password = "admin" + order = 10 + } + + # The http authentication module sends the username and password + # via a HTTP request and uses the response to indicate success or + # failure. + # + # If the method is POST, the `body' is sent with the request and + # the `content-type' is used. + http { + enabled = false + url = "http://localhost:1234/auth?user={{user}}&password={{pass}}" + method = "POST" + body = "" + content-type = "" + order = 20 + } + + # Use HTTP Basic authentication. Sharry first sends a request + # without credentials to obtain a 401 response from the server, + # which may include a charset to use. Then it constructs a + # Authorization header using the Basic scheme and tries again. + # The response body will be ignored, only the status is + # inspected. + http-basic { + enabled = false + url = "http://somehost:2345/path" + method = "GET" + order = 30 + } + + # The command authentication module runs an external command + # giving it the username and password. The return code indicates + # success or failure. + command { + enabled = false + program = [ + "/path/to/someprogram" + "{{user}}" + "{{pass}}" + ] + # the return code to consider successful verification + success = 0 + order = 40 + } + + # The internal authentication module checks against the internal + # database. + internal { + enabled = true + order = 50 + } + + # Uses OAuth2 "Code-Flow" for authentication against a + # configured provider. + # + # A provider (like Github or Google for example) must be + # configured correctly for this to work. Each element in the array + # results into a button on the login page. + # + # Examples for Github and Google are provided below. You need to + # setup an “application” to obtain a client_secret and clien_id. + # + # Details: + # - enabled: allows to toggle it on or off + # - id: a unique id that is part of the url + # - name: a name that is displayed inside the button on the + # login screen + # - icon: a semantic-ui icon name for the button + # - authorize-url: the url of the provider where the user can + # login and grant the permission to retrieve the user name + # - token-url: the url used to obtain a bearer token using the + # response from the authentication above. The response from + # the provider must be json or url-form-encdode. + # - user-url: the url to finalyy retrieve user information – + # only JSON responses are supported. + # - user-id-key: the name of the field in the json response + # denoting the user name + oauth = [ + { + enabled = false + id = "github" + name = "Github" + icon = "github" + authorize-url = "https://github.com/login/oauth/authorize" + token-url = "https://github.com/login/oauth/access_token" + user-url = "https://api.github.com/user" + user-id-key = "login" + client-id = "" + client-secret = "" + }, + { + enabled = false + id = "google" + name = "Google" + icon = "google" + authorize-url = "https://accounts.google.com/o/oauth2/v2/auth?scope=https://www.googleapis.com/auth/userinfo.profile" + token-url = "https://oauth2.googleapis.com/token" + user-url = "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" + user-id-key = "name" + client-id = "" + client-secret = "" + } + ] + } + + # The database connection. + # + # By default a H2 file-based database is configured. You can + # provide a postgresql or mariadb connection here. When using H2 + # use the PostgreSQL compatibility mode. + jdbc { + url = "jdbc:h2://"${java.io.tmpdir}"/sharry-demo.db;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE" + user = "sa" + password = "" + } + + # Configuration for registering new users at the local database. + # Accounts registered here are checked via the `internal' + # authentication plugin as described above. + signup { + + # The mode defines if new users can signup or not. It can have + # three values: + # + # - open: every new user can sign up + # - invite: new users can sign up only if they provide a correct + # invitation key. Invitation keys can be generated by an admin. + # - closed: signing up is disabled. + mode = "open" + + # If mode == 'invite', this is the period an invitation token is + # considered valid. + invite-time = "14 days" + + # A password that is required when generating invitation keys. + # This is more to protect against accidentally creating + # invitation keys. Generating such keys is only permitted to + # admin users. + invite-password = "generate-invite" + } + + + share { + # When storing binary data use chunks of this size. + chunk-size = "512K" + + # Maximum size of a share. + max-size = "1.5G" + + # Maximum validity for uploads + max-validity = 365 days + + # If true, user that received files from their alias pages are + # notified via email (if they have an email address in ther + # profile) + enable-upload-notification = true + } + + cleanup { + # Whether to enable the upload cleanup job that periodically + # removes invalid uploads + enabled = true + + # The interval for the cleanup job + interval = 14 days + + # Age of invalid uploads to get collected by cleanup job + invalid-age = 7 days + } + + mail { + + # Enable/Disable the mail feature. + # + # If it is disabled, the webapp will not show any related + # controls. Notifications are disabled, too. + # + # If enabled, explicit SMTP settings must be provided. + enabled = false + + # The SMTP settings that are used to sent mails with. + smtp { + # Host and port of the SMTP server + host = "localhost" + port = 25 + + # User credentials to authenticate at the server. If the user + # is empty, mails are sent without authentication. + user = "" + password = "" + + # One of: none, starttls, ssl + ssl-type = "starttls" + + # In case of self-signed certificates or other problems like + # that, checking certificates can be disabled. + check-certificates = true + + # Timeout for mail commands. + timeout = "10 seconds" + + # The default mail address used for the `From' field. + # + # If left empty, the e-mail address of the current user is used. + default-from = "" + + # When creating mails, the List-Id header is set to this value. + # + # This helps identifying these mails in muas. If it is empty, + # the header is not set. + list-id = "Sharry" + } + + templates = { + download = { + subject = "Download ready." + body = """Hello, + +there are some files for you to download. Visit this link: + +{{{url}}} + +{{#password}} +The required password will be sent by other means. +{{/password}} + + +Greetings, +{{user}} via Sharry +""" + } + + alias = { + subject = "Link for Upload" + body = """Hello, + +please use the following link to sent files to me: + +{{{url}}} + +Greetings, +{{user}} via Sharry +""" + } + + upload-notify = { + subject = "[Sharry] Files arrived" + body = """Hello {{user}}, + +there have been files uploaded for you via the alias '{{aliasName}}'. +View it here: + +{{{url}}} + +Greetings, +Sharry +""" + } + } + } + } +} \ No newline at end of file diff --git a/modules/restserver/src/main/scala/sharry/restserver/Config.scala b/modules/restserver/src/main/scala/sharry/restserver/Config.scala new file mode 100644 index 00000000..e7113848 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/Config.scala @@ -0,0 +1,19 @@ +package sharry.restserver + +import sharry.backend.{Config => BackendConfig} +import sharry.common._ + +case class Config( + baseUrl: LenientUri, + bind: Config.Bind, + webapp: Config.Webapp, + backend: BackendConfig +) + +object Config { + + case class Bind(address: String, port: Int) + + case class Webapp(appName: String, chunkSize: ByteSize, retryDelays: Seq[Duration]) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/ConfigFile.scala b/modules/restserver/src/main/scala/sharry/restserver/ConfigFile.scala new file mode 100644 index 00000000..189052c3 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/ConfigFile.scala @@ -0,0 +1,46 @@ +package sharry.restserver + +import cats.implicits._ +import sharry.common.pureconfig.Implicits._ +import sharry.common.SignupMode +import _root_.pureconfig._ +import _root_.pureconfig.generic.auto._ +import emil.MailAddress +import emil.javamail.syntax._ +import emil.SSLType +import yamusca.imports._ + +object ConfigFile { + import Implicits._ + + def loadConfig: Config = + ConfigSource.default.at("sharry.restserver").loadOrThrow[Config] + + object Implicits { + implicit val signupModeReader: ConfigReader[SignupMode] = + ConfigReader[String].emap(reason(SignupMode.fromString)) + + implicit val mailAddressReader: ConfigReader[Option[MailAddress]] = + ConfigReader[String].emap( + reason(s => if (s.trim.isEmpty) Right(None) else MailAddress.parse(s).map(m => Some(m))) + ) + + implicit val mailSslTypeReader: ConfigReader[SSLType] = + ConfigReader[String].emap( + reason( + s => + s.toLowerCase match { + case "none" => Right(SSLType.NoEncryption) + case "starttls" => Right(SSLType.StartTLS) + case "ssl" => Right(SSLType.SSL) + case _ => Left(s"Invalid ssl type '$s'. Use one of none, ssl or starttls.") + } + ) + ) + + implicit val templateReader: ConfigReader[Template] = + ConfigReader[String].emap( + reason(s => mustache.parse(s).leftMap(err => s"Error parsing template at ${err._1.pos}")) + ) + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/CookieData.scala b/modules/restserver/src/main/scala/sharry/restserver/CookieData.scala new file mode 100644 index 00000000..bc99309d --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/CookieData.scala @@ -0,0 +1,57 @@ +package sharry.restserver + +import org.http4s._ +import org.http4s.util._ +import sharry.backend.auth._ +import sharry.common.AccountId + +case class CookieData(auth: AuthToken) { + def accountId: AccountId = auth.account + def asString: String = auth.asString + + def asCookie(cfg: Config): ResponseCookie = { + val domain = cfg.baseUrl.host + val sec = cfg.baseUrl.scheme.exists(_.endsWith("s")) + val path = cfg.baseUrl.path / "api" / "v2" + ResponseCookie( + CookieData.cookieName, + asString, + domain = domain, + path = Some(path.asString), + httpOnly = true, + secure = sec + ) + } +} +object CookieData { + val cookieName = "sharry_auth" + val headerName = "Sharry-Auth" + + def authenticator[F[_]](r: Request[F]): Either[String, String] = + fromCookie(r).orElse(fromHeader(r)) + + def fromCookie[F[_]](req: Request[F]): Either[String, String] = + for { + header <- headers.Cookie.from(req.headers).toRight("Cookie parsing error") + cookie <- header.values.toList + .find(_.name == cookieName) + .toRight("Couldn't find the authcookie") + } yield cookie.content + + def fromHeader[F[_]](req: Request[F]): Either[String, String] = + req.headers + .get(CaseInsensitiveString(headerName)) + .map(_.value) + .toRight("Couldn't find an authenticator") + + def deleteCookie(cfg: Config): ResponseCookie = + ResponseCookie( + cookieName, + "", + domain = cfg.baseUrl.host, + path = Some(cfg.baseUrl.path / "api" / "v2").map(_.asString), + httpOnly = true, + secure = cfg.baseUrl.scheme.exists(_.endsWith("s")), + maxAge = Some(-1) + ) +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/Main.scala b/modules/restserver/src/main/scala/sharry/restserver/Main.scala new file mode 100644 index 00000000..e76c0c6f --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/Main.scala @@ -0,0 +1,66 @@ +package sharry.restserver + +import cats.effect._ +import cats.implicits._ + +import scala.concurrent.ExecutionContext +import java.util.concurrent.Executors +import java.nio.file.{Files, Paths} + +import org.log4s._ +import sharry.common._ +import sharry.store.migrate.MigrateFrom06 + +object Main extends IOApp { + private[this] val logger = getLogger + + val blockingEc: ExecutionContext = ExecutionContext.fromExecutor( + Executors.newCachedThreadPool(ThreadFactories.ofName("sharry-restserver-blocking")) + ) + val blocker = Blocker.liftExecutionContext(blockingEc) + val connectEC: ExecutionContext = ExecutionContext.fromExecutorService( + Executors.newFixedThreadPool(5, ThreadFactories.ofName("sharry-dbconnect")) + ) + + def run(args: List[String]) = { + args match { + case file :: Nil => + val path = Paths.get(file).toAbsolutePath.normalize + logger.info(s"Using given config file: $path") + System.setProperty("config.file", file) + case _ => + Option(System.getProperty("config.file")) match { + case Some(f) if f.nonEmpty => + val path = Paths.get(f).toAbsolutePath.normalize + if (!Files.exists(path)) { + logger.info(s"Not using config file '$f' because it doesn't exist") + System.clearProperty("config.file") + } else { + logger.info(s"Using config file from system properties: $f") + } + case _ => + } + } + + val cfg = ConfigFile.loadConfig + val banner = Banner( + BuildInfo.version, + BuildInfo.gitHeadCommit, + cfg.backend.jdbc.url, + Option(System.getProperty("config.file")), + cfg.baseUrl + ) + logger.info(s"\n${banner.render("***>")}") + if ("true" == System.getProperty("sharry.migrate-old-dbschema")) { + MigrateFrom06[IO](cfg.backend.jdbc, connectEC, blocker). + use(mig => mig.migrate). + as(ExitCode.Success) + } else { + RestServer + .stream[IO](cfg, ExecutionContext.global, connectEC, blocker) + .compile + .drain + .as(ExitCode.Success) + } + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/RestApp.scala b/modules/restserver/src/main/scala/sharry/restserver/RestApp.scala new file mode 100644 index 00000000..38e179b0 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/RestApp.scala @@ -0,0 +1,12 @@ +package sharry.restserver + +import sharry.backend.BackendApp + +trait RestApp[F[_]] { + + def config: Config + + def init: F[Unit] + + def backend: BackendApp[F] +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/RestAppImpl.scala b/modules/restserver/src/main/scala/sharry/restserver/RestAppImpl.scala new file mode 100644 index 00000000..cdf7bb45 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/RestAppImpl.scala @@ -0,0 +1,33 @@ +package sharry.restserver + +import cats.implicits._ +import cats.effect._ +import sharry.backend.BackendApp + +import scala.concurrent.ExecutionContext + +final class RestAppImpl[F[_]: Sync](val config: Config, val backend: BackendApp[F]) + extends RestApp[F] { + + def init: F[Unit] = + Sync[F].pure(()) + + def shutdown: F[Unit] = + ().pure[F] + +} + +object RestAppImpl { + + def create[F[_]: ConcurrentEffect: ContextShift: Timer]( + cfg: Config, + connectEC: ExecutionContext, + blocker: Blocker + ): Resource[F, RestApp[F]] = + for { + backend <- BackendApp(cfg.backend, connectEC, blocker) + app = new RestAppImpl[F](cfg, backend) + appR <- Resource.make(app.init.map(_ => app))(_.shutdown) + } yield appR + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/RestServer.scala b/modules/restserver/src/main/scala/sharry/restserver/RestServer.scala new file mode 100644 index 00000000..8cc87307 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/RestServer.scala @@ -0,0 +1,136 @@ +package sharry.restserver + +import cats.data.Kleisli +import cats.data.OptionT +import cats.effect._ +import cats.implicits._ +import fs2.Stream +import org.http4s.HttpRoutes +import org.http4s.Response +import org.http4s.client.Client +import org.http4s.client.blaze.BlazeClientBuilder +import org.http4s.implicits._ +import org.http4s.server.Router +import org.http4s.server.blaze.BlazeServerBuilder +import org.http4s.server.middleware.Logger +import org.log4s.getLogger +import scala.concurrent.ExecutionContext + +import sharry.common.syntax.all._ +import sharry.backend.auth.AuthToken +import sharry.restserver.routes._ +import sharry.restserver.webapp._ + +object RestServer { + private[this] val logger = getLogger + + def stream[F[_]: ConcurrentEffect]( + cfg: Config, + ec: ExecutionContext, + connectEC: ExecutionContext, + blocker: Blocker + )( + implicit T: Timer[F], + CS: ContextShift[F] + ): Stream[F, Nothing] = { + + val templates = TemplateRoutes[F](blocker, cfg) + val app = for { + restApp <- RestAppImpl.create[F](cfg, connectEC, blocker) + _ <- Resource.liftF(restApp.init) + client <- BlazeClientBuilder[F](ec).resource + + httpApp = Router( + "/api/v2/open/" -> openRoutes(cfg, client, restApp), + "/api/v2/sec/" -> Authenticate(restApp.backend.login, cfg.backend.auth) { token => + securedRoutes(cfg, restApp, token) + }, + "/api/v2/alias/" -> Authenticate.alias(restApp.backend.login, cfg.backend.auth) { token => + aliasRoutes[F](cfg, restApp, token) + }, + "/api/v2/admin/" -> Authenticate(restApp.backend.login, cfg.backend.auth) { token => + if (token.account.admin) adminRoutes(cfg, restApp, token) + else notFound[F](token) + }, + "/api/doc" -> templates.doc, + "/app/assets" -> WebjarRoutes.appRoutes[F](blocker, cfg), + "/app" -> templates.app + ).orNotFound + + // With Middlewares in place + finalHttpApp = Logger.httpApp(false, false)(httpApp) + + } yield finalHttpApp + + Stream + .resource(app) + .flatMap( + httpApp => + BlazeServerBuilder[F] + .bindHttp(cfg.bind.port, cfg.bind.address) + .withHttpApp(httpApp) + .withoutBanner + .serve + ) + + }.drain + + def aliasRoutes[F[_]: Effect](cfg: Config, restApp: RestApp[F], token: AuthToken): HttpRoutes[F] = + Router( + "upload" -> ShareUploadRoutes( + restApp.backend, + token, + cfg, + cfg.baseUrl / "api" / "v2" / "alias" / "upload" + ), + "mail" -> NotifyRoutes(restApp.backend, token, cfg) + ) + + def securedRoutes[F[_]: Effect]( + cfg: Config, + restApp: RestApp[F], + token: AuthToken + ): HttpRoutes[F] = + Router( + "auth" -> LoginRoutes.session(restApp.backend.login, cfg), + "settings" -> SettingRoutes(restApp.backend, token, cfg), + "alias" -> AliasRoutes(restApp.backend, token, cfg), + "share" -> ShareRoutes(restApp.backend, token, cfg), + "upload" -> ShareUploadRoutes( + restApp.backend, + token, + cfg, + cfg.baseUrl / "api" / "v2" / "sec" / "upload" + ), + "mail" -> MailRoutes(restApp.backend, token, cfg) + ) + + def adminRoutes[F[_]: Effect](cfg: Config, restApp: RestApp[F], token: AuthToken): HttpRoutes[F] = + Router( + "signup" -> RegisterRoutes(restApp.backend, cfg).genInvite, + "account" -> AccountRoutes(restApp.backend, cfg) + ) + + def openRoutes[F[_]: ConcurrentEffect]( + cfg: Config, + client: Client[F], + restApp: RestApp[F] + ): HttpRoutes[F] = + Router( + "info" -> InfoRoutes(cfg), + "auth" -> LoginRoutes.login(restApp.backend, client, cfg), + "signup" -> RegisterRoutes(restApp.backend, cfg).signup, + "share" -> OpenShareRoutes(restApp.backend, cfg) + ) + + def notFound[F[_]: Effect](token: AuthToken): HttpRoutes[F] = + Kleisli( + req => + OptionT.liftF( + logger + .finfo[F](s"Non-admin '${token.account}' calling admin routes") + .map(_ => Response.notFound[F]) + ) + ) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/oauth/CodeFlow.scala b/modules/restserver/src/main/scala/sharry/restserver/oauth/CodeFlow.scala new file mode 100644 index 00000000..54de241b --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/oauth/CodeFlow.scala @@ -0,0 +1,124 @@ +package sharry.restserver.oauth + +import cats.data.OptionT +import cats.effect.ConcurrentEffect +import cats.implicits._ +import org.http4s._ +import org.http4s.Method._ +import org.http4s.client.Client +import org.http4s.client.dsl.Http4sClientDsl +import org.http4s.client.middleware.RequestLogger +import org.http4s.headers.Accept +import org.http4s.headers.Authorization +import org.http4s.circe.CirceEntityCodec._ +import org.log4s.getLogger + +import sharry.common.syntax.all._ +import sharry.backend.auth.AuthConfig +import io.circe.Json +import org.http4s.client.middleware.ResponseLogger +import sharry.common.Ident + +object CodeFlow { + private[this] val logger = getLogger + + def apply[F[_]: ConcurrentEffect]( + client: Client[F] + )(cfg: AuthConfig.OAuth, redirectUri: String, code: String): OptionT[F, Ident] = { + + val dsl = new Http4sClientDsl[F] {} + val c = logRequests[F](logResponses[F](client)) + + for { + _ <- OptionT.liftF( + logger.fdebug[F](s"Obtaining access_token for provider ${cfg.id.id} and code $code") + ) + token <- codeToToken[F](c, dsl, cfg, redirectUri, code) + _ <- OptionT.liftF( + logger.fdebug[F](s"Obtaining user-info for provider ${cfg.id.id} and token $token") + ) + user <- tokenToUser[F](c, dsl, cfg, token) + } yield user + } + + private def codeToToken[F[_]: ConcurrentEffect]( + c: Client[F], + dsl: Http4sClientDsl[F], + cfg: AuthConfig.OAuth, + redirectUri: String, + code: String + ): OptionT[F, String] = { + import dsl._ + + val req = POST( + UrlForm( + "client_id" -> cfg.clientId, + "client_secret" -> cfg.clientSecret, + "code" -> code, + "grant_type" -> "authorization_code", + "redirect_uri" -> redirectUri + ), + Uri.unsafeFromString(cfg.tokenUrl.asString) + ) + + OptionT(c.fetch(req) { + case Status.Successful(r) => + val u1 = r.as[UrlForm].map(_.getFirst("access_token")) + val u2 = r.as[Json].map(_.asObject.flatMap(_.apply("access_token")).flatMap(_.asString)) + u1.recoverWith(_ => u2).flatTap(at => logger.finfo(s"Got token: $at")) + case r => + logger + .ferror[F](s"Error obtaining access token '${r.status.code}' / ${r.as[String]}") + .map(_ => None) + }) + } + + private def tokenToUser[F[_]: ConcurrentEffect]( + c: Client[F], + dsl: Http4sClientDsl[F], + cfg: AuthConfig.OAuth, + token: String + ): OptionT[F, Ident] = { + import dsl._ + + val req = GET( + Uri.unsafeFromString(cfg.userUrl.asString), + Authorization(Credentials.Token(AuthScheme.Bearer, token)), + Accept(MediaType.application.json) + ) + + val resp: F[Option[Ident]] = c.fetch(req) { + case Status.Successful(r) => + r.as[Json] + .flatTap(j => logger.ftrace(s"user structure: ${j.noSpaces}")) + .map(j => j.findAllByKey(cfg.userIdKey).find(_.isString).flatMap(_.asString)) + .map(_.map(normalizeUid)) + .flatTap(uid => logger.finfo(s"Got user id: $uid")) + case r => + r.as[String] + .flatMap(err => logger.ferror(s"Cannot obtain user info: ${r.status.code} / ${err}")) + .map(_ => None) + + } + + OptionT(resp) + } + + private def normalizeUid(uid: String): Ident = + Ident.unsafe(uid.filter(Ident.chars.contains)) + + private def logRequests[F[_]: ConcurrentEffect](c: Client[F]): Client[F] = + RequestLogger( + logHeaders = true, + logBody = true, + logAction = Some((msg: String) => logger.ftrace[F](msg)) + )(c) + + private def logResponses[F[_]: ConcurrentEffect](c: Client[F]): Client[F] = + ResponseLogger( + logHeaders = true, + logBody = true, + logAction = Some((msg: String) => logger.ftrace[F](msg)) + )(c) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/AccountRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/AccountRoutes.scala new file mode 100644 index 00000000..067638cf --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/AccountRoutes.scala @@ -0,0 +1,84 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s._ + +import sharry.backend.BackendApp +import sharry.restapi.model._ +import sharry.restserver.Config +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.records.ModAccount +import cats.data.OptionT +import sharry.backend.account.{NewAccount, AccountItem} + +object AccountRoutes { + private[this] val logger = getLogger + + def apply[F[_]: Effect](backend: BackendApp[F], cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + val r1 = HttpRoutes[F]({ + case GET -> Root / Ident(id) => + for { + _ <- OptionT.liftF(logger.fdebug(s"Loading accout $id")) + acc <- OptionT(backend.account.findDetailById(id)) + resp <- OptionT.liftF(Ok(accountDetail(acc))) + } yield resp + }) + val r2 = HttpRoutes.of[F] { + case req @ POST -> Root / Ident(id) => + for { + in <- req.as[AccountModify] + res <- backend.account.modify(id, ModAccount(in.state, in.admin, in.email, in.password)) + resp <- Ok(Conv.basicResult(res, "Account successfully modified.")) + } yield resp + + case req @ GET -> Root => + val q = req.params.getOrElse("q", "") + for { + _ <- logger.ftrace(s"Listing accounts: $q") + all <- backend.account.findAccounts(q).take(100).compile.toVector + list = AccountList(all.map(accountDetail).toList) + resp <- Ok(list) + } yield resp + + case req @ POST -> Root => + for { + in <- req.as[AccountCreate] + acc <- NewAccount.create( + in.login, + AccountSource.Intern, + in.state, + in.password, + in.email, + in.admin + ) + res <- backend.account.create(acc) + resp <- Ok(Conv.basicResult(res, "Account successfully created.")) + } yield resp + } + r2 <+> r1 + } + + def accountDetail(a: AccountItem): AccountDetail = + AccountDetail( + a.acc.id, + a.acc.login, + a.acc.source, + a.acc.state, + a.acc.admin, + a.acc.email, + a.acc.loginCount, + a.shares, + a.acc.lastLogin, + a.acc.created + ) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/AliasRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/AliasRoutes.scala new file mode 100644 index 00000000..7518af9f --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/AliasRoutes.scala @@ -0,0 +1,79 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s.getLogger + +import sharry.backend.BackendApp +import sharry.backend.auth.AuthToken +import sharry.restapi.model._ +import sharry.restserver.Config +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.records.RAlias +import cats.data.OptionT + +object AliasRoutes { + private[this] val logger = getLogger + + def apply[F[_]: Effect](backend: BackendApp[F], token: AuthToken, cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of { + case req @ POST -> Root => + for { + in <- req.as[AliasChange] + _ <- logger.fdebug(s"Create new alias for ${token.account}") + na <- RAlias.createNew[F](token.account.id, in.name, in.validity, in.enabled) + res <- backend.alias.create(na) + resp <- Ok(convert(Conv.basicResult(res, "Alias successfully created."), na.id)) + } yield resp + + case req @ GET -> Root => + val q = req.params.getOrElse("q", "") + for { + _ <- logger.ftrace(s"Listing aliases for ${token.account}") + list <- backend.alias.findAll(token.account.id, q).take(100).compile.toVector + resp <- Ok(AliasList(list.map(convert).toList)) + } yield resp + + case req @ POST -> Root / Ident(id) => + for { + in <- req.as[AliasChange] + _ <- logger.fdebug(s"Change alias $id to $in") + na <- RAlias.createNew[F](token.account.id, in.name, in.validity, in.enabled) + res <- backend.alias.modify(id, token.account.id, na.copy(id = in.id.getOrElse(na.id))) + resp <- Ok( + convert( + Conv.basicResult(res, "Alias successfully modified."), + in.id.getOrElse(na.id) + ) + ) + } yield resp + + case GET -> Root / Ident(id) => + val opt = for { + adb <- OptionT(backend.alias.findById(id, token.account.id)) + resp <- OptionT.liftF(Ok(convert(adb))) + } yield resp + opt.getOrElseF(NotFound()) + + case DELETE -> Root / Ident(id) => + for { + res <- backend.alias.delete(id, token.account.id) + resp <- Ok(BasicResult(res, if (res) "Alias deleted." else "Alias not found")) + } yield resp + } + } + + def convert(r: RAlias): AliasDetail = + AliasDetail(r.id, r.name, r.validity, r.enabled, r.created) + + def convert(br: BasicResult, aliasId: Ident): IdResult = + IdResult(br.success, br.message, aliasId) +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/Authenticate.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/Authenticate.scala new file mode 100644 index 00000000..049af8df --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/Authenticate.scala @@ -0,0 +1,82 @@ +package sharry.restserver.routes + +import cats.data._ +import cats.effect._ +import cats.implicits._ +import sharry.backend.auth._ +import sharry.restserver._ +import org.http4s._ +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.dsl.Http4sDsl +import org.http4s.server._ +import org.http4s.syntax.string._ + +object Authenticate { + + def authenticateRequest[F[_]: Effect]( + auth: String => F[LoginResult] + )(req: Request[F]): F[LoginResult] = + CookieData.authenticator(req) match { + case Right(str) => auth(str) + case Left(_) => LoginResult.invalidAuth.pure[F] + } + + def of[F[_]: Effect](S: Login[F], cfg: AuthConfig)( + pf: PartialFunction[AuthedRequest[F, AuthToken], F[Response[F]]] + ): HttpRoutes[F] = { + val dsl: Http4sDsl[F] = new Http4sDsl[F] {} + val middleware = createAuthMiddleware(dsl, S, cfg) + + middleware(AuthedRoutes.of(pf)) + } + + def apply[F[_]: Effect](S: Login[F], cfg: AuthConfig)( + f: AuthToken => HttpRoutes[F] + ): HttpRoutes[F] = { + val dsl: Http4sDsl[F] = new Http4sDsl[F] {} + val middleware = createAuthMiddleware(dsl, S, cfg) + + middleware(AuthedRoutes(authReq => f(authReq.context).run(authReq.req))) + } + + def alias[F[_]: Effect](S: Login[F], cfg: AuthConfig)( + f: AuthToken => HttpRoutes[F] + ): HttpRoutes[F] = { + val dsl: Http4sDsl[F] = new Http4sDsl[F] {} + import dsl._ + + def aliasId(req: Request[F]): String = + req.headers.get("sharry-alias".ci).map(_.value).getOrElse("") + + val authUser: Kleisli[F, Request[F], Either[String, AuthToken]] = + Kleisli(r => S.loginAlias(cfg)(aliasId(r)).map(_.toEither)) + + val onFailure: AuthedRoutes[String, F] = + Kleisli(req => OptionT.liftF(Forbidden(req.context))) + + val middleware = AuthMiddleware(authUser, onFailure) + + middleware(AuthedRoutes(authReq => f(authReq.context).run(authReq.req))) + } + + private def getUser[F[_]: Effect]( + auth: String => F[LoginResult] + ): Kleisli[F, Request[F], Either[String, AuthToken]] = + Kleisli(r => authenticateRequest(auth)(r).map(_.toEither)) + + private def createAuthMiddleware[F[_]: Effect]( + dsl: Http4sDsl[F], + S: Login[F], + cfg: AuthConfig + ): AuthMiddleware[F, AuthToken] = { + val dsl: Http4sDsl[F] = new Http4sDsl[F] {} + import dsl._ + + val authUser = getUser[F](S.loginSession(cfg)) + + val onFailure: AuthedRoutes[String, F] = + Kleisli(req => OptionT.liftF(Forbidden(req.context))) + + AuthMiddleware(authUser, onFailure) + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/ByteResponse.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/ByteResponse.scala new file mode 100644 index 00000000..ec776b36 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/ByteResponse.scala @@ -0,0 +1,140 @@ +package sharry.restserver.routes + +import cats.data.OptionT +import cats.implicits._ +import org.http4s._ +import org.http4s.headers._ +import org.http4s.dsl.Http4sDsl +import bitpeace.FileMeta +import sharry.common._ +import sharry.backend.share._ +import sharry.backend.BackendApp +import bitpeace.RangeDef +import cats.data.Ior +import cats.effect.Sync + +object ByteResponse { + + def apply[F[_]: Sync]( + dsl: Http4sDsl[F], + req: Request[F], + backend: BackendApp[F], + shareId: ShareId, + pass: Option[Password], + fid: Ident + ) = + req.headers + .get(Range) + .map(_.ranges.head) + .map(sr => range(dsl, sr, req, backend, shareId, pass, fid)) + .getOrElse(all(dsl, req, backend, shareId, pass, fid)) + + def range[F[_]: Sync]( + dsl: Http4sDsl[F], + sr: Range.SubRange, + req: Request[F], + backend: BackendApp[F], + shareId: ShareId, + pass: Option[Password], + fid: Ident + ): F[Response[F]] = { + import dsl._ + + val rangeDef = sr.second + .map(until => RangeDef.byteRange(Ior.both(sr.first.toInt, until.toInt))) + .getOrElse { + if (sr.first == 0) RangeDef.all + else RangeDef.byteRange(Ior.left(sr.first.toInt)) + } + + (for { + file <- backend.share.loadFile(shareId, fid, pass, rangeDef) + resp <- OptionT.liftF { + if (rangeInvalid(file.fileMeta, sr)) RangeNotSatisfiable() + else partialResponse(dsl, file, sr) + } + } yield resp).getOrElseF(NotFound()) + } + + def all[F[_]: Sync]( + dsl: Http4sDsl[F], + req: Request[F], + backend: BackendApp[F], + shareId: ShareId, + pass: Option[Password], + fid: Ident + ): F[Response[F]] = { + import dsl._ + + (for { + file <- backend.share.loadFile(shareId, fid, pass, RangeDef.all) + resp <- OptionT.liftF( + etag(dsl, req, file).getOrElseF( + Ok(file.data).map( + _.withHeaders( + `Content-Type`(mediaType(file)), + `Accept-Ranges`.bytes, + `Last-Modified`(timestamp(file)), + `Content-Disposition`("inline", fileNameMap(file)), + ETag(file.fileMeta.checksum), + `Content-Length`.unsafeFromLong(file.fileMeta.length) + ) + ) + ) + ) + } yield resp).getOrElseF(NotFound()) + } + + private def etag[F[_]: Sync]( + dsl: Http4sDsl[F], + req: Request[F], + file: FileRange[F] + ): OptionT[F, Response[F]] = { + import dsl._ + + val noneMatch = req.headers.get(`If-None-Match`).flatMap(_.tags).map(_.head.tag) + + if (Some(file.fileMeta.checksum) == noneMatch) OptionT.liftF(NotModified()) + else OptionT.none + } + + private def partialResponse[F[_]: Sync]( + dsl: Http4sDsl[F], + file: FileRange[F], + range: Range.SubRange + ): F[Response[F]] = { + import dsl._ + val len = file.fileMeta.length + PartialContent(file.data).map( + _.withHeaders( + `Accept-Ranges`.bytes, + `Content-Type`(mediaType(file)), + `Last-Modified`(timestamp(file)), + `Content-Disposition`("inline", fileNameMap(file)), + `Content-Length` + .unsafeFromLong(range.second.getOrElse(len) - range.first), + `Content-Range`(RangeUnit.Bytes, subRangeResp(range, len), Some(len)) + ) + ) + } + + private def subRangeResp(in: Range.SubRange, length: Long): Range.SubRange = + in match { + case Range.SubRange(n, None) => + Range.SubRange(n.toLong, Some(length - 1)) + case Range.SubRange(n, Some(t)) => + Range.SubRange(n, Some(t)) + } + + private def rangeInvalid(file: FileMeta, range: Range.SubRange): Boolean = + range.first < 0 || range.second.exists(t => t < range.first || t > file.length) + + private def mediaType[F[_]](file: FileRange[F]) = + MediaType.unsafeParse(file.fileMeta.mimetype.asString) + + private def timestamp[F[_]](file: FileRange[F]) = + HttpDate.unsafeFromInstant(file.fileMeta.timestamp) + + private def fileNameMap[F[_]](file: FileRange[F]) = + file.shareFile.filename.map(n => Map("filename" -> n)).getOrElse(Map.empty) +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/Conv.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/Conv.scala new file mode 100644 index 00000000..6e89d010 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/Conv.scala @@ -0,0 +1,46 @@ +package sharry.restserver.routes + +import sharry.common.Ident +import sharry.store.AddResult +import sharry.restapi.model.BasicResult +import sharry.restapi.model.IdResult +import sharry.backend.share.UploadResult + +object Conv { + + def basicResult(ar: AddResult, successMsg: String): BasicResult = + ar match { + case AddResult.Success => + BasicResult(true, successMsg) + case AddResult.EntityExists(msg) => + BasicResult(false, msg) + case AddResult.Failure(ex) => + BasicResult(false, ex.getMessage) + } + + def idResult(successMsg: String)(ar: Either[Throwable, Ident]): IdResult = + ar match { + case Right(id) => IdResult(true, successMsg, id) + case Left(ex) => IdResult(false, s"${ex.getClass}: ${ex.getMessage}", Ident.empty) + } + + def uploadResult(successMsg: String)(ur: UploadResult[Ident]): IdResult = + ur match { + case UploadResult.Success(id) => + IdResult(true, successMsg, id) + case UploadResult.ValidityExceeded(max) => + IdResult(false, s"Maximum validity ($max) exceeded", Ident.empty) + case UploadResult.SizeExceeded(max) => + IdResult(false, s"Maximum size ($max) exceeded", Ident.empty) + } + + def uploadBasicResult[A](successMsg: String)(ur: UploadResult[A]): BasicResult = + ur match { + case UploadResult.Success(_) => + BasicResult(true, successMsg) + case UploadResult.ValidityExceeded(max) => + BasicResult(false, s"Maximum validity ($max) exceeded") + case UploadResult.SizeExceeded(max) => + BasicResult(false, s"Maximum size ($max) exceeded") + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/InfoRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/InfoRoutes.scala new file mode 100644 index 00000000..e7f98a9e --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/InfoRoutes.scala @@ -0,0 +1,47 @@ +package sharry.restserver.routes + +import cats.effect._ +import org.http4s._ +import org.http4s.HttpRoutes +import org.http4s.dsl.Http4sDsl +import org.http4s.circe.CirceEntityEncoder._ + +import sharry.restapi.model._ +import sharry.restserver.{BuildInfo, Config} + +object InfoRoutes { + + def apply[F[_]: Sync](cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + HttpRoutes.of[F] { + case GET -> Root / "version" => + Ok( + VersionInfo( + BuildInfo.version, + BuildInfo.builtAtMillis, + BuildInfo.builtAtString, + BuildInfo.gitHeadCommit.getOrElse(""), + BuildInfo.gitDescribedVersion.getOrElse("") + ) + ) + case GET -> Root / "appconfig" => + Ok(appConfig(cfg)) + } + } + + def appConfig(cfg: Config): AppConfig = + AppConfig( + cfg.webapp.appName, + cfg.baseUrl, + s"/app/assets/sharry-webapp/${BuildInfo.version}", + cfg.backend.signup.mode, + cfg.backend.auth.oauth.filter(_.enabled).map(oa => OAuthItem(oa.id, oa.name, oa.icon)).toList, + cfg.webapp.chunkSize.bytes, + cfg.webapp.retryDelays.map(_.millis).toList, + cfg.backend.share.maxValidity, + cfg.backend.share.maxSize, + cfg.backend.mail.enabled + ) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/LoginRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/LoginRoutes.scala new file mode 100644 index 00000000..73e9160e --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/LoginRoutes.scala @@ -0,0 +1,138 @@ +package sharry.restserver.routes + +import cats.data.OptionT +import cats.effect._ +import cats.implicits._ +import org.http4s._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.dsl.Http4sDsl +import org.http4s.headers.Location +import org.log4s._ + +import sharry.backend.BackendApp +import sharry.backend.account.NewAccount +import sharry.backend.auth._ +import sharry.common._ +import sharry.restapi.model._ +import sharry.restserver._ +import sharry.restserver.oauth.CodeFlow +import org.http4s.client.Client + +object LoginRoutes { + private[this] val logger = getLogger + + def login[F[_]: ConcurrentEffect]( + S: BackendApp[F], + client: Client[F], + cfg: Config + ): HttpRoutes[F] = { + val dsl: Http4sDsl[F] = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of[F] { + case req @ POST -> Root / "login" => + for { + up <- req.as[UserPass] + res <- S.login.loginUserPass(cfg.backend.auth)( + UserPassData(up.account, Password(up.password)) + ) + resp <- makeResponse(dsl, cfg, res) + } yield resp + + case req @ GET -> Root / "oauth" / id => + findOAuthProvider(cfg, id) match { + case Some(p) => + val uri = p.authorizeUrl + .withQuery("client_id", p.clientId) + .withQuery( + "redirect_uri", + redirectUri(cfg, p).asString + ) + .withQuery("response_type", "code") + logger.debug(s"Redirecting to OAuth provider ${p.id.id}: ${uri.asString}") + SeeOther().map(_.withHeaders(Location(Uri.unsafeFromString(uri.asString)))) + case None => + logger.debug(s"No oauth provider found with id '$id'") + BadRequest() + } + + case req @ GET -> Root / "oauth" / id / "resume" => + val prov = OptionT.fromOption[F](findOAuthProvider(cfg, id)) + val code = OptionT.fromOption[F](req.params.get("code")) + + val userId = for { + p <- prov + c <- code + u <- CodeFlow(client)(p, redirectUri(cfg, p).asString, c) + acc <- OptionT.liftF( + NewAccount.create(u ++ Ident.atSign ++ p.id, AccountSource.OAuth(p.id.id)) + ) + id <- OptionT.liftF(S.account.createIfMissing(acc)) + accId = AccountId(id, acc.login, false, None) + _ <- OptionT.liftF(S.account.updateLoginStats(accId)) + token <- OptionT.liftF( + AuthToken.user[F](accId, cfg.backend.auth.serverSecret) + ) + } yield token + + val uri = cfg.baseUrl.withQuery("oauth", "1") / "app" / "login" + val location = Location(Uri.unsafeFromString(uri.asString)) + userId.value.flatMap { + case Some(t) => + TemporaryRedirect(location) + .map(_.addCookie(CookieData(t).asCookie(cfg))) + case None => TemporaryRedirect(location) + } + } + } + + private def redirectUri(cfg: Config, prov: AuthConfig.OAuth): LenientUri = + cfg.baseUrl / "api" / "v2" / "open" / "auth" / "oauth" / prov.id.id / "resume" + + private def findOAuthProvider(cfg: Config, id: String): Option[AuthConfig.OAuth] = + cfg.backend.auth.oauth.filter(_.enabled).find(_.id.id == id) + + def session[F[_]: Effect](S: Login[F], cfg: Config): HttpRoutes[F] = { + val dsl: Http4sDsl[F] = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of[F] { + case req @ POST -> Root / "session" => + Authenticate + .authenticateRequest(S.loginSession(cfg.backend.auth))(req) + .flatMap(res => makeResponse(dsl, cfg, res)) + + case POST -> Root / "logout" => + Ok().map(_.addCookie(CookieData.deleteCookie(cfg))) + } + } + + def makeResponse[F[_]: Effect]( + dsl: Http4sDsl[F], + cfg: Config, + res: LoginResult + ): F[Response[F]] = { + import dsl._ + res match { + case LoginResult.Ok(token) => + for { + cd <- AuthToken.user(token.account, cfg.backend.auth.serverSecret).map(CookieData.apply) + resp <- Ok( + AuthResult( + token.account.id, + token.account.userLogin, + token.account.admin, + true, + "Login successful", + Some(cd.asString), + cfg.backend.auth.sessionValid.millis + ) + ).map(_.addCookie(cd.asCookie(cfg))) + } yield resp + case _ => + Ok(AuthResult(Ident.empty, Ident.empty, false, false, "Login failed.", None, 0L)) + } + } + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/MailRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/MailRoutes.scala new file mode 100644 index 00000000..ee883d0f --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/MailRoutes.scala @@ -0,0 +1,84 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import cats.data.EitherT +import cats.data.OptionT +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s.getLogger + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.auth.AuthToken +import sharry.backend.BackendApp +import sharry.backend.mail.{MailData, MailSendResult} +import sharry.restserver.Config +import sharry.restapi.model.BasicResult +import sharry.restapi.model.MailTemplate +import sharry.restapi.model.SimpleMail +import emil.MailAddress +import emil.javamail.syntax._ + +object MailRoutes { + + private[this] val logger = getLogger + + def apply[F[_]: Effect](backend: BackendApp[F], token: AuthToken, cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + val baseurl = cfg.baseUrl / "app" + HttpRoutes.of { + case GET -> Root / "template" / "alias" / Ident(id) => + for { + md <- backend.mail.getAliasTemplate(token.account, id, baseurl / "share") + resp <- Ok(MailTemplate(md.subject, md.body)) + } yield resp + + case GET -> Root / "template" / "share" / Ident(id) => + (for { + md <- backend.mail.getShareTemplate(token.account, id, baseurl / "open") + resp <- OptionT.liftF(Ok(MailTemplate(md.subject, md.body))) + } yield resp).getOrElseF(NotFound()) + + case req @ POST -> Root / "send" => + def parseAddress(m: SimpleMail): Either[String, List[MailAddress]] = + m.recipients.traverse(MailAddress.parse) + + def send(rec: List[MailAddress], sm: SimpleMail): F[MailSendResult] = + backend.mail + .sendMail(token.account, rec, MailData(sm.subject, sm.body)) + + val res = for { + mail <- EitherT.liftF(req.as[SimpleMail]) + rec <- EitherT.fromEither[F](parseAddress(mail)) + res <- EitherT.liftF[F, String, MailSendResult](send(rec, mail)) + _ <- EitherT.liftF[F, String, Unit](logger.fdebug(s"Sending mail: $res")) + } yield res + + res.foldF( + err => Ok(BasicResult(false, s"Some recipient addresses are invalid: $err")), + r => Ok(mailSendResult(r)) + ) + } + } + + private def mailSendResult(mr: MailSendResult): BasicResult = + mr match { + case MailSendResult.Success => BasicResult(true, "Mail successfully sent.") + case MailSendResult.SendFailure(ex) => + BasicResult(false, s"Mail sending failed: ${ex.getMessage}") + case MailSendResult.NoRecipients => BasicResult(false, "There are no recipients") + case MailSendResult.NoSender => + BasicResult( + false, + "There are no sender addresses specified. You " + + "may need to add an e-mail address to your account." + ) + case MailSendResult.FeatureDisabled => + BasicResult(false, "The mail feature is disabled") + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/NotifyRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/NotifyRoutes.scala new file mode 100644 index 00000000..56327681 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/NotifyRoutes.scala @@ -0,0 +1,60 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s.getLogger + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.auth.AuthToken +import sharry.backend.mail.NotifyResult +import sharry.backend.BackendApp +import sharry.restserver.Config +import sharry.restapi.model.BasicResult + +object NotifyRoutes { + + private[this] val logger = getLogger + + def apply[F[_]: Effect](backend: BackendApp[F], token: AuthToken, cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of { + case req @ POST -> Root / "notify" / Ident(id) => + token.account.alias match { + case Some(alias) => + val baseurl = cfg.baseUrl / "app" / "upload" + for { + _ <- logger.fdebug("Notify about alias upload") + res <- backend.mail.notifyAliasUpload(alias, id, baseurl) + resp <- Ok(basicResult(res)) + } yield resp + + case None => + NotFound() + } + } + } + + private def basicResult(n: NotifyResult): BasicResult = n match { + case NotifyResult.InvalidAlias => + BasicResult(false, "Invalid alias") + + case NotifyResult.FeatureDisabled => + BasicResult(false, "Mail feature is disabled.") + + case NotifyResult.MissingEmail => + BasicResult(false, "There is no e-mail address.") + + case NotifyResult.SendFailed(err) => + BasicResult(false, s"Sending failed: $err.") + + case NotifyResult.SendSuccessful => + BasicResult(true, s"Mail sent.") + } + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/OpenShareRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/OpenShareRoutes.scala new file mode 100644 index 00000000..00e02eeb --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/OpenShareRoutes.scala @@ -0,0 +1,31 @@ +package sharry.restserver.routes + +import cats.effect._ +import org.http4s._ +import org.http4s.dsl.Http4sDsl + +import sharry.common._ +import sharry.backend.BackendApp +import sharry.restserver.Config +import sharry.backend.share._ +import sharry.restserver.routes.headers.SharryPassword + +object OpenShareRoutes { + + def apply[F[_]: Effect](backend: BackendApp[F], cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of[F] { + case req @ GET -> Root / Ident(id) => + val pw = SharryPassword(req) + ShareDetailResponse(dsl, backend, cfg, ShareId.publish(id), pw) + + case req @ GET -> Root / Ident(id) / file / Ident(fid) => + val pw = SharryPassword(req) + ByteResponse(dsl, req, backend, ShareId.publish(id), pw, fid) + + } + } + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/RegisterRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/RegisterRoutes.scala new file mode 100644 index 00000000..a295865a --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/RegisterRoutes.scala @@ -0,0 +1,76 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s._ + +import sharry.backend.BackendApp +import sharry.backend.signup.{NewInviteResult, SignupResult} +import sharry.backend.signup.OSignup.RegisterData +import sharry.restapi.model._ +import sharry.restserver.Config + +object RegisterRoutes { + private[this] val logger = getLogger + + trait InternRoutes[F[_]] { + def signup: HttpRoutes[F] + def genInvite: HttpRoutes[F] + } + + def apply[F[_]: Effect](backend: BackendApp[F], cfg: Config): InternRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + new InternRoutes[F] { + def signup = + HttpRoutes.of { + case req @ POST -> Root / "register" => + for { + data <- req.as[Registration] + res <- backend.signup.register(cfg.backend.signup)(convert(data)) + resp <- Ok(convert(res)) + } yield resp + } + def genInvite = + HttpRoutes.of { + case req @ POST -> Root / "newinvite" => + for { + data <- req.as[GenInvite] + res <- backend.signup.newInvite(cfg.backend.signup)(data.password) + resp <- Ok(convert(res)) + } yield resp + } + } + } + + def convert(r: NewInviteResult): InviteResult = r match { + case NewInviteResult.Success(id) => + InviteResult(true, "New invitation created.", Some(id)) + case NewInviteResult.InvitationDisabled => + InviteResult(false, "Signing up is not enabled for invitations.", None) + case NewInviteResult.PasswordMismatch => + InviteResult(false, "Password is invalid.", None) + } + + def convert(r: SignupResult): BasicResult = r match { + case SignupResult.AccountExists => + BasicResult(false, "An account with this name already exists.") + case SignupResult.InvalidInvitationKey => + BasicResult(false, "Invalid invitation key.") + case SignupResult.SignupClosed => + BasicResult(false, "Sorry, registration is closed.") + case SignupResult.Failure(ex) => + logger.error(ex)("Error signing up") + BasicResult(false, s"Internal error: ${ex.getMessage}") + case SignupResult.Success => + BasicResult(true, "Signup successful") + } + + def convert(r: Registration): RegisterData = + RegisterData(r.login, r.password, r.invite) +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/SettingRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/SettingRoutes.scala new file mode 100644 index 00000000..026cbb5b --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/SettingRoutes.scala @@ -0,0 +1,56 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s.getLogger + +import sharry.backend.BackendApp +import sharry.backend.auth.AuthToken +import sharry.restapi.model._ +import sharry.restserver.Config +import sharry.common.syntax.all._ + +object SettingRoutes { + private[this] val logger = getLogger + + def apply[F[_]: Effect](backend: BackendApp[F], token: AuthToken, cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of { + case req @ POST -> Root / "email" => + for { + in <- req.as[EmailChange] + _ <- logger.fdebug(s"Changing email for ${token.account} to $in") + res <- backend.account.setEmail(token.account.id, in.email.some) + resp <- Ok(Conv.basicResult(res, "E-Mail successfully changed.")) + } yield resp + + case DELETE -> Root / "email" => + for { + _ <- logger.fdebug(s"Delete email for ${token.account}") + res <- backend.account.setEmail(token.account.id, None) + resp <- Ok(Conv.basicResult(res, "E-Mail successfully deleted.")) + } yield resp + + case GET -> Root / "email" => + for { + acc <- backend.account.findById(token.account.id) + email = acc.flatMap(_.email) + resp <- Ok(EmailInfo(email)) + } yield resp + + case req @ POST -> Root / "password" => + for { + in <- req.as[PasswordChange] + _ <- logger.fdebug(s"Changing password for ${token.account}") + res <- backend.account.changePassword(token.account.id, in.oldPassword, in.newPassword) + resp <- Ok(Conv.basicResult(res, "Password successfully changed.")) + } yield resp + } + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/ShareDetailResponse.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/ShareDetailResponse.scala new file mode 100644 index 00000000..4238aa2b --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/ShareDetailResponse.scala @@ -0,0 +1,74 @@ +package sharry.restserver.routes + +import cats.data.OptionT +import org.http4s._ +import org.http4s.headers._ +import org.http4s.dsl.Http4sDsl +import org.http4s.circe.CirceEntityEncoder._ + +import cats.effect.Sync +import sharry.common._ +import sharry.backend.share._ +import sharry.backend.BackendApp +import sharry.restapi.model.{ShareDetail => ShareDetailDto, _} +import sharry.restserver.Config + +object ShareDetailResponse { + + def apply[F[_]: Sync]( + dsl: Http4sDsl[F], + backend: BackendApp[F], + cfg: Config, + shareId: ShareId, + pass: Option[Password] + ): F[Response[F]] = { + import dsl._ + + val baseUri = shareId.fold( + pub => cfg.baseUrl / "api" / "v2" / "open" / "share" / pub.id.id / "file", + priv => cfg.baseUrl / "api" / "v2" / "sec" / "share" / priv.id.id / "file" + ) + + val authChallenge = `WWW-Authenticate`(Challenge("sharry", "sharry")) + + (for { + now <- OptionT.liftF(Timestamp.current[F]) + detail <- backend.share.shareDetails(shareId, pass) + resp <- OptionT.liftF( + detail.fold(d => Ok(shareDetail(now, baseUri)(d)), + _ => Forbidden(), _ => Unauthorized(authChallenge))) + } yield resp).getOrElseF(NotFound()) + } + + def shareDetail(now: Timestamp, baseUri: LenientUri)(item: ShareDetail): ShareDetailDto = { + val files = item.files.map( + f => ShareFile(f.id, f.name.getOrElse(""), f.length, f.mimetype.asString, f.checksum, f.saved) + ) + + ShareDetailDto( + item.share.id, + item.share.name, + item.share.aliasId, + item.alias.map(_.name), + item.share.validity, + item.share.maxViews, + item.share.password.nonEmpty, + item.share.description, + item.descProcessed(baseUri), + item.share.created, + item.published.map( + p => + SharePublish( + p.id, + p.enabled, + p.views, + p.publishDate, + p.publishUntil, + p.publishUntil.isBefore(now), + p.lastAccess + ) + ), + files.toList + ) + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/ShareRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/ShareRoutes.scala new file mode 100644 index 00000000..7da293af --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/ShareRoutes.scala @@ -0,0 +1,155 @@ +package sharry.restserver.routes + +import cats.effect._ +import cats.implicits._ +import cats.data.OptionT +import org.http4s._ +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s._ + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.BackendApp +import sharry.restapi.model._ +import sharry.restserver.Config +import sharry.backend.share._ +import sharry.backend.auth.AuthToken +import sharry.store.AddResult +import sharry.restserver.routes.headers.SharryPassword + +object ShareRoutes { + private[this] val logger = getLogger + + def apply[F[_]: Effect](backend: BackendApp[F], token: AuthToken, cfg: Config): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of[F] { + case req @ GET -> Root / "search" => + val q = req.params.getOrElse("q", "") + for { + _ <- logger.ftrace(s"Listing shares: $q") + now <- Timestamp.current[F] + all <- backend.share.findShares(q, token.account).take(100).compile.toVector + list = ShareList(all.map(shareListItem(now)).toList) + resp <- Ok(list) + } yield resp + + case req @ GET -> Root / Ident(id) => + val pw = SharryPassword(req) + ShareDetailResponse(dsl, backend, cfg, ShareId.secured(id, token.account), pw) + + case req @ POST -> Root / Ident(id) / "publish" => + (for { + in <- OptionT.liftF(req.as[PublishData]) + res <- backend.share + .publish(id, token.account, in.reuseId) + .attempt + .map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Share published."))) + } yield resp).getOrElseF(NotFound()) + + case DELETE -> Root / Ident(id) / "publish" => + (for { + res <- backend.share.unpublish(id, token.account).attempt.map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Share unpublished."))) + } yield resp).getOrElseF(NotFound()) + + case req @ GET -> Root / Ident(id) / file / Ident(fid) => + val pw = SharryPassword(req) + ByteResponse(dsl, req, backend, ShareId.secured(id, token.account), pw, fid) + + case req @ DELETE -> Root / Ident(id) / file / Ident(fid) => + (for { + e <- backend.share.deleteFile(token.account, fid).attempt.map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(e, "File deleted."))) + } yield resp).getOrElseF(NotFound()) + + case req @ DELETE -> Root / Ident(id) => + (for { + e <- backend.share.deleteShare(token.account, id).attempt.map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(e, "Share deleted."))) + } yield resp).getOrElseF(NotFound()) + + case req @ POST -> Root / Ident(id) / "description" => + (for { + in <- OptionT.liftF(req.as[SingleString]) + res <- backend.share + .setDescription(token.account, id, in.value) + .attempt + .map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Description updated."))) + } yield resp).getOrElseF(NotFound()) + + case req @ POST -> Root / Ident(id) / "name" => + (for { + in <- OptionT.liftF(req.as[SingleString]) + res <- backend.share + .setName(token.account, id, Some(in.value)) + .attempt + .map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Name updated."))) + } yield resp).getOrElseF(NotFound()) + + case req @ DELETE -> Root / Ident(id) / "name" => + (for { + res <- backend.share.setName(token.account, id, None).attempt.map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Name deleted."))) + } yield resp).getOrElseF(NotFound()) + + case req @ POST -> Root / Ident(id) / "validity" => + (for { + in <- OptionT.liftF(req.as[SingleNumber]) + res <- backend.share + .setValidity(token.account, id, Duration.millis(in.value)) + .attempt + .map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Validity updated."))) + } yield resp).getOrElseF(NotFound()) + + case req @ POST -> Root / Ident(id) / "maxviews" => + (for { + in <- OptionT.liftF(req.as[SingleNumber]) + res <- backend.share + .setMaxViews(token.account, id, in.value.toInt) + .attempt + .map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Max. views updated."))) + } yield resp).getOrElseF(NotFound()) + + + case req @ POST -> Root / Ident(id) / "password" => + (for { + in <- OptionT.liftF(req.as[SingleString]) + res <- backend.share + .setPassword(token.account, id, Some(Password(in.value))) + .attempt + .map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Password updated."))) + } yield resp).getOrElseF(NotFound()) + + + case req @ DELETE -> Root / Ident(id) / "password" => + (for { + res <- backend.share.setPassword(token.account, id, None).attempt.map(AddResult.fromEither) + resp <- OptionT.liftF(Ok(Conv.basicResult(res, "Password deleted."))) + } yield resp).getOrElseF(NotFound()) + } + } + + def shareListItem(now: Timestamp)(item: ShareItem): ShareListItem = + ShareListItem( + item.share.id, + item.share.name, + item.aliasName, + item.share.validity, + item.share.maxViews, + item.share.password != None, + item.share.created, + item.files.count, + item.files.size, + item.published.filter(_.enabled).map(ps => ps.publishUntil.isAfter(now)) + ) +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/ShareUploadRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/ShareUploadRoutes.scala new file mode 100644 index 00000000..a9fa9648 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/ShareUploadRoutes.scala @@ -0,0 +1,123 @@ +package sharry.restserver.routes + +import fs2.Stream +import cats.effect._ +import cats.implicits._ +import org.http4s.HttpRoutes +import org.http4s.circe.CirceEntityEncoder._ +import org.http4s.circe.CirceEntityDecoder._ +import org.http4s.dsl.Http4sDsl +import org.log4s.getLogger + +import sharry.backend.BackendApp +import sharry.backend.auth.AuthToken +import sharry.backend.share.{File, ShareData} +import sharry.restapi.model._ +import sharry.restserver.Config +import sharry.restserver.routes.tus.TusRoutes +import sharry.common._ +import sharry.common.syntax.all._ +import org.http4s.multipart.Multipart +import org.http4s.headers.{`Content-Length`, `Content-Type`} +import bitpeace.Mimetype +import cats.data.OptionT + +object ShareUploadRoutes { + private[this] val logger = getLogger + + def apply[F[_]: Effect]( + backend: BackendApp[F], + token: AuthToken, + cfg: Config, + rootUrl: LenientUri + ): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of { + case req @ POST -> Root => + for { + _ <- logger.fdebug("Uploading files to create a new share.") + multipart <- req.as[Multipart[F]] + updata <- readMultipart(multipart) + upid <- backend.share.create(updata, token.account) + res <- Ok(Conv.uploadResult("Share created.")(upid)) + } yield res + + case req @ POST -> Root / "new" => + for { + _ <- logger.fdebug("Create empty share") + in <- req.as[ShareProperties] + updata = ShareData[F]( + in.validity, + in.maxViews, + in.description, + in.password, + in.name, + Stream.empty + ) + upid <- backend.share.create(updata, token.account) + res <- Ok(Conv.uploadResult("Share created.")(upid)) + } yield res + + case req @ POST -> Root / Ident(id) / "files" / "add" => + (for { + _ <- OptionT.liftF(logger.fdebug("Uploading a file to an existing share")) + multipart <- OptionT.liftF(req.as[Multipart[F]]) + updata <- OptionT.liftF(readMultipart(multipart)) + ur <- backend.share.addFile(id, token.account, updata.files) + resp <- OptionT.liftF(Ok(Conv.uploadBasicResult("File(s) added")(ur))) + } yield resp).getOrElseF(NotFound()) + + case req @ (PATCH | POST | GET | OPTIONS | HEAD) -> Ident(id) /: "files" /: "tus" /: rest => + val pi = req.pathInfo.substring(id.id.length() + 10) + val rootUri = rootUrl / id.id / "files" / "tus" + TusRoutes(id, backend, token, cfg, rootUri).run(req.withPathInfo(pi)).getOrElseF(NotFound()) + } + } + + def readMultipart[F[_]: Effect](mp: Multipart[F]): F[ShareData[F]] = { + def parseMeta(body: Stream[F, Byte]): F[ShareProperties] = + body + .through(fs2.text.utf8Decode) + .parseJsonAs[ShareProperties] + .map(_.fold(ex => { + logger.error(ex)("Reading upload metadata failed.") + throw ex + }, identity)) + + def fromContentType(header: `Content-Type`): Mimetype = + Mimetype(header.mediaType.mainType, header.mediaType.subType) + + val meta: F[ShareProperties] = mp.parts + .find(_.name.exists(_.equalsIgnoreCase("meta"))) + .map(p => parseMeta(p.body)) + .getOrElse(ShareProperties(None, Duration.days(2), None, 30, None).pure[F]) + + val files = mp.parts + .filter(p => p.name.forall(s => !s.equalsIgnoreCase("meta"))) + .map( + p => + File( + p.filename, + p.headers.get(`Content-Type`).map(fromContentType), + p.headers.get(`Content-Length`).map(_.length), + p.body + ) + ) + + for { + metaData <- meta + _ <- logger.fdebug(s"Parsed upload meta data: $metaData") + shd = ShareData[F]( + metaData.validity, + metaData.maxViews, + metaData.description, + metaData.password, + metaData.name, + Stream.emits(files) + ) + } yield shd + } + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/headers/SharryPassword.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/headers/SharryPassword.scala new file mode 100644 index 00000000..b14e90f0 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/headers/SharryPassword.scala @@ -0,0 +1,17 @@ +package sharry.restserver.routes.headers + +import org.http4s.Request +import sharry.common.LenientUri +import org.http4s.syntax.string._ +import sharry.common.Password + +object SharryPassword { + + def apply[F[_]](req: Request[F]): Option[Password] = + req.headers + .get("sharry-password".ci) + .map(_.value) + .map(LenientUri.percentDecode) + .map(Password.apply) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileLength.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileLength.scala new file mode 100644 index 00000000..03047f04 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileLength.scala @@ -0,0 +1,14 @@ +package sharry.restserver.routes.tus + +import org.http4s._ +import org.http4s.syntax.string._ +import sharry.common.ByteSize + +object SharryFileLength { + + def apply[F[_]](req: Request[F]): Option[ByteSize] = + sizeHeader(req, "sharry-file-length").orElse(sizeHeader(req, "upload-length")) + + private[tus] def sizeHeader[F[_]](req: Request[F], name: String): Option[ByteSize] = + req.headers.get(name.ci).flatMap(_.value.toLongOption).map(ByteSize.apply) +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileName.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileName.scala new file mode 100644 index 00000000..19428a17 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileName.scala @@ -0,0 +1,12 @@ +package sharry.restserver.routes.tus + +import org.http4s.Request +import sharry.common.LenientUri +import org.http4s.syntax.string._ + +object SharryFileName { + + def apply[F[_]](req: Request[F]): Option[String] = + req.headers.get("sharry-file-name".ci).map(_.value).map(LenientUri.percentDecode) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileType.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileType.scala new file mode 100644 index 00000000..7ed13d45 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/SharryFileType.scala @@ -0,0 +1,12 @@ +package sharry.restserver.routes.tus + +import org.http4s.Request +import org.http4s.syntax.string._ +import bitpeace.Mimetype + +object SharryFileType { + + def apply[F[_]](req: Request[F]): Option[Mimetype] = + req.headers.get("sharry-file-type".ci).map(_.value).flatMap(s => Mimetype.parse(s).toOption) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusMaxSize.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusMaxSize.scala new file mode 100644 index 00000000..533dcc7a --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusMaxSize.scala @@ -0,0 +1,15 @@ +package sharry.restserver.routes.tus + +import org.http4s.Request +import sharry.common.ByteSize +import org.http4s.Header + +object TusMaxSize { + + def get[F[_]](req: Request[F]): Option[ByteSize] = + SharryFileLength.sizeHeader(req, "upload-length") + + def apply(size: ByteSize): Header = + Header("Tus-Max-Size", size.bytes.toString()) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusRoutes.scala new file mode 100644 index 00000000..0946998e --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/TusRoutes.scala @@ -0,0 +1,112 @@ +package sharry.restserver.routes.tus + +import cats.effect._ +import cats.implicits._ +import cats.data.OptionT +import org.http4s._ +import org.http4s.dsl.Http4sDsl +import org.http4s.headers._ +import org.log4s.getLogger + +import bitpeace.Mimetype +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.backend.BackendApp +import sharry.backend.auth.AuthToken +import sharry.backend.share.{FileInfo, UploadResult} +import sharry.restserver.Config + +object TusRoutes { + private[this] val logger = getLogger + + def apply[F[_]: Effect]( + shareId: Ident, + backend: BackendApp[F], + token: AuthToken, + cfg: Config, + rootUrl: LenientUri + ): HttpRoutes[F] = { + val dsl = new Http4sDsl[F] {} + import dsl._ + + HttpRoutes.of { + case req @ OPTIONS -> Root => + NoContent.apply(TusHeader.resumable, TusHeader.extension, TusHeader.version) + + case req @ POST -> Root => + // creation extension + TusHeader.fileInfo(req) match { + case Some(info) => + backend.share + .createEmptyFile(shareId, token.account, info) + .semiflatMap({ + case UploadResult.Success(fid) => + val url = rootUrl / fid.id + Created(TusHeader.resumable, Location(Uri.unsafeFromString(url.asString))) + case UploadResult.ValidityExceeded(_) => + BadRequest() + case UploadResult.SizeExceeded(_) => + PayloadTooLarge("max size exceeded"). + map(_.withHeaders(TusMaxSize(cfg.backend.share.maxSize))) + }) + .getOrElseF(NotFound()) + + case None => + BadRequest("No length header") + } + + case req @ (POST | PATCH) -> Root / Ident(fileId) => + val offset = UploadOffset.get(req).getOrElse(ByteSize.zero) + val length = req.headers.get(`Content-Length`).map(_.length).map(ByteSize.apply) + backend.share + .addFileData(shareId, fileId, token.account, length, offset, req.body) + .flatMap({ + case UploadResult.Success(saved) => + OptionT.liftF(NoContent(TusHeader.resumable, UploadOffset(saved))) + case UploadResult.ValidityExceeded(_) => + OptionT.liftF(BadRequest()) + case UploadResult.SizeExceeded(_) => + OptionT.liftF(PayloadTooLarge("max size exceeded")) + }) + .getOrElseF(NotFound()) + + case req @ HEAD -> Root / Ident(fileId) => + (for { + _ <- OptionT.liftF(logger.fdebug(s"Return info for file ${fileId.id}")) + data <- backend.share.getFileData(fileId, token.account) + resp <- OptionT.liftF( + Ok( + TusHeader.resumable, + UploadOffset(data.saved), + TusHeader.cacheControl, + TusMaxSize(cfg.backend.share.maxSize), + UploadLength(data.length) + ) + ) + } yield resp).getOrElseF(NotFound()) + + } + } + + object TusHeader { + + def fileInfo[F[_]](req: Request[F]): Option[FileInfo] = { + val name = SharryFileName(req) + val len = SharryFileLength(req) + val mime = SharryFileType(req).getOrElse(Mimetype.`application/octet-stream`) + + len.map(l => FileInfo(l.bytes, name, mime)) + } + + def resumable: Header = + Header("Tus-Resumable", "1.0.0") + def extension: Header = + Header("Tus-Extension", "creation") + def version: Header = + Header("Tus-Version", "1.0.0") + + def cacheControl: Header = + `Cache-Control`(CacheDirective.`no-store`) + } + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadLength.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadLength.scala new file mode 100644 index 00000000..61c294ab --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadLength.scala @@ -0,0 +1,15 @@ +package sharry.restserver.routes.tus + +import org.http4s.Request +import sharry.common.ByteSize +import org.http4s.Header + +object UploadLength { + + def get[F[_]](req: Request[F]): Option[ByteSize] = + SharryFileLength.sizeHeader(req, "upload-length") + + def apply(size: ByteSize): Header = + Header("Upload-Length", size.bytes.toString()) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadOffset.scala b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadOffset.scala new file mode 100644 index 00000000..d767623b --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/routes/tus/UploadOffset.scala @@ -0,0 +1,15 @@ +package sharry.restserver.routes.tus + +import org.http4s.Request +import sharry.common.ByteSize +import org.http4s.Header + +object UploadOffset { + + def get[F[_]](req: Request[F]): Option[ByteSize] = + SharryFileLength.sizeHeader(req, "upload-offset") + + def apply(size: ByteSize): Header = + Header("Upload-Offset", size.bytes.toString()) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/webapp/TemplateRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/webapp/TemplateRoutes.scala new file mode 100644 index 00000000..496dd06e --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/webapp/TemplateRoutes.scala @@ -0,0 +1,153 @@ +package sharry.restserver.webapp + +import fs2._ +import cats.effect._ +import cats.implicits._ +import org.http4s._ +import org.http4s.headers._ +import org.http4s.HttpRoutes +import org.http4s.dsl.Http4sDsl +import org.slf4j._ +import _root_.io.circe.syntax._ +import yamusca.imports._ +import yamusca.implicits._ +import java.net.URL +import java.util.concurrent.atomic.AtomicReference + +import sharry.restapi.model.AppConfig +import sharry.restserver.{BuildInfo, Config} +import sharry.restserver.webapp.YamuscaConverter._ +import sharry.restserver.routes.InfoRoutes + +object TemplateRoutes { + private[this] val logger = LoggerFactory.getLogger(getClass) + + val `text/html` = new MediaType("text", "html") + + trait InnerRoutes[F[_]] { + def doc: HttpRoutes[F] + def app: HttpRoutes[F] + } + + def apply[F[_]: Effect](blocker: Blocker, cfg: Config)( + implicit C: ContextShift[F] + ): InnerRoutes[F] = { + val indexTemplate = memo(loadResource("/index.html").flatMap(loadTemplate(_, blocker))) + val docTemplate = memo(loadResource("/doc.html").flatMap(loadTemplate(_, blocker))) + + val dsl = new Http4sDsl[F] {} + import dsl._ + new InnerRoutes[F] { + def doc = + HttpRoutes.of[F] { + case GET -> Root => + for { + templ <- docTemplate + resp <- Ok(DocData(cfg).render(templ), `Content-Type`(`text/html`)) + } yield resp + } + def app = + HttpRoutes.of[F] { + case GET -> rest => + for { + templ <- indexTemplate + resp <- Ok(IndexData(cfg).render(templ), `Content-Type`(`text/html`)) + } yield resp + } + } + } + + def loadResource[F[_]: Sync](name: String): F[URL] = + Option(getClass.getResource(name)) match { + case None => + Sync[F].raiseError(new Exception("Unknown resource: " + name)) + case Some(r) => + r.pure[F] + } + + def loadUrl[F[_]: Sync](url: URL, blocker: Blocker)(implicit C: ContextShift[F]): F[String] = + Stream + .bracket(Sync[F].delay(url.openStream))(in => Sync[F].delay(in.close)) + .flatMap(in => io.readInputStream(in.pure[F], 64 * 1024, blocker, false)) + .through(text.utf8Decode) + .compile + .fold("")(_ + _) + + def parseTemplate[F[_]: Sync](str: String): F[Template] = + Sync[F].delay { + mustache.parse(str) match { + case Right(t) => t + case Left((_, err)) => sys.error(err) + } + } + + def loadTemplate[F[_]: Sync](url: URL, blocker: Blocker)( + implicit C: ContextShift[F] + ): F[Template] = + loadUrl[F](url, blocker) + .flatMap(s => parseTemplate(s)) + .map(t => { + logger.info(s"Compiled template $url") + t + }) + + case class DocData(swaggerRoot: String, openapiSpec: String) + object DocData { + + def apply(cfg: Config): DocData = + DocData( + "/app/assets" + Webjars.swaggerui, + s"/app/assets/${BuildInfo.name}/${BuildInfo.version}/sharry-openapi.yml" + ) + + implicit def yamuscaValueConverter: ValueConverter[DocData] = + ValueConverter.deriveConverter[DocData] + } + + case class IndexData( + flags: AppConfig, + faviconBase: String, + cssUrls: Seq[String], + jsUrls: Seq[String], + appExtraJs: String, + flagsJson: String + ) + + object IndexData { + + def apply(cfg: Config): IndexData = + IndexData( + InfoRoutes.appConfig(cfg), + s"/app/assets/sharry-webapp/${BuildInfo.version}/favicon", + Seq( + "/app/assets" + Webjars.semanticui + "/semantic.min.css", + s"/app/assets/sharry-webapp/${BuildInfo.version}/sharry.css" + ), + Seq( + "/app/assets" + Webjars.jquery + "/jquery.min.js", + "/app/assets" + Webjars.semanticui + "/semantic.min.js", + "/app/assets" + Webjars.tusjsclient + "/dist/tus.min.js", + s"/app/assets/sharry-webapp/${BuildInfo.version}/sharry-app.js" + ), + s"/app/assets/sharry-webapp/${BuildInfo.version}/sharry.js", + InfoRoutes.appConfig(cfg).asJson.spaces2 + ) + + implicit def yamuscaValueConverter: ValueConverter[IndexData] = + ValueConverter.deriveConverter[IndexData] + } + + private def memo[F[_]: Sync, A](fa: => F[A]): F[A] = { + val ref = new AtomicReference[A]() + Sync[F].suspend { + Option(ref.get) match { + case Some(a) => a.pure[F] + case None => + fa.map(a => { + ref.set(a) + a + }) + } + } + } +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/webapp/WebjarRoutes.scala b/modules/restserver/src/main/scala/sharry/restserver/webapp/WebjarRoutes.scala new file mode 100644 index 00000000..af998c21 --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/webapp/WebjarRoutes.scala @@ -0,0 +1,43 @@ +package sharry.restserver.webapp + +import cats.effect._ +import org.http4s._ +import org.http4s.HttpRoutes +import org.http4s.server.staticcontent.webjarService +import org.http4s.server.staticcontent.NoopCacheStrategy +import org.http4s.server.staticcontent.WebjarService.{WebjarAsset, Config => WebjarConfig} + +import sharry.restserver.Config + +object WebjarRoutes { + + def appRoutes[F[_]: Effect](blocker: Blocker, cfg: Config)( + implicit C: ContextShift[F] + ): HttpRoutes[F] = + webjarService( + WebjarConfig( + filter = assetFilter, + blocker = blocker, + cacheStrategy = NoopCacheStrategy[F] + ) + ) + + def assetFilter(asset: WebjarAsset): Boolean = + List( + ".js", + ".css", + ".html", + ".jpg", + ".png", + ".eot", + ".json", + ".woff", + ".woff2", + ".svg", + ".map", + ".otf", + ".ttf", + ".yml" + ).exists(e => asset.asset.endsWith(e)) + +} diff --git a/modules/restserver/src/main/scala/sharry/restserver/webapp/YamuscaConverter.scala b/modules/restserver/src/main/scala/sharry/restserver/webapp/YamuscaConverter.scala new file mode 100644 index 00000000..530ca5fb --- /dev/null +++ b/modules/restserver/src/main/scala/sharry/restserver/webapp/YamuscaConverter.scala @@ -0,0 +1,17 @@ +package sharry.restserver.webapp + +import yamusca.imports._ +import yamusca.implicits._ +import sharry.restapi.model.AppConfig +import sharry.restapi.model.OAuthItem +import sharry.backend.mustache.YamuscaCommon + +object YamuscaConverter extends YamuscaCommon { + + implicit def yamuscaOAuthItemConverter: ValueConverter[OAuthItem] = + ValueConverter.deriveConverter[OAuthItem] + + implicit def yamuscaAppConfigValueConverter: ValueConverter[AppConfig] = + ValueConverter.deriveConverter[AppConfig] + +} diff --git a/modules/restserver/src/main/templates/doc.html b/modules/restserver/src/main/templates/doc.html new file mode 100644 index 00000000..72820155 --- /dev/null +++ b/modules/restserver/src/main/templates/doc.html @@ -0,0 +1,60 @@ + + + + + Swagger UI + + + + + + + +

+ + + + + + diff --git a/modules/restserver/src/main/templates/index.html b/modules/restserver/src/main/templates/index.html new file mode 100644 index 00000000..c964a3ab --- /dev/null +++ b/modules/restserver/src/main/templates/index.html @@ -0,0 +1,39 @@ + + + + + + {{ flags.appName }} + {{# cssUrls }} + + {{/ cssUrls }} + {{# jsUrls }} + + {{/ jsUrls}} + + + + + + + + + + + +
+
+ + + + + + diff --git a/modules/server/src/main/resources/logback.xml b/modules/server/src/main/resources/logback.xml deleted file mode 100644 index 796f3d58..00000000 --- a/modules/server/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - %d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %level [%thread] %logger [%file:%line] %msg%n - - - - - - - - - diff --git a/modules/server/src/main/resources/reference.conf b/modules/server/src/main/resources/reference.conf deleted file mode 100644 index 56e7758c..00000000 --- a/modules/server/src/main/resources/reference.conf +++ /dev/null @@ -1,265 +0,0 @@ -sharry { - - # the database connection. sharry is distributed with the H2 - # database. - db { - driver = "org.h2.Driver" - url = "jdbc:h2:./sharry-db.h2" - user = "sa" - password = "" - } - - log { - # A logback configuration file to use instead of the default config - config = "" - } - - upload { - # When storing and transfering binary data use chunks of this size. - chunk-size = "256K" - - # Allow simultaneous uploads - simultaneous-uploads = 3 - - # Maximum number of files that can be uploaded to one share - max-files = 50 - - # Maximum size of one uploaded file - max-file-size = "1.5G" - - # Maximum validity for uploads - max-validity = 365 days - - # Whether to enable the upload cleanup job that periodically - # removes invalid uploads - cleanup-enable = true - - # The interval for the cleanup job - cleanup-interval = 30 days - - # Age of invalid uploads to get collected by cleanup job - cleanup-invalid-age = 7 days - - # Duration an anonymous user can hit delete after uploading from - # an alias page - alias-delete-time = 2 minutes - - # If true, user that received files from their alias pages are - # notified via email (if they have an email address in ther - # profile) - enable-upload-notification = true - } - - web { - # the host for binding the http server - bind-host = "0.0.0.0" - - # the port for binding the http server - bind-port = 9090 - - # The name of the application rendered in the pages - app-name = "Sharry" - - # The base url to use when constructing urls. - baseurl = "http://localhost:9090/" - - # A short text that is displayed below the login form. Visible to - # everyone. It can be markdown formatted text. - welcome-message = "" - - # the .css used with highlightjs to syntax highlight code - # blocks. - highlightjs-theme = "github" - - # Settings regarding sending mails from sharry - # - # Valid smtp settings are required for sending mails. They are - # defined below. If you are running sharry on a fixed IP, it is - # usually not necessary to specify extra smtp settings. Sharry - # will find out the MX host for each email address using its - # domain. Since many public smtp servers usually don't accept mail - # from a dial-up network; or it will be added to the spam - # (e.g. gmail), this only works reasonable on fixed ips. - mail { - # Enable mail notification in the web interface. Allows on - # download and alias pages to send a mail with information about - # the page. - enable = false - - # The default language used to retrieve templates - default-language = "en" - - # Email templates (mustache) per language code used from the - # download page. The first line is the subject. The terms {{url}} - # and {{username}} are replaced with the url and username, - # respectively. - download-templates = { - en = """Ready to download -Hi, - -I have pushed some files for you to download. Visit this page: - -{{{url}}} -{{#password}} - -You'll need a password for downloading! -{{/password}} - -Cheers, -{{{username}}}""" - - de = """Dateien fertig -Hallo, - -Du kannst die Dateien hier runterladen: - -{{{url}}} -{{#password}} - -Du brauchst das Passwort für den Zugriff! -{{/password}} - -Viele Grüße -{{{username}}}""" - } - - # Email tepmlates (mustache) as above but for the alias - # page. Again, first line is the subject. - alias-templates = { - en = """Link for uploading files -Hi, - -please use the following link to send the files to me: - -{{{url}}} - -Cheers, -{{{username}}}""" - - de = """Dateien senden -Hallo, - -Du kannst den folgenden Link verwenden, um mir Dateien zu schicken: - -{{{url}}} - -Danke und viele Grüße -{{{username}}}""" - } - - # Email templates (mustache) used when generating mails to - # notify about new uploads. - notify-templates = { - en = """Upload arrived -Hi {{{username}}} - -someone uploaded files for you using alias site '{{{alias}}}'. - -Checkout {{{uploadUrl}}} to view it. - -Cheers, -Sharry""" - - de = """Dateien erhalten -Hallo {{{username}}}, - -jemand hat Dir Dateien zukommen lassen über die Alias-Seite -'{{{alias}}}'. Du kannst sie hier finden: - -{{{uploadUrl}}} - - -Viele Grüße -Sharry""" - } - } - } - - - # authentication settings - authc { - # A secret used for signing the cookie. If it is empty a randomly - # generated byte sequence is used. So it can be safely left - # empty. It's only required if you want the cookies to survive - # application restarts. - # - # It can be hex or base64 encoded, for example: - # hex:ffa2ff - # b64:ZNNJGE1xfehaLVsJXigp87v4y1JzNj0EMyUER5nmtTw= - # - # On Linux, random bits can be generated using /dev/urandom or - # /dev/random: - # cat /dev/urandom | head -c 64 | base64 -w0 - app-key = "" - - # The lifetime of the authentication cookie that is used at the - # client. The client can refresh the cookie by logging in with a - # valid cookie. - max-cookie-lifetime = 15 minutes - - # Authentication can be disabled here. Then every request is going - # to be associated to the `default-user'. - enable = true - - # the account name used when authentication is disabled - default-user = "sharry" - - # it is possible to use external tools to validate login/password - # pairs. A new account is created automatically for those - # accounts. - # - # If multiple external strategies are enabled, they are tried in - # some order and the first success wins. - extern { - # a preconifgured admin account to get started - admin { - enable = false - login = admin - password = admin - } - - # use a system command and pass the login and password via - # placeholder {login} and {password}. - command { - enable = false - program = [ - "/path/to/someprogram" - "{login}" - "{password}" - ] - # the return code to consider successful verification - success = 0 - } - - # use a http request to do password verification. It only checks - # the response status code for a 200. - http { - enable = false - # the url to use, it may contain placeholders {login} and {password} - url = "https://somehost/auth?login={login}&pass={password}" - # the http method to use - method = "POST" - # the body of the request. it may be empty (for GET requests), - # placeholders {login} and {password} can be used here - body = """{ "login": "{login}", "pass": "{password}" }""" - # if `body' is non-empty, use this contentType - content-type = "application/json" - } - } - } - - # settings for smtp client. - # - # The from field is used for all outgoing mails as From: header. If - # you don't add a smtp host, it is tried to look it up via DNS using - # the domain of the recipient email. - smtp { - host = "" - port = 0 - user = "" - password = "" - from = "noreply@localhost" - start-tls = false - ssl = false - } -} \ No newline at end of file diff --git a/modules/server/src/main/scala/sharry/server/App.scala b/modules/server/src/main/scala/sharry/server/App.scala deleted file mode 100644 index d4c7cfdc..00000000 --- a/modules/server/src/main/scala/sharry/server/App.scala +++ /dev/null @@ -1,117 +0,0 @@ -package sharry.server - -import java.net.URL -import java.nio.file.Path -import java.nio.channels.AsynchronousChannelGroup - -import scala.collection.JavaConverters._ -import cats.effect.IO -import bitpeace._ - -import scala.concurrent.ExecutionContext -import sharry.common.version -import sharry.docs.route -import sharry.docs.md.ManualContext -import sharry.store.account._ -import sharry.store.upload._ -import sharry.server.authc._ -import sharry.webapp.route.webjar -import sharry.common.data._ -import sharry.server.routes.{account, alias, download, login, mail, settings, upload} - -import scala.io.Codec - -/** Instantiate the app from a given configuration */ -final class App(val cfg: config.Config)(implicit ACG: AsynchronousChannelGroup, SCH: fs2.Scheduler, EC: ExecutionContext) { - if (cfg.logConfig.exists) { - setupLogging(cfg.logConfig.config) - } - - val jdbc = cfg.jdbc.transactor.unsafeRunSync - - val bitpeaceConfig: BitpeaceConfig[IO] = BitpeaceConfig.defaultTika[IO] - val accountStore: AccountStore = new SqlAccountStore(jdbc) - val uploadStore: UploadStore = new SqlUploadStore(jdbc, bitpeaceConfig) - - val auth = new Authenticate(accountStore, cfg.authConfig, ExternAuthc(cfg)) - - val uploadConfig = cfg.uploadConfig - - val remoteConfig = RemoteConfig( - paths.mounts.mapValues(_.path) + ("baseUrl" -> cfg.webConfig.baseurl) - , cfg.webConfig.appName - , cfg.authConfig.enable - , cfg.authConfig.maxCookieLifetime.millis - , uploadConfig.chunkSize.toBytes - , uploadConfig.simultaneousUploads - , uploadConfig.maxFiles - , uploadConfig.maxFileSize.toBytes - , uploadConfig.maxValidity.formatExact - , version.projectString - , routes.authz.aliasHeaderName - , cfg.webmailConfig.enable - , cfg.webConfig.highlightjsTheme - , cfg.webConfig.welcomeMessage - , version.shortVersion - ) - - val notifier: notification.Notifier = notification.scheduleNotify( - cfg.smtpSetting, cfg.webConfig, cfg.webmailConfig, uploadStore, accountStore) - - - def endpoints = { - routes.syntax.choice2( - webjar.endpoint(remoteConfig) - , route.manual(paths.manual.matcher, ManualContext(version.longVersion, version.shortVersion, defaultConfig, defaultCliConfig, cliHelp)) - , login.endpoint(auth, cfg.webConfig, cfg.authConfig) - , account.endpoint(auth, cfg.authConfig, accountStore, cfg.webConfig) - , upload.endpoint(cfg.authConfig, uploadConfig, uploadStore, notifier) - , download.endpoint(cfg.authConfig, cfg.webConfig, uploadStore) - , alias.endpoint(cfg.authConfig, uploadConfig, uploadStore) - , mail.endpoint(cfg.authConfig, cfg.smtpSetting, cfg.webmailConfig, accountStore) - , settings.endpoint(remoteConfig) - ) - } - - private lazy val defaultConfig = { - getClass.getClassLoader.getResources("reference.conf"). - asScala.toList. - filter(_.toString contains "sharry-server"). - map(urlToLines). - headOption.getOrElse("") - } - - private lazy val defaultCliConfig = { - Option(getClass.getResource("/reference-cli.conf")). - map(urlToLines).getOrElse("") - } - - private lazy val cliHelp = { - Option(getClass.getResource("/cli-help.txt")). - map(urlToLines).getOrElse("") - } - - def setupLogging(logFile: Path): Unit = { - import org.slf4j.LoggerFactory - import ch.qos.logback.classic.LoggerContext - import ch.qos.logback.classic.joran.JoranConfigurator - import ch.qos.logback.core.util.StatusPrinter - val context = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext] - scala.util.Try { - val config = new JoranConfigurator() - config.setContext(context) - context.reset() - config.doConfigure(logFile.toString) - } - StatusPrinter.printInCaseOfErrorsOrWarnings(context) - } - - private def urlToLines(url: URL): String = { - val source = scala.io.Source.fromURL(url)(Codec.UTF8) - try { - source.getLines.mkString("\n") - } finally { - source.close() - } - } -} diff --git a/modules/server/src/main/scala/sharry/server/authc/Authenticate.scala b/modules/server/src/main/scala/sharry/server/authc/Authenticate.scala deleted file mode 100644 index 2c122f28..00000000 --- a/modules/server/src/main/scala/sharry/server/authc/Authenticate.scala +++ /dev/null @@ -1,86 +0,0 @@ -package sharry.server.authc - -import java.time.Instant -import org.log4s._ -import fs2.{Stream, Pipe} -import cats.effect.IO -import com.github.t3hnar.bcrypt._ -import sharry.common.streams -import sharry.common.data.Account -import sharry.store.account.AccountStore -import sharry.server.config.AuthConfig - -final class Authenticate(store: AccountStore, authConfig: AuthConfig, ext: ExternAuthc) { - implicit private[this] val logger = getLogger - - def authc(login: String, pass: String): Stream[IO,AuthResult] = { - if (authConfig.enable) { - store.getAccount(login). - through(streams.logEmpty(_.debug(s"No account found for login: $login"))). - through(streams.logEach((a, l) => l.debug(s"Authenticating account ${a.noPass}"))). - through(checkEnabled). - through(verifyPresent(login, pass, ext)). - through(verifyNewAccount(login, pass, ext)). - through(logResult(login)) - } else { - logger.warn(s"Authentication is disabled. Using default user ${authConfig.defaultUser}") - store.getAccount(authConfig.defaultUser). - through(checkEnabled). - through(verifyPresent(login, pass, ExternAuthc.disabledAuth(authConfig))). - through(verifyNewAccount(login, pass, ExternAuthc.disabledAuth(authConfig))) - } - } - - def logResult(login: String): Pipe[IO, AuthResult, AuthResult] = - streams.logEach { (ar, logger) => - ar match { - case Left(err) => logger.warn(s"Authentication failed for $login: $err") - case Right(a) => logger.debug(s"Authentication successfull for ${a.noPass}") - } - } - - /** Authenticates a {{Token}} that is generated from an account. Thus - * it fails if the account doesn't exist. */ - def authc(token: Token, now: Instant): Stream[IO, AuthResult] = { - val fail = Stream.emit(AuthResult.failed).covary[IO].through(logResult(token.login)) - if (!token.verify(now, authConfig.appKey)) fail - else store.getAccount(token.login). - through(checkEnabled). - through(streams.ifEmpty(fail)). - through(logResult(token.login)) - } - - // if present check enabled - def checkEnabled[F[_]]: Pipe[F, Account, AuthResult] = - _.map { acc => - if (acc.enabled) AuthResult(acc) else AuthResult.fail("User account locked") - } - - // if present, verify password internally or externally - def verifyPresent(login: String, givenPass: String, ext: ExternAuthc): Pipe[IO, AuthResult, AuthResult] = - _.flatMap { - case Right(a @ Account.Internal(_, pass)) => - if (pass.exists(p => givenPass.isBcrypted(p))) Stream.emit(Right(a)) - else Stream.emit(AuthResult.failed) - case Right(a @ Account.External(_)) => - streams.slogT(_.debug(s"Verify ${a.noPass} externally")) ++ ext.verify(login, givenPass).map { - case Some(_) => AuthResult(a) - case None => AuthResult.failed - } - case ar => Stream.emit(ar) - } - - // if absent, verify via ext. if ok, create account; fail otherwise - def verifyNewAccount(login: String, pass: String, ext: ExternAuthc): Pipe[IO, AuthResult, AuthResult] = { - val create: Stream[IO,AuthResult] = streams.slogT(_.debug(s"Verify $login externally")) ++ - ext.verify(login, pass).flatMap { - case Some(acc) => - streams.slogT(_.debug(s"Create new external account $acc")) ++ - store.createAccount(acc).map(_ => AuthResult(acc)) - case None => - Stream.emit(AuthResult.failed) - } - - _.through(streams.ifEmpty(create)) - } -} diff --git a/modules/server/src/main/scala/sharry/server/authc/ExternAuthc.scala b/modules/server/src/main/scala/sharry/server/authc/ExternAuthc.scala deleted file mode 100644 index 4fe2ae68..00000000 --- a/modules/server/src/main/scala/sharry/server/authc/ExternAuthc.scala +++ /dev/null @@ -1,113 +0,0 @@ -package sharry.server.authc - -import java.nio.channels.AsynchronousChannelGroup -import org.log4s._ -import scala.sys.process._ -import fs2.Stream -import cats.effect.IO -import cats.syntax.either._ -import spinoco.fs2.http -import spinoco.fs2.http.HttpRequest -import spinoco.protocol.http.{HttpMethod, Uri, HttpStatusCode} -import spinoco.protocol.mime.ContentType -import scala.concurrent.ExecutionContext - -import sharry.common.data._ -import sharry.server.config._ - -trait ExternAuthc { - def verify(login: String, pass: String): Stream[IO,Option[Account]] -} - -object ExternAuthc { - implicit private[this] val logger = getLogger - - def apply(f: (String, String) => Stream[IO,Option[Account]]): ExternAuthc = - new ExternAuthc { - def verify(login: String, pass: String) = f(login, pass) - } - - def apply(cfg: Config)(implicit ACG: AsynchronousChannelGroup, EC: ExecutionContext): ExternAuthc = apply { - List( - new Command(cfg.authcCommand), - new Http(cfg.authcHttp), - configAdmin(cfg.adminAccount) - ) - } - - def apply(ext: Seq[ExternAuthc]): ExternAuthc = ExternAuthc { (login, pass) => - Stream.emits(ext). - flatMap(_.verify(login, pass)). - find(_.isDefined). - lastOr(None) - } - - final class Command(cfg: AuthcCommand) extends ExternAuthc { - def verify(login: String, pass: String) = - if (!cfg.enable) Stream.emit(None) - else Stream.eval(IO { - val cmd = cfg.program.map(_.replace("{login}", login).replace("{password}", pass)) - val r = Either.catchOnly[Exception] { - logger.debug(s"Running external auth command: ${cfg.program.map(_.replace("{login}", login))}") - Process(cmd).! - } - logger.debug(s"Result of command authc: $r") - if (r == Right(cfg.success)) Some(Account.newExtern(login)) - else None - }) - } - - final class Http(cfg: AuthcHttp)(implicit ACG: AsynchronousChannelGroup, EC: ExecutionContext) extends ExternAuthc { - def verify(login: String, pass: String) = - if (!cfg.enable) Stream.emit(None) - else { - logger.debug(s"Start with http authentication for $login") - val makeRequest: IO[HttpRequest[IO]] = IO { - - val replace: String => String = - _.replace("{login}", login).replace("{password}", pass) - - val req = for { - url <- Uri.parse(replace(cfg.url)).toEither - method <- parse(cfg.method, HttpMethod.codec) - mime <- parse(cfg.contentType, ContentType.codec) - } yield HttpRequest.get[IO](url). - withMethod(method). - withUtf8Body(replace(cfg.body)). - withContentType(mime) - - req.valueOr { err => - logger.error(s"Error making http request for $login: $err") - throw new Exception(err.toString) - } - } - - def execute(req: HttpRequest[IO]): Stream[IO,Option[Account]] = { - Stream.eval(http.client[IO]()).flatMap { client => - client.request(req).map { resp => - logger.debug(s"External HTTP auth against ${cfg.url} for $login responds with ${resp.header.status}") - if (resp.header.status != HttpStatusCode.Ok) None - else Some(Account.newExtern(login)) - } - } - } - - Stream.eval(makeRequest).flatMap(execute) - } - } - - def configAdmin(cfg: AdminAccount): ExternAuthc = ExternAuthc { (login, pass) => - Stream.emit { - if (cfg.enable && cfg.login == login && cfg.password == pass) - Some(Account.newExtern(login).copy(admin = true)) - else - None - } - } - - def disabledAuth(cfg: AuthConfig): ExternAuthc = ExternAuthc { (login, pass) => - Stream.emit { - Some(Account.newExtern(cfg.defaultUser)) - } - } -} diff --git a/modules/server/src/main/scala/sharry/server/authc/Token.scala b/modules/server/src/main/scala/sharry/server/authc/Token.scala deleted file mode 100644 index f382751e..00000000 --- a/modules/server/src/main/scala/sharry/server/authc/Token.scala +++ /dev/null @@ -1,54 +0,0 @@ -package sharry.server.authc - -import java.time.Instant -import java.time.temporal.TemporalAmount - -import scala.util.Try -import scodec.bits.ByteVector -import com.github.t3hnar.bcrypt -import io.circe._ -import sharry.common.data.Account -import sharry.common.sign - -case class Token(salt: String, login: String, ends: Instant, signature: String) { - def asString = s"${salt}%${login}%${ends.toString}%${signature}" - - def verify(now: Instant, appKey: ByteVector): Boolean = { - val sigv = sign.sign(appKey, s"${salt}%${login}%${ends.toString}").toHex - now.isBefore(ends) && sigv.zip(signature).forall({ case (a, b) => a == b }) - } - - def extend(duration: TemporalAmount, appKey: ByteVector) = - Token(login, ends.plus(duration), appKey) -} - -object Token { - val invalid = Token("invalid", Instant.ofEpochMilli(0), ByteVector.view("invalid".getBytes)) - - def apply(login: String, ends: Instant, appKey: ByteVector): Token = { - val salt = bcrypt.generateSalt - val data = s"${salt}%${login}%${ends.toString}" - val sig = sign.sign(appKey, data) - Token(salt, login, ends, sig.toHex) - } - - def parse(s: String): Token = { - val parts = s.split("%", 4).toList - parts match { - case salt :: login :: ends :: sig :: Nil - if (Account.validateLogin(login).isValid) => - Try(Token(salt, login, Instant.parse(ends), sig)). - toOption. - getOrElse(Token(salt, login, Instant.ofEpochMilli(0), sig)) - case _ => - invalid - } - } - - implicit val _jsonEnc: Encoder[Token] = - Encoder.forProduct1("token")(t => t.asString) - - implicit val _jsonDec: Decoder[Token] = - Decoder.forProduct1("token")(Token.parse) - -} diff --git a/modules/server/src/main/scala/sharry/server/authc/package.scala b/modules/server/src/main/scala/sharry/server/authc/package.scala deleted file mode 100644 index 168d3a53..00000000 --- a/modules/server/src/main/scala/sharry/server/authc/package.scala +++ /dev/null @@ -1,24 +0,0 @@ -package sharry.server - -import cats.syntax.either._ -import scodec.{Err, Codec} -import scodec.bits.ByteVector - -import sharry.common.data._ - -package object authc { - type AuthResult = Either[String, Account] - - object AuthResult { - val failed = fail("Login failed") - def fail(msg: String): AuthResult = Left(msg) - def ok(a: Account): AuthResult = Right(a) - def apply(a: Account): AuthResult = ok(a) - } - - def parse[A](str: String, codec: Codec[A]): Either[Err, A] = - for { - bv <- ByteVector.encodeUtf8(str).leftMap(ex => Err(ex.getMessage)) - a <- codec.decodeValue(bv.bits).toEither - } yield a -} diff --git a/modules/server/src/main/scala/sharry/server/codec/HttpHeaderCodec.scala b/modules/server/src/main/scala/sharry/server/codec/HttpHeaderCodec.scala deleted file mode 100644 index f1729e3c..00000000 --- a/modules/server/src/main/scala/sharry/server/codec/HttpHeaderCodec.scala +++ /dev/null @@ -1,39 +0,0 @@ -package sharry.server.codec - -import scodec.{Err, Attempt, Codec} -import scodec.codecs._ -import spinoco.protocol.http.header._ -import spinoco.protocol.http.codec.{HttpHeaderCodec => SpinocoCodec} - -object HttpHeaderCodec { - - /** - * Wraps all header codecs in - * [[spinoco.protocol.http.codec.HttpHeaderCodec]] to allow empty - * values. - * - */ - def codec(maxHeaderLength: Int, otherHeaders: (String, Codec[HttpHeader]) *):Codec[HttpHeader] = { - val all = allCodecs ++ - otherHeaders.map { case (hdr,codec) => hdr.toLowerCase -> choice(codec, emptyHeader(hdr.toLowerCase)) }.toMap - SpinocoCodec.codec(maxHeaderLength, all.toSeq: _*) - } - - - val emptyString: Codec[Unit] = { - ascii.exmap( - s => if (s.trim.isEmpty) Attempt.successful(()) else Attempt.failure(Err("Expected end of input")), - _ => Attempt.successful("") - ) - } - - - def emptyHeader(name: String): Codec[HttpHeader] = - recover(emptyString).exmap( - _ => Attempt.successful(GenericHeader(name, "")), - _ => Attempt.successful(true)) - - val allCodecs = SpinocoCodec.allHeaderCodecs. - map { case (name, codec) => name -> choice(codec, emptyHeader(name)) } - -} diff --git a/modules/server/src/main/scala/sharry/server/config.scala b/modules/server/src/main/scala/sharry/server/config.scala deleted file mode 100644 index b6435d63..00000000 --- a/modules/server/src/main/scala/sharry/server/config.scala +++ /dev/null @@ -1,144 +0,0 @@ -package sharry.server - -import java.nio.file.Path -import java.util.UUID -import scodec.bits.ByteVector -import cats.effect.IO -import doobie.hikari._ -import pureconfig._ -import pureconfig.error._ -import pureconfig.ConvertHelpers._ -import spinoco.protocol.http.Uri -import yamusca.imports._ -import sharry.common.sizes._ -import sharry.common.file._ -import sharry.common.duration._ -import sharry.server.email._ - -object config { - - case class Jdbc(driver: String, url: String, user: String, password: String) { - def transactor: IO[HikariTransactor[IO]] = - HikariTransactor.newHikariTransactor[IO](driver, url, user, password) - } - - case class AuthConfig(enable: Boolean, defaultUser: String, maxCookieLifetime: Duration, appKey: ByteVector) - - case class AuthcCommand(enable: Boolean, program: Seq[String], success: Int) - - case class AuthcHttp(enable: Boolean, url: String, method: String, body: String, contentType: String) - - case class AdminAccount(enable: Boolean, login: String, password: String) - - case class WebConfig(bindHost: String - , bindPort: Int - , appName: String - , baseurl: String - , highlightjsTheme: String - , welcomeMessage: String) { - lazy val domain = Uri.parse(baseurl).require.host.host - } - - case class WebmailConfig(enable: Boolean - , defaultLanguage: String - , downloadTemplates: Map[String, Template] - , aliasTemplates: Map[String, Template] - , notifyTemplates: Map[String, Template]) { - - def findDownloadTemplate(lang: String): Option[(String, Template)] = - downloadTemplates.find(_._1 == lang) - - def findAliasTemplate(lang: String): Option[(String, Template)] = - aliasTemplates.find(_._1 == lang) - } - - case class LogConfig(config: Path) { - def exists = config.exists && !config.isDirectory - } - - case class UploadConfig( - chunkSize: Size - , simultaneousUploads: Int - , maxFiles: Int - , maxFileSize: Size - , maxValidity: Duration - , aliasDeleteTime: Duration - , enableUploadNotification: Boolean - , cleanupEnable: Boolean - , cleanupInterval: Duration - , cleanupInvalidAge: Duration - ) - - - trait Config { - def jdbc: Jdbc - def authConfig: AuthConfig - def authcCommand: AuthcCommand - def authcHttp: AuthcHttp - def adminAccount: AdminAccount - def webConfig: WebConfig - def uploadConfig: UploadConfig - def logConfig: LogConfig - def smtpConfig: SmtpSetting - def smtpSetting: GetSetting = - if (smtpConfig.host.isEmpty) (GetSetting.fromDomain andThen (_.map(_.copy(from = smtpConfig.from)))) - else GetSetting.of(smtpConfig) - def webmailConfig: WebmailConfig - } - - object Config { - object default extends Config { - val jdbc: Jdbc = loadConfig[Jdbc]("sharry.db").get - val authConfig: AuthConfig = loadConfig[AuthConfig]("sharry.authc").get - val authcCommand: AuthcCommand = loadConfig[AuthcCommand]("sharry.authc.extern.command").get - val authcHttp: AuthcHttp = loadConfig[AuthcHttp]("sharry.authc.extern.http").get - val adminAccount = loadConfig[AdminAccount]("sharry.authc.extern.admin").get - val webConfig = loadConfig[WebConfig]("sharry.web").get - val uploadConfig = loadConfig[UploadConfig]("sharry.upload").get - val logConfig = loadConfig[LogConfig]("sharry.log").get - val smtpConfig: SmtpSetting = loadConfig[SmtpSetting]("sharry.smtp").get - val webmailConfig: WebmailConfig = loadConfig[WebmailConfig]("sharry.web.mail").get - } - implicit final class ConfigEitherOps[A](r: Either[ConfigReaderFailures, A]) { - def get: A = r match { - case Right(a) => a - case Left(errs) => sys.error(errs.toString) - } - } - } - - implicit def hint[T] = ProductHint[T](ConfigFieldMapping(CamelCase, KebabCase)) - - implicit def templateConvert: ConfigReader[Template] = ConfigReader.fromString[Template](catchReadError(s => - mustache.parse(s) match { - case Right(t) => t - case Left(err) => throw new IllegalArgumentException(s"Template parsing failed: $err") - } - )) - - implicit def durationConvert: ConfigReader[Duration] = ConfigReader.fromString[Duration](catchReadError(s => - Duration.unsafeParse(s) - )) - - - implicit def bytevectorConvert: ConfigReader[ByteVector] = - ConfigReader.fromString[ByteVector](catchReadError(s => - s.span(_ != ':') match { - case ("", "") => ByteVector(UUID.randomUUID.toString.getBytes) - case ("b64", value) => ByteVector.fromValidBase64(value.drop(1)) - case ("hex", value) => ByteVector.fromValidHex(value.drop(1)) - case _ => throw new IllegalArgumentException(s"invalid bytes: $s. Make sure to prefix with either 'b64:' or 'hex:'.") - })) - - //we cannot delegate to Config#getBytes; see https://github.com/melrief/pureconfig/issues/86 - implicit def sizeConvert: ConfigReader[Size] = - ConfigReader.fromString[Size]( - catchReadError( - sz => sz.toLowerCase.last match { - case 'k' => KBytes(sz.dropRight(1).toDouble) - case 'm' => MBytes(sz.dropRight(1).toDouble) - case 'g' => GBytes(sz.dropRight(1).toDouble) - case _ => Bytes(sz.toLong) - })) - -} diff --git a/modules/server/src/main/scala/sharry/server/email/Address.scala b/modules/server/src/main/scala/sharry/server/email/Address.scala deleted file mode 100644 index 4bcc75e9..00000000 --- a/modules/server/src/main/scala/sharry/server/email/Address.scala +++ /dev/null @@ -1,26 +0,0 @@ -package sharry.server.email - -import javax.mail.internet.InternetAddress -import cats.effect.IO -import io.circe._ - -case class Address(mail: InternetAddress) { - lazy val address = mail.getAddress - lazy val personal = Option(mail.getPersonal) - lazy val domain: String = { - address.lastIndexOf('@') match { - case -1 => "" - case n => address.substring(n+1) - } - } -} - -object Address { - def parse(mail: String): IO[Address] = IO { - val a = new InternetAddress(mail) - a.validate - Address(a) - } - - implicit val _jsonEncoder: Encoder[Address] = Encoder.encodeString.contramap[Address](_.mail.toString) -} diff --git a/modules/server/src/main/scala/sharry/server/email/Header.scala b/modules/server/src/main/scala/sharry/server/email/Header.scala deleted file mode 100644 index 9f6e74fc..00000000 --- a/modules/server/src/main/scala/sharry/server/email/Header.scala +++ /dev/null @@ -1,19 +0,0 @@ -package sharry.server.email - -trait Header { - def name: String -} - -object Header { - case class GenericHeader(name: String, value: String) extends Header - - case class To(mail: Address) extends Header { - val name = To.name - } - object To { val name = "To" } - - case class Subject(line: String) extends Header { - val name = Subject.name - } - object Subject { val name = "Subject" } -} diff --git a/modules/server/src/main/scala/sharry/server/email/Mail.scala b/modules/server/src/main/scala/sharry/server/email/Mail.scala deleted file mode 100644 index a81190a1..00000000 --- a/modules/server/src/main/scala/sharry/server/email/Mail.scala +++ /dev/null @@ -1,49 +0,0 @@ -package sharry.server.email - -import cats.effect.IO -import cats._ -import cats.implicits._ - -import Header._ - -case class Mail(header: List[Header], body: Body) { - def withTo(m: Address): Mail = - withHeader(To(m)) - def addTo(m: Address): Mail = - copy(header = To(m) :: header) - def withSubject(line: String): Mail = - withHeader(Subject(line)) - - def recipients: List[Address] = header. - collect({ case To(a) => a }) - - def singleRecipient: String = - recipients.headOption.map(_.mail.toString) getOrElse "" - - /** Replace all same named headers with `h` */ - def withHeader(h: Header): Mail = { - val newHeader = (h :: header). - map(e => if (h.name == e.name) h else e). - groupBy(_.name). - map(_._2.head). - toList - copy(header = newHeader) - } - - def withTextBody(text: String): Mail = - copy(body = text) -} - -object Mail { - - def apply(to: String, subject: String, text: String): IO[Mail] = - for { - t <- Address.parse(to) - } yield Mail(List(To(t), Subject(subject)), text) - - def apply(to: List[String], subject: String, text: String): IO[Mail] = - for { - t <- Traverse[List].traverse(to)(Address.parse) - } yield Mail(Subject(subject) :: t.map(To.apply).toList, text) - -} diff --git a/modules/server/src/main/scala/sharry/server/email/SmtpSetting.scala b/modules/server/src/main/scala/sharry/server/email/SmtpSetting.scala deleted file mode 100644 index be705d4c..00000000 --- a/modules/server/src/main/scala/sharry/server/email/SmtpSetting.scala +++ /dev/null @@ -1,36 +0,0 @@ -package sharry.server.email - -import org.xbill.DNS._ -import cats.effect.IO -import cats.implicits._ - -case class SmtpSetting( - host: String, - port: Int, - user: String, - password: String, - from: String, - startTls: Boolean, - ssl: Boolean -) { - - def hidePass = copy(password = if (password.isEmpty) "" else "***") -} - - -object SmtpSetting { - def fromAddress(m: Address): IO[Option[SmtpSetting]] = - findMx(m.domain).handleError(_ => Nil). - map(_.headOption). - map(_.map(fromMx)) - - def fromMx(host: String): SmtpSetting = - SmtpSetting(host, 0, "", "", "", false, false) - - private def findMx(domain: String): IO[List[String]] = IO { - val records = new Lookup(domain, Type.MX).run() - .map(_.asInstanceOf[MXRecord]).toList.sortBy(_.getPriority) - - records.map(_.getTarget.toString.stripSuffix(".")) - } -} diff --git a/modules/server/src/main/scala/sharry/server/email/client.scala b/modules/server/src/main/scala/sharry/server/email/client.scala deleted file mode 100644 index 7188a442..00000000 --- a/modules/server/src/main/scala/sharry/server/email/client.scala +++ /dev/null @@ -1,123 +0,0 @@ -package sharry.server.email - -import javax.mail._ -import org.log4s._ -import shapeless.syntax.std.tuple._ -import cats.data.ValidatedNel -import cats.data.Validated.{Valid,Invalid} -import cats.implicits._ -import cats.effect.IO -import fs2.Stream - -import Header._ - -object client { - private[this] val logger = getLogger - - type Attempt[A] = Either[Throwable, A] - - def send_(setting: GetSetting)(mail: Mail): Stream[IO, Attempt[Mail]] = { - splitMail(mail). - evalMap(send1(setting)) - } - - def send(setting: GetSetting)(mail: IO[Mail]): Stream[IO, Attempt[Mail]] = - Stream.eval(mail).flatMap(send_(setting)) - - private def send1(setting: GetSetting)(mail: Mail): IO[Attempt[Mail]] = { - val mimeMsg = extract1(mail).flatMap { - case (to, subject, body, moreHeaders) => - for { - smtp <- setting(to) - sess <- makeSession(smtp) - msg <- IO { - val msg = new internet.MimeMessage(sess) - msg.setFrom(smtp.from) - msg.setRecipient(Message.RecipientType.TO, to.mail) - msg.setSubject(subject) - msg.setText(body) - moreHeaders.foreach { h => - msg.addHeader(h.name, h.value) - } - lazy val sout ={ - val out = new java.io.ByteArrayOutputStream() - msg.writeTo(out) - out - } - logger.debug(s"Createt mime message: ${new String(sout.toByteArray)}") - msg - } - } yield msg - } - - mimeMsg.map(Transport.send). - map(_ => mail). - handleErrorWith({ case ex => - logger.error(ex)(s"Error sending mail: $mail") - IO.raiseError(new Exception(mail.singleRecipient + ": "+ ex.getMessage)) - }). - attempt - } - - private def extract1(mail: Mail): IO[(Address, String, String, List[GenericHeader])] = { - def validate[A](l: List[A], msg: String): ValidatedNel[String, A] = l match { - case a :: Nil => Valid(a).toValidatedNel - case Nil => Invalid(s"There is no $msg.").toValidatedNel - case all => Invalid(s"There are more than one $msg: $all").toValidatedNel - } - - val tos = validate(mail.header.collect({case To(a) => a}), "recipient") - val subjects = validate(mail.header.collect({case Subject(line) => line}), "subject line") - val text = Valid(mail.body).toValidatedNel - val generic = mail.header.collect({case h: GenericHeader => h}) - - tos.product(subjects).product(text) match { - case Valid((t1, t)) => IO.pure(t1 :+ t :+ generic) - case Invalid(msgs) => IO.raiseError(new Exception(msgs.toList.mkString(", "))) - } - } - - private def makeSession(setting: SmtpSetting): IO[Session] = { - val props = System.getProperties() - logger.debug(s"Make mail session from ${setting.hidePass}") - props.setProperty("mail.transport.protocol", "smtp"); - if (setting.host.nonEmpty) { - logger.debug(s"Using mail host ${setting.host}") - props.setProperty(s"mail.smtp.host", setting.host) - if (setting.port > 0) { - logger.debug(s"Using mailport ${setting.port}") - props.setProperty("mail.smtp.port", setting.port.toString) - } - if (setting.user.nonEmpty) { - props.setProperty("mail.user", setting.user) - props.setProperty("mail.smtp.auth", "true") - } - if (setting.startTls) { - props.setProperty("mail.smtp.starttls.enable", "true") - } - if (setting.ssl) { - props.setProperty("mail.smtp.ssl.enable", "true") - } - } - if (Option(props.getProperty("mail.smtp.host")).exists(_.nonEmpty)) - IO.pure { - if (setting.user.nonEmpty) { - Session.getInstance(props, new Authenticator() { - override def getPasswordAuthentication() = { - logger.debug(s"Authenticating with ${setting.user}/${setting.hidePass.password}") - new PasswordAuthentication(setting.user, setting.password) - } - }) - } else { - Session.getInstance(props) - } - } - else - IO.raiseError(new Exception("no smtp host provided")) - } - - private def splitMail(m: Mail): Stream[IO, Mail] = { - Stream.emits(m.header.filter(_.name == To.name). - map(to => m.withHeader(to))) - } -} diff --git a/modules/server/src/main/scala/sharry/server/email/package.scala b/modules/server/src/main/scala/sharry/server/email/package.scala deleted file mode 100644 index 0b7034bd..00000000 --- a/modules/server/src/main/scala/sharry/server/email/package.scala +++ /dev/null @@ -1,21 +0,0 @@ -package sharry.server - -import cats.effect.IO - -/** Utility for sending simple (text) emails. */ -package object email { - type Body = String - - type GetSetting = Address => IO[SmtpSetting] - - object GetSetting { - def of(s: SmtpSetting): GetSetting = - _ => IO.pure(s) - - val fromDomain: GetSetting = - a => SmtpSetting.fromAddress(a).flatMap { - case Some(s) => IO.pure(s) - case None => IO.raiseError(new Exception(s"No smtp host found for address $a")) - } - } -} diff --git a/modules/server/src/main/scala/sharry/server/main.scala b/modules/server/src/main/scala/sharry/server/main.scala deleted file mode 100644 index 368f63b9..00000000 --- a/modules/server/src/main/scala/sharry/server/main.scala +++ /dev/null @@ -1,187 +0,0 @@ -package sharry.server - -import java.time.Instant -import java.net.InetSocketAddress -import java.util.concurrent.{Executors, ThreadFactory} -import java.util.concurrent.atomic.AtomicLong -import java.nio.file.{Path, Paths} -import java.nio.channels.AsynchronousChannelGroup -import scala.concurrent.ExecutionContext -import scala.concurrent.duration._ - -import fs2._ -import cats.effect.IO -import cats.implicits._ -import scodec.{Attempt, Codec} -import spinoco.fs2.http -import spinoco.fs2.http.HttpResponse -import spinoco.fs2.http.body.BodyEncoder -import spinoco.fs2.http.routing._ -import spinoco.protocol.http.HttpRequestHeader -import spinoco.protocol.http.HttpStatusCode -import spinoco.protocol.http.codec.HttpRequestHeaderCodec - -import org.log4s._ - -import sharry.common.BuildInfo -import sharry.common.file._ -import sharry.common.streams -import sharry.common.version -import sharry.store.evolution -import sharry.server.codec.HttpHeaderCodec - -object main { - implicit val logger = getLogger - - def main(args: Array[String]): Unit = { - - implicit val EC = ExecutionContext.fromExecutorService(Executors.newCachedThreadPool(new ThreadFactory() { - private val counter = new AtomicLong(0) - def newThread(r: Runnable) = - new Thread(r, s"sharry-${counter.getAndIncrement}") - })) - implicit val ACG = AsynchronousChannelGroup.withThreadPool(EC) // http.server requires a group - val EC2 = Executors.newScheduledThreadPool(5) - implicit val SCH = Scheduler.fromScheduledExecutorService(EC2) - - logger.info(s""" - |–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - | Sharry ${version.longVersion} build at ${BuildInfo.builtAtString.dropRight(4)}UTC is starting up … - |––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––""".stripMargin) - val startupCfg = StartConfig.parse(args) - startupCfg.setup.unsafeRunSync - val app = new App(config.Config.default) - - logger.info(""" - |–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - | • Running initialize tasks … - |––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––""".stripMargin) - evolution(app.cfg.jdbc.url).runChanges(app.jdbc).unsafeRunSync - async.start(startCleanup(app)).unsafeRunSync - - val shutdown = - for { - _ <- IO(logger.info("Closing database")) - _ <- IO(app.jdbc.kernel.close()) - _ <- IO(logger.info("Closing threadpools")) - _ <- IO(EC2.shutdown()) - _ <- IO(EC.shutdown()) - } yield () - - val server = http.server[IO]( - bindTo = new InetSocketAddress(app.cfg.webConfig.bindHost, app.cfg.webConfig.bindPort), - requestCodec = requestHeaderCodec, - requestHeaderReceiveTimeout = 10.seconds, - sendFailure = handleSendFailure _, // (Option[HttpRequestHeader], HttpResponse[F], Throwable) => Stream[F, Nothing], - requestFailure = logRequestErrors _)(route(app.endpoints)). - onFinalize(shutdown) - - logger.info(s""" - |–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– - | • Starting http server at ${app.cfg.webConfig.bindHost}:${app.cfg.webConfig.bindPort} - |––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––""".stripMargin) - - if (startupCfg.console) { - startWithConsole(server).unsafeRunSync - } else { - server.compile.drain.unsafeRunSync - } - } - - - private def startWithConsole(server: Stream[IO,Unit]): IO[Unit] = { - implicit val ec = ExecutionContext.Implicits.global - async.signalOf[IO, Boolean](false).flatMap ({ interrupt => - for { - wait1 <- async.start(server.interruptWhen(interrupt).compile.drain) - _ <- IO(println("Hit RETURN to stop the server")) - _ <- IO(scala.io.StdIn.readLine()) - _ <- interrupt.set(true) - _ <- wait1 - _ <- IO(logger.info("Sharry has stopped")) - } yield () - }) - } - - private def startCleanup(app: App)(implicit SCH: Scheduler, EC: ExecutionContext): IO[Unit] = { - val cfg = app.uploadConfig - if (cfg.cleanupEnable) { - logger.info(s"Scheduling cleanup job every ${cfg.cleanupInterval}") - val stream = SCH.awakeEvery[IO](cfg.cleanupInterval.asScala). - flatMap({ _ => - logger.info("Running cleanup job") - val since = Instant.now.minus(cfg.cleanupInvalidAge.asJava) - app.uploadStore.cleanup(since). - through(streams.ifEmpty(Stream.emit(0))).fold1(_ + _). - evalMap(n => IO(logger.info(s"Cleanup job removed $n uploads"))) ++ - Stream.eval(IO(logger.info("Cleanup job done."))).drain - }) - - stream.compile.drain - } else { - logger.info("Not starting cleanup job as requested") - IO.pure(()) - } - } - - private def logRequestErrors[F[_]](error: Throwable): Stream[F, HttpResponse[F]] = Stream.suspend { - implicit val enc = BodyEncoder.utf8String - logger.error(error)("Error in request") - Stream.emit(HttpResponse[F](HttpStatusCode.InternalServerError).withBody(error.getClass + ":" + error.getMessage)).covary[F] - } - - private def handleSendFailure[F[_]](header: Option[HttpRequestHeader], response: HttpResponse[F], err:Throwable): Stream[F, Nothing] = { - Stream.suspend { - err match { - case _: java.io.IOException if err.getMessage == "Broken pipe" || err.getMessage == "Connection reset by peer" => - logger.warn(s"Error sending response: ${err.getMessage}! Request headers: ${header}") - case _ => - logger.error(err)(s"Error sending response! Request headers: ${header}") - } - Stream.empty - } - } - - private def requestHeaderCodec: Codec[HttpRequestHeader] = { - val codec = HttpRequestHeaderCodec.codec(HttpHeaderCodec.codec(Int.MaxValue)) - Codec ( - h => codec.encode(h), - v => codec.decode(v) match { - case a: Attempt.Successful[_] => a - case f@ Attempt.Failure(cause) => - logger.error(s"Error parsing request ${v.decodeUtf8} \n$cause") - f - } - ) - } - - case class StartConfig(console: Boolean, configFile: Option[Path]) { - def setup: IO[Unit] = IO { - configFile.foreach { f => - logger.info(s"Using config file $f") - System.setProperty("config.file", f.toString) - } - } - } - - object StartConfig { - - def parse(args: Seq[String]): StartConfig = { - val console = { - args.exists(_ == "--console") || - Option(System.getProperty("sharry.console")). - exists(_ equalsIgnoreCase "true") - } - - val file = args.find(_ != "--console"). - map(f => Paths.get(f)). - orElse { - Option(System.getProperty("sharry.optionalConfig")). - map(f => Paths.get(f)). - filter(_.exists) - } - - StartConfig(console, file) - } - } -} diff --git a/modules/server/src/main/scala/sharry/server/notification.scala b/modules/server/src/main/scala/sharry/server/notification.scala deleted file mode 100644 index fc5ad18f..00000000 --- a/modules/server/src/main/scala/sharry/server/notification.scala +++ /dev/null @@ -1,102 +0,0 @@ -package sharry.server - -import java.time.Instant -import fs2.{async, Scheduler, Stream} -import cats.effect.IO -import yamusca.implicits._ -import scala.concurrent.ExecutionContext - -import sharry.store.upload.UploadStore -import sharry.store.account.AccountStore -import sharry.store.data.Alias -import sharry.common.streams -import sharry.common.duration._ -import sharry.common.data._ -import sharry.server.config._ -import sharry.server.email._ - -object notification { - - type Notifier = (String, Alias, Duration) => Stream[IO,Unit] - - def scheduleNotify(smtp: GetSetting - , webCfg: WebConfig - , mailCfg: WebmailConfig - , store: UploadStore - , accounts: AccountStore) - (implicit SCH: Scheduler, EC: ExecutionContext): Notifier = { (id, alias, time) => - - val send = client.send_(smtp)_ - val workTask = findRecipient(id, alias, store, accounts). - evalMap(makeNotifyMail(webCfg, mailCfg)). - flatMap(send). - compile.drain - - checkAliasAccess(id, alias, time, store).flatMap { - case true => - findRecipient(id, alias, store, accounts). - evalMap(_ => async.start(schedule(workTask, time))). - map(_ => ()) - - case false => - Stream.emit(()) - } - } - - private def schedule[A](task: IO[A], delay: Duration) - (implicit SCH: Scheduler, EC: ExecutionContext): IO[Unit] = { - - SCH.sleep[IO](delay.asScala).evalMap(_ => task).compile.drain - } - - def checkAliasAccess(id: String - , alias: Alias - , time: Duration - , store: UploadStore) = { - // a request authorized by an alias id to delete an upload is only - // valid if issued less than X minutes after uploading and it was - // initially uploaded by this alias - val now = Instant.now - store.getUpload(id, alias.login). - map({ info => - info.upload.alias == Some(alias.id) && - info.upload.created.plus(time.asJava).isAfter(now) - }) - } - - - def makeNotifyMail(webCfg: WebConfig, mailCfg: WebmailConfig) - (data: (Upload, String)): IO[Mail] = { - val (upload, recipient) = data - val templ = mailCfg.notifyTemplates(mailCfg.defaultLanguage) - val ctx = Map( - "username" -> Some(upload.login) - , "uploadId" -> Some(upload.id) - , "alias" -> upload.aliasName - , "aliasId" -> upload.alias - , "uploadUrl" -> Some(webCfg.baseurl + "#uid=" + upload.id) - ) - val text = ctx.render(templ) - val (subject, body) = text.span(_ != '\n') - Mail(to = recipient - , subject = subject - , text = body) - } - - def findRecipient(uploadId: String - , alias: Alias - , store: UploadStore - , accounts: AccountStore): Stream[IO,(Upload,String)] = - for { - info <- { - store.getUpload(uploadId, alias.login). - filter(_.upload.alias == Some(alias.id)) - } - receiver <- { - accounts.getAccount(alias.login). - filter(_.enabled). - map(_.email). - through(streams.optionToEmpty) - } - } yield (info.upload, receiver) -} diff --git a/modules/server/src/main/scala/sharry/server/paths.scala b/modules/server/src/main/scala/sharry/server/paths.scala deleted file mode 100644 index 237055d2..00000000 --- a/modules/server/src/main/scala/sharry/server/paths.scala +++ /dev/null @@ -1,76 +0,0 @@ -package sharry.server - -import cats.effect.IO -import spinoco.fs2.http.routing._ - -/** Collection of paths used by the rest api and that is transferred - * to the web client.*/ -object paths { - val api1 = Path("api", "v1") - - val mounts = Map( - "authLogin" -> api1/"auth"/"login", - "authCookie" -> api1/"auth"/"cookie", - "logout" -> api1/"auth"/"logout", - "accounts" -> api1/"accounts", - "profileEmail" -> api1/"profile"/"email", - "profilePassword" -> api1/"profile"/"password", - "uploads" -> api1/"uploads", - "uploadData" -> api1/"upload-data", - "uploadPublish" -> api1/"upload-publish", - "uploadUnpublish" -> api1/"upload-unpublish", - "download" -> api1/"dl"/"file", - "downloadPublished" -> Path("dlp")/"file", - "checkPassword" -> api1/"check-password", - "aliases" -> api1/"aliases", - "mailCheck" -> api1/"mail"/"check", - "mailSend" -> api1/"mail"/"send", - "mailDownloadTemplate" -> api1/"mail"/"download-template", - "mailAliasTemplate" -> api1/"mail"/"alias-template", - "uploadNotify" -> api1/"upload-notify", - "manual" -> Path("manual"), - "settings" -> api1/"settings" - ) - - def authLogin = mounts("authLogin").matcher - def authCookie = mounts("authCookie").matcher - def logout = mounts("logout") - def accounts = mounts("accounts") - def profileEmail = mounts("profileEmail") - def profilePassword = mounts("profilePassword") - def uploads = mounts("uploads") - def uploadData = mounts("uploadData") - def uploadPublish = mounts("uploadPublish") - def uploadUnpublish = mounts("uploadUnpublish") - def download = mounts("download") - def downloadPublished = mounts("downloadPublished") - def checkPassword = mounts("checkPassword") - def aliases = mounts("aliases") - def mailCheck = mounts("mailCheck") - def mailSend = mounts("mailSend") - def mailDownloadTemplate = mounts("mailDownloadTemplate") - def mailAliasTemplate = mounts("mailAliasTemplate") - def uploadNotify = mounts("uploadNotify") - def manual = mounts("manual") - def settings = mounts("settings") - - case class Path(segments: List[String]) { - def matcherF[F[_]]: Matcher[F, String] = segments match { - case Nil => empty.map(_ => "") - case a :: Nil => a - case a :: b :: Nil => a / b - case a :: b :: rest => rest.foldLeft(a / b)(_ / _) - } - def matcher = matcherF[IO] - def path = segments.mkString("/", "/", "") - - def /(next: String) = Path(segments :+ next) - } - - object Path { - val root = Path(Nil) - def apply(segs: String*): Path = - if (segs.isEmpty) root - else Path(segs.toList) - } -} diff --git a/modules/server/src/main/scala/sharry/server/routes/UserId.scala b/modules/server/src/main/scala/sharry/server/routes/UserId.scala deleted file mode 100644 index 47b6e8dd..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/UserId.scala +++ /dev/null @@ -1,21 +0,0 @@ -package sharry.server.routes - -import sharry.store.data.Alias - -sealed trait UserId { - def login: String - def alias: Option[Alias] - def aliasId: Option[String] = alias.map(_.id) -} -case class Username(login: String) extends UserId { - val alias = None -} -case class AliasId(a: Alias) extends UserId { - override val aliasId = Some(a.id) - val alias = Some(a) - val login = a.login -} -object UserId { - def apply(alias: Alias): UserId = AliasId(alias) - def apply(login: String): UserId = Username(login) -} diff --git a/modules/server/src/main/scala/sharry/server/routes/account.scala b/modules/server/src/main/scala/sharry/server/routes/account.scala deleted file mode 100644 index 034fad37..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/account.scala +++ /dev/null @@ -1,136 +0,0 @@ -package sharry.server.routes - -import cats.data.{Validated, ValidatedNel} -import cats.implicits._ -import fs2.Stream -import cats.effect.IO -import com.github.t3hnar.bcrypt._ -import shapeless.{::,HNil} -import spinoco.fs2.http.routing._ - -import sharry.common.streams -import sharry.common.data.Account -import sharry.store.account.AccountStore -import sharry.server.config.{AuthConfig, WebConfig} -import sharry.server.authc._ -import sharry.server.paths -import sharry.server.email.Address -import sharry.server.routes.syntax._ - -object account { - - def endpoint(auth: Authenticate, authCfg: AuthConfig, store: AccountStore, cfg: WebConfig) = - choice2(listLogins(auth, store) - , createAccount(auth, store) - , modifyAccount(auth, store) - , updateEmail(authCfg, store) - , updatePassword(authCfg, store) - , getAccount(auth, store)) - - def createAccount(auth: Authenticate, store: AccountStore): Route[IO] = - Put >> paths.accounts.matcher >> authz.admin(auth) >> jsonBody[Account] map { (a: Account) => - val acc = a.copy( - password = a.password.map(_.bcrypt), - email = a.email.filter(_.nonEmpty) - ) - validateAccount(acc) match { - case Validated.Invalid(errs) => - Stream.emit(BadRequest.message(s"Invalid account: ${errs.toList.mkString(", ")}")) - case Validated.Valid(_) => - store.getAccount(acc.login). - map(a => BadRequest.message("The account already exists")). - through(streams.ifEmpty { - store.createAccount(acc). - map(_ => Created.body(acc.noPass)) - }) - } - } - - def validateEmail(address: String): ValidatedNel[String, Unit] = { - val parsed = Address.parse(address). - map(_ => ()). - attempt. - map(_.leftMap(_.getMessage)) - - Validated. - fromEither(parsed.unsafeRunSync). - toValidatedNel - } - - def validateAccount(a: Account): ValidatedNel[String, Account] = { - // validate email - val v1 = a.email.map(validateEmail).getOrElse(Validated.valid(()).toValidatedNel) - - // validate rest of account - val v2 = Account.validate(a).map(_ => ()) - - (v1 |+| v2).map(_ => a) - } - - def modifyAccount(auth: Authenticate, store: AccountStore): Route[IO] = - Post >> paths.accounts.matcher >> authz.admin(auth) >> jsonBody[Account] map { - (account: Account) => - validateAccount(account) match { - case Validated.Invalid(errs) => - Stream.emit(BadRequest.message(s"Invalid account: ${errs.toList.mkString(", ")}")) - case _ => - store.getAccount(account.login). - map(dba => account.copy( - password = account.password match { - case Some(pw) if pw.nonEmpty => Some(pw.bcrypt) - case _ => dba.password - }, - email = account.email.filter(_.nonEmpty) - )). - flatMap(a => store.updateAccount(a).map(_ => a)). - map(Ok.body(_)). - through(NotFound.whenEmpty) - } - } - - def updateEmail(cfg: AuthConfig, store: AccountStore): Route[IO] = - Post >> paths.profileEmail.matcher >> authz.user(cfg) :: jsonBody[Account] map { - case login :: account :: HNil => - validateAccount(account) match { - case Validated.Invalid(errs) => - Stream.emit(BadRequest.message(s"Invalid account: ${errs.toList.mkString(", ")}")) - case _ => - store.updateEmail(login, account.email). - flatMap { - case true => store.getAccount(login).map(Ok.body(_)) - case false => Stream.emit(NotFound.noBody) - } - } - } - - def updatePassword(cfg: AuthConfig, store: AccountStore): Route[IO] = - Post >> paths.profilePassword.matcher >> authz.user(cfg) :: jsonBody[Account] map { - case login :: account :: HNil => - validateAccount(account) match { - case Validated.Invalid(errs) => - Stream.emit(BadRequest.message(s"Invalid account: ${errs.toList.mkString(", ")}")) - case _ => - store.updatePassword(login, account.password.map(_.bcrypt)). - flatMap { - case true => store.getAccount(login).map(Ok.body(_)) - case false => Stream.emit(NotFound.noBody) - } - } - } - - def listLogins(auth: Authenticate, store: AccountStore): Route[IO] = - Get >> paths.accounts.matcher/empty >> authz.admin(auth) / param[String]("q").? map { (q: Option[String]) => - Stream.eval(store.listLogins(q.getOrElse(""), None).compile.toVector). - map(Ok.body(_)) - } - - def getAccount(auth: Authenticate, store: AccountStore): Route[IO] = - Get >> paths.accounts.matcher / as[String] - Account.validateLogin(login) match { - case Validated.Invalid(errs) => - Stream.emit(BadRequest.message(s"Invalid login: ${errs.toList.mkString(", ")}")) - case _ => - store.getAccount(login).map(Ok.body(_)) - } - } -} diff --git a/modules/server/src/main/scala/sharry/server/routes/alias.scala b/modules/server/src/main/scala/sharry/server/routes/alias.scala deleted file mode 100644 index 49ba7703..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/alias.scala +++ /dev/null @@ -1,72 +0,0 @@ -package sharry.server.routes - -import shapeless.{::, HNil} -import fs2.Stream -import cats.effect.IO -import cats.Order -import spinoco.fs2.http.routing._ - -import sharry.common.data._ -import sharry.common.duration._ -import sharry.common.streams -import sharry.store.data._ -import sharry.server.paths -import sharry.server.config._ -import sharry.store.upload.UploadStore -import sharry.server.routes.syntax._ - -object alias { - - def endpoint(auth: AuthConfig, uploadCfg: UploadConfig, store: UploadStore) = - choice2(updateAlias(auth, uploadCfg, store) - , createAlias(auth, uploadCfg, store) - , getAlias(store) - , listAliases(auth, store) - , deleteAlias(auth, store)) - - def updateAlias(authCfg: AuthConfig, cfg: UploadConfig, store: UploadStore): Route[IO] = - Post >> paths.aliases.matcher / as[String] :: authz.user(authCfg) :: jsonBody[AliasUpdate] map { - case aliasId :: login :: alias :: HNil => - val a = Alias.generate(login, alias.name, Duration.zero). - copy(id = alias.id). - copy(enable = alias.enable) - Duration.parse(alias.validity). - ensure("Validity time is too long.")(cfg.maxValidity >= _). - map(v => a.copy(validity = v)). - andThen(a => Alias.validateId(a.id).map(_ => a)). - map(a => store.getAlias(a.id). - filter(a => a.id != aliasId). - map(_ => BadRequest.message(s"An alias with id '${a.id}' already exists.")). - through(streams.ifEmpty( - store.updateAlias(a, aliasId). - map({ n => if (n == 0) NotFound.body("0") else Ok.body(a) })))). - valueOr(msg => Stream.emit(BadRequest.message(msg))) - } - - def createAlias(authCfg: AuthConfig, cfg: UploadConfig, store: UploadStore): Route[IO] = - Post >> paths.aliases.matcher >> authz.user(authCfg) map { (login: String) => - val alias = Alias.generate(login, "New alias", Order[Duration].min(5.days, cfg.maxValidity)) - store.createAlias(alias). - map(_ => Ok.body(alias)) - } - - def listAliases(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Get >> paths.aliases.matcher >> authz.user(authCfg) map { (login: String) => - Stream.eval(store.listAliases(login).compile.toVector). - map(Ok.body(_)) - } - - def getAlias(store: UploadStore): Route[IO] = - Get >> paths.aliases.matcher / as[String] map { (id: String) => - store.getActiveAlias(id). - map(Ok.body(_)). - through(NotFound.whenEmpty) - } - - def deleteAlias(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Delete >> paths.aliases.matcher / as[String] :: authz.user(authCfg) map { - case id :: login :: HNil => - store.deleteAlias(id, login). - map({ n => if (n == 0) NotFound.body("0") else Ok.body(n.toString) }) - } -} diff --git a/modules/server/src/main/scala/sharry/server/routes/authz.scala b/modules/server/src/main/scala/sharry/server/routes/authz.scala deleted file mode 100644 index 8007f5b5..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/authz.scala +++ /dev/null @@ -1,54 +0,0 @@ -package sharry.server.routes - -import java.time.Instant - -import cats.effect.IO -import spinoco.fs2.http.routing._ -import spinoco.protocol.http._ - -import sharry.common.data.Account -import sharry.store.data.Alias -import sharry.store.upload.UploadStore -import sharry.server.authc._ -import sharry.server.config._ -import sharry.server.routes.syntax._ - -object authz { - val aliasHeaderName = "X-Sharry-Alias" - - def user(cfg: AuthConfig): Matcher[IO, String] = - if (!cfg.enable) Matcher.success(cfg.defaultUser) - else login.sharryCookie.flatMap { - case token if token.verify(Instant.now, cfg.appKey) => - Matcher.success(token.login) - case _ => - Matcher.respond(Unauthorized.message("Not authenticated")) - } - - def admin(auth: Authenticate): Matcher[IO, Account] = - login.sharryCookie. - evalMap(token => auth.authc(token, Instant.now).compile.last). - flatMap { - case Some(Right(account)) => - if (account.admin) Matcher.success(account) - else Matcher.respond(Forbidden.message("Not authorized for admin actions")) - case Some(Left(err)) => - Matcher.respond(Unauthorized.message("Not authenticated.")) - case None => - Matcher.respondWith(HttpStatusCode.InternalServerError) - } - - def userId(cfg: AuthConfig, store: UploadStore): Matcher[IO, UserId] = - // if alias page is used, it is preferred even if the user is logged in currently - alias(store).map(UserId.apply) or user(cfg).map(UserId.apply) - - - def alias(store: UploadStore): Matcher[IO, Alias] = { - syntax.aliasId. - evalMap(id => store.getActiveAlias(id).compile.last). - flatMap { - case Some(alias) => Matcher.success(alias) - case None => Matcher.respondWith(HttpStatusCode.Forbidden) - } - } -} diff --git a/modules/server/src/main/scala/sharry/server/routes/download.scala b/modules/server/src/main/scala/sharry/server/routes/download.scala deleted file mode 100644 index dc42d441..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/download.scala +++ /dev/null @@ -1,174 +0,0 @@ -package sharry.server.routes - -import java.time.Instant -import cats.data.Ior -import fs2.{Pipe, Stream} -import cats.effect.IO -import shapeless.{::,HNil} -import scodec.bits.{BitVector, ByteVector} -import spinoco.protocol.mime.ContentType -import spinoco.fs2.http.body.StreamBodyEncoder -import spinoco.fs2.http.HttpResponse -import spinoco.fs2.http.routing._ -import bitpeace.RangeDef - -import sharry.common.data._ -import sharry.common.mime._ -import sharry.common.streams -import sharry.server.paths -import sharry.server.config._ -import sharry.store.upload.UploadStore -import sharry.server.routes.syntax._ - -object download { - - type ResponseOr[A] = Either[HttpResponse[IO], A] - - def endpoint(auth: AuthConfig, webCfg: WebConfig, store: UploadStore) = - choice2(download(auth, store) - , downloadPublished(webCfg, store) - , downloadHead(auth, store) - , downloadPublishedHead(store) - , checkPassword(webCfg, store)) - - - def download(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Get >> paths.download.matcher / as[String] :: range :: ifNoneMatch :: authz.user(authCfg) map { - case id :: bytes :: noneMatch :: user :: HNil => - // get file if owned by user - store.getUploadByFileId(id, user). - map({ case (_, f) => Right(f) }). - through(unmodifiedWhen(noneMatch, f => f.meta.id, standardHeaders)). - through(bytes.map(deliverPartial(store)).getOrElse(deliver(store))). - through(NotFound.whenEmpty) - } - - def downloadHead(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Head >> paths.download.matcher / as[String] :: authz.user(authCfg) map { - case id :: user :: HNil => - store.getUploadByFileId(id, user). - map(_._2). - map(standardHeaders). - map(Ok.noBody ++ _). - through(NotFound.whenEmpty) - } - - def downloadPublished(webCfg: WebConfig, store: UploadStore): Route[IO] = - Get >> paths.downloadPublished.matcher / as[String] :: range :: ifNoneMatch :: sharryPass map { - case id :: bytes :: noneMatch :: pass :: HNil => - store.getPublishedUploadByFileId(id). - through(checkDownloadFile(pass)). - through(unmodifiedWhen(noneMatch, f => f.meta.id, standardHeaders)). - through(bytes.map(deliverPartial(store)).getOrElse(deliver(store))). - through(NotFound.whenEmpty) - } - - def downloadPublishedHead(store: UploadStore): Route[IO] = - Head >> paths.downloadPublished.matcher / as[String] :: sharryPass map { - case id :: pass :: HNil => - store.getPublishedUploadByFileId(id). - through(checkDownloadFile(pass)). - map(_.map(Ok.noBody ++ standardHeaders(_))). - map(_.fold(identity, identity)). - through(NotFound.whenEmpty) - } - - - def checkPassword(cfg: WebConfig, store: UploadStore): Route[IO] = - Post >> paths.checkPassword.matcher / as[String] :: jsonBody[Pass].? map { - case id :: pass :: HNil => - - val makeCookie = withCookie[IO](cfg.domain, paths.downloadPublished.path)( - "sharry_dlpassword", pass.map(_.password).getOrElse("")) - - store.getPublishedUpload(id).map({ info => - Upload.checkPassword(info.upload, pass.map(_.password)). - leftMap(err => List(err)). - map(_ => List[String]()). - toEither. - fold( - l => Ok.body(l), - l => Ok.body(l) ++ makeCookie, - )}). - through(NotFound.whenEmpty) - } - - private def sharryPass: Matcher[Nothing, Option[String]] = - cookie("sharry_dlpassword").map(_.content).? - - - private def deliverPartial(store: UploadStore)(bytes: Ior[Int, Int]): Pipe[IO, ResponseOr[UploadInfo.File], HttpResponse[IO]] = - _.map({ - case Right(file) => - val data = store.fetchData(RangeDef.byteRange(bytes))(Stream.emit(file)). - through(streams.toByteChunks) - - val mt = file.meta.mimetype - PartialContent.streamBody(data)(encoder(mt)) ++ - withContentLength(bytes, file.meta.length) ++ - withContentRange(bytes, file.meta.length) ++ - withAcceptRanges ++ - withDisposition("inline", file.filename) - case Left(r) => r - }) - - private def deliver(store: UploadStore): Pipe[IO, ResponseOr[UploadInfo.File], HttpResponse[IO]] = - _.map({ - case Right(file) => - val data = store.fetchData(RangeDef.all)(Stream.emit(file)). - through(streams.toByteChunks) - - val mt = file.meta.mimetype - Ok.streamBody(data)(encoder(mt)) ++ standardHeaders(file) - case Left(r) => r - }) - - private def unmodifiedWhen[A](tagOpt: Option[String] - , id: A => String - , modify: A => ResponseUpdate[IO]): Pipe[IO, ResponseOr[A], ResponseOr[A]] = - tagOpt match { - case None => identity - case Some(tag) => - _.map(_.flatMap { a => - if (id(a) == tag) Left(NotModified.noBody ++ modify(a)) - else Right(a) - }) - } - - private def checkDownload1[A](pass: Option[String]): Pipe[IO, (Upload, A), ResponseOr[(Upload, A)]] = - _.map { case (upload, a) => - Upload.checkUpload(upload, Instant.now, upload.downloads, pass). - leftMap(err => BadRequest.body(err.toList)). - map(_ => (upload, a)). - toEither - } - - private def checkDownloadFile(pass: Option[String]): Pipe[IO, (Upload, UploadInfo.File), ResponseOr[UploadInfo.File]] = - _.through(checkDownload1(pass)). - map(_.map(_._2)) - - // private def checkDownload[A](pass: Option[String]): Pipe[IO, UploadInfo, ResponseOr[UploadInfo]] = - // _.map(u => (u.upload, u)). - // through(checkDownload1(pass)). - // map(_.map(_._2)) - - private def encoder(mt: MimeType): StreamBodyEncoder[IO, ByteVector] = - StreamBodyEncoder.byteVectorEncoder.withContentType(asContentType(mt)) - - private def asContentType(mt: MimeType): ContentType = - // TODO getOrElse octet-stream - ContentType.codec.decodeValue(BitVector(mt.asString.getBytes)).require - - private def standardHeaders(file: UploadInfo.File): ResponseUpdate[IO] = - _ ++ withContentLength(file.meta.length.toBytes) ++ - withAcceptRanges ++ - withETag(file.meta.id) ++ - withLastModified(file.meta.timestamp) ++ - withDisposition("inline", file.filename) - - // private def standardHeaders(info: UploadInfo): ResponseUpdate[IO] = { - // _ ++ withLastModified(info.upload.created) ++ - // info.upload.publishId.map(withETag[IO]).getOrElse(ResponseUpdate.identity[IO]) - // } - -} diff --git a/modules/server/src/main/scala/sharry/server/routes/login.scala b/modules/server/src/main/scala/sharry/server/routes/login.scala deleted file mode 100644 index 0c408a9d..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/login.scala +++ /dev/null @@ -1,77 +0,0 @@ -package sharry.server.routes - -import java.time.Instant - -import scodec.bits.ByteVector -import cats.syntax.either._ -import fs2.Stream -import cats.effect.IO -import spinoco.protocol.http.header.value.HttpCookie -import spinoco.protocol.http.header.`Set-Cookie` -import spinoco.fs2.http.routing._ -import spinoco.fs2.http.HttpResponse - -import sharry.common.duration._ -import sharry.common.data._ -import sharry.server.config.{AuthConfig, WebConfig} -import sharry.server.paths -import sharry.server.authc._ -import sharry.server.routes.syntax._ - -object login { - - def endpoint(auth: Authenticate, cfg: WebConfig, authCfg: AuthConfig) = { - val domain = cfg.domain - choice(doLogin(byPass(auth), domain, authCfg), doLogin(byCookie(auth), domain, authCfg), removeCookie(domain)) - } - - def byPass(auth: Authenticate): Matcher[IO, Stream[IO, AuthResult]] = - paths.authLogin >> jsonBody[UserPass] map { (up: UserPass) => - auth.authc(up.login, up.pass) - } - - def byCookie(auth: Authenticate): Matcher[IO, Stream[IO, AuthResult]] = - paths.authCookie >> sharryCookie map { (token: Token) => - auth.authc(token, Instant.now) - } - - def sharryCookie: Matcher[IO, Token] = - cookie(cookieName).map { (c: HttpCookie) => - Token.parse(c.content) - } - - - def doLogin(e: Matcher[IO, Stream[IO,AuthResult]], domain: String, cfg: AuthConfig): Route[IO] = { - def makeResponse(ar: AuthResult): HttpResponse[IO] = ar. - map(acc => Ok.body(acc.noPass).withHeader(`Set-Cookie`(makeCookie(acc, domain, cfg.maxCookieLifetime, cfg.appKey)))). - valueOr(err => Unauthorized.message(err)) - - Post >> e map { (s: Stream[IO,AuthResult]) => - s.map(makeResponse) - } - } - - def removeCookie(domain: String): Route[IO] = - Get >> paths.logout.matcher map { _ => - val c = makeCookie(Token.invalid, domain).copy(maxAge = Some(0.seconds.asScala)) - Stream.emit(Ok.noBody.withHeader(`Set-Cookie`(c))) - } - - def makeCookie(t: Token, domain: String): HttpCookie = { - HttpCookie(name = cookieName - , content = t.asString - , httpOnly = true - , maxAge = Some(Duration.between(Instant.now, t.ends).asScala) - , path = Some(paths.api1.path) - , domain = Some(domain) - , params = Map.empty - , expires = None - , secure = false - ) - } - - def makeCookie(a: Account, domain: String, cookieAge: Duration, appKey: ByteVector): HttpCookie = - makeCookie(Token(a.login, Instant.now.plus(cookieAge.asJava), appKey), domain) - - val cookieName = "sharry_auth" -} diff --git a/modules/server/src/main/scala/sharry/server/routes/mail.scala b/modules/server/src/main/scala/sharry/server/routes/mail.scala deleted file mode 100644 index 89feda4f..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/mail.scala +++ /dev/null @@ -1,105 +0,0 @@ -package sharry.server.routes - -import fs2.Stream -import cats.effect.IO -import shapeless.{::,HNil} -import spinoco.fs2.http.routing._ -import yamusca.imports._ -import yamusca.implicits._ -import io.circe._, io.circe.generic.semiauto._ - -import sharry.store.account._ -import sharry.server.paths -import sharry.server.config._ -import sharry.server.email._ -import sharry.server.routes.syntax._ - -object mail { - - def endpoint(auth: AuthConfig, smtp: GetSetting, mailCfg: WebmailConfig, store: AccountStore): Route[IO] = - choice2(checkMailAddress(auth) - , sendMail(auth, mailCfg, smtp, store) - , getDownloadTemplate(auth, mailCfg) - , getAliasTemplate(auth, mailCfg)) - - - def checkMailAddress(authCfg: AuthConfig): Route[IO] = - Get >> paths.mailCheck.matcher >> authz.user(authCfg) >> param[String]("mail") map { - (mail: String) => - - Stream.eval(Address.parse(mail)). - map(_ => Ok.message("Address is valid")). - handleErrorWith(ex => Stream.emit(BadRequest.message(ex))) - } - - - def sendMail(authCfg: AuthConfig, cfg: WebmailConfig, smtp: GetSetting, store: AccountStore): Route[IO] = - Post >> paths.mailSend.matcher >> authz.user(authCfg) :: jsonBody[SimpleMail] map { - case user :: mail :: HNil => - if (!cfg.enable) Stream.emit(BadRequest.message("Sending mails is disabled.")) - else { - val msg = for { - msg <- mail.parse - acc <- store.getAccount(user).compile.last - reply <- acc.flatMap(_.email) match { - case Some(em) => Address.parse(em).map(Some.apply) - case None => IO.pure(None) - } - } yield reply.map(r => msg.withHeader(Header.GenericHeader("Reply-To", r.mail.toString))).getOrElse(msg) - client.send(smtp)(msg). - fold(SendResult.empty)({ (r, attempt) => - attempt.fold(r.addFailure, r.addSuccess) - }). - map({ - case r@SendResult(_, Nil, _) => Ok.body(r.withMessage("No mails could be send.")) - case r@SendResult(_, _, Nil) => Ok.body(r.withMessage("All mails have been sent.")) - case r => Ok.body(r.withMessage("Some mails could not be send.")) - }) - } - } - - - def getDownloadTemplate(authCfg: AuthConfig, cfg: WebmailConfig): Route[IO] = - Get >> paths.mailDownloadTemplate.matcher >> getTemplate(cfg.findDownloadTemplate, authCfg, cfg) - - def getAliasTemplate(authCfg: AuthConfig, cfg: WebmailConfig): Route[IO] = - Get >> paths.mailAliasTemplate.matcher >> getTemplate(cfg.findAliasTemplate, authCfg, cfg) - - private def getTemplate(f: String => Option[(String, Template)], authCfg: AuthConfig, cfg: WebmailConfig): Route[IO] = - param[String]("url") :: param[String]("lang").? :: param[Boolean]("pass").? :: authz.user(authCfg) map { - case url :: optLang :: pass :: login :: HNil => - val (lang, template) = optLang. - flatMap(f). - orElse(f(cfg.defaultLanguage)). - getOrElse(optLang.getOrElse(cfg.defaultLanguage) -> Template(Literal(""))) - - val data = Context("username" -> login.asMustacheValue - , "url" -> url.asMustacheValue - , "password" -> pass.asMustacheValue) - val text = mustache.render(template)(data) - val (subject, body) = text.span(_ != '\n') - - Stream.emit(Ok.body(Map("lang" -> lang, "text" -> body.trim, "subject" -> subject.trim))) - } - - - case class SimpleMail(to: List[String], subject: String, text: String) { - def parse: IO[Mail] = Mail(to, subject, text) - } - - object SimpleMail { - implicit val _jsonDecoder: Decoder[SimpleMail] = deriveDecoder[SimpleMail] - } - - case class SendResult(message: String, success: List[Address], failed: List[String]) { - def addFailure(msg: Throwable) = copy(failed = msg.getMessage :: failed) - def addSuccess(mail: Mail) = copy(success = mail.recipients ::: success) - def withMessage(msg: String) = copy(message = msg) - } - - object SendResult { - val empty = SendResult("", Nil, Nil) - - implicit val _jsonEncoder: Encoder[SendResult] = deriveEncoder[SendResult] - } -} diff --git a/modules/server/src/main/scala/sharry/server/routes/package.scala b/modules/server/src/main/scala/sharry/server/routes/package.scala deleted file mode 100644 index 52b194d5..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/package.scala +++ /dev/null @@ -1,46 +0,0 @@ -package sharry.server - -import cats.effect.IO -import spinoco.fs2.http.body.{BodyDecoder, BodyEncoder} -import spinoco.fs2.http.routing.{body => rbody} -import spinoco.protocol.mime._ -import scodec.{Attempt, Err} -import scodec.bits.ByteVector -import io.circe.{Json, Encoder, Decoder}, io.circe.parser._, io.circe.syntax._ - -package object routes { - - private def parseJson(b: ByteVector): Attempt[Json] = - for { - str <- b.decodeUtf8.attempt - json <- parse(str).attempt - } yield json - - private def decodeJson[A](b: ByteVector)(implicit dec: Decoder[A]): Attempt[A] = - for { - json <- parseJson(b) - a <- dec.decodeJson(json).attempt - } yield a - - - implicit def jsonBodyDecoder[A](implicit jd: Decoder[A]): BodyDecoder[A] = - BodyDecoder { (bs, ct) => - if (ct.mediaType == MediaType.`application/json`) decodeJson(bs) - else Attempt.failure(Err(s"Unsupported content type: $ct")) - } - - implicit def jsonBodyEncoder[A](implicit je: Encoder[A]): BodyEncoder[A] = - BodyEncoder(ContentType.TextContent(MediaType.`application/json`, Some(MIMECharset.`UTF-8`))) { a => - ByteVector.encodeUtf8(a.asJson.spaces2).attempt - } - - def jsonBody[A](implicit d: BodyDecoder[A]) = rbody[IO].as[A] - - implicit final class EitherAttempt[A, B](e: Either[A,B]) { - def attempt: Attempt[B] = Attempt.fromEither(e.left.map(a => Err(a.toString))) - } - - implicit final class StringOps(s: String) { - def asNonEmpty: Option[String] = Option(s).map(_.trim).filter(_.nonEmpty) - } -} diff --git a/modules/server/src/main/scala/sharry/server/routes/settings.scala b/modules/server/src/main/scala/sharry/server/routes/settings.scala deleted file mode 100644 index 4a666b18..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/settings.scala +++ /dev/null @@ -1,22 +0,0 @@ -package sharry.server.routes - -import fs2.Stream -import cats.effect.IO -import spinoco.fs2.http.routing._ - -import sharry.common.data._ -import sharry.server.paths -import sharry.server.routes.syntax._ - -object settings { - - def endpoint(rcfg: RemoteConfig): Route[IO] = - remoteConfig(rcfg) - - - def remoteConfig(rcfg: RemoteConfig): Route[IO] = - Get >> paths.settings.matcher map { _ => - Stream.eval(IO { Ok.body(rcfg) }) - } - -} diff --git a/modules/server/src/main/scala/sharry/server/routes/syntax.scala b/modules/server/src/main/scala/sharry/server/routes/syntax.scala deleted file mode 100644 index 612aa3ba..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/syntax.scala +++ /dev/null @@ -1,180 +0,0 @@ -package sharry.server.routes - -import java.time.{Instant, ZoneId} -import cats.data.Ior -import fs2.{Pipe, Stream} -import cats.effect.IO -import spinoco.fs2.http._ -import spinoco.fs2.http.body.{BodyEncoder,StreamBodyEncoder} -import spinoco.fs2.http.routing._ -import spinoco.protocol.mime.ContentDisposition -import spinoco.protocol.http.header.value._ -import spinoco.protocol.http.header._ -import spinoco.protocol.http.{header =>_, _} - -import sharry.common.sizes._ -import sharry.common.streams - -object syntax { - - type Message = Map[String, String] - object Message { - def apply(msg: String): Message = Map("message" -> msg) - def apply(ex: Throwable): Message = apply(ex.getMessage) - } - - def emptyResponse[F[_]](status: HttpStatusCode): HttpResponse[F] = - HttpResponse( - HttpResponseHeader( - status = status, - reason = status.label, - headers = Nil), - Stream.empty - ) - - val Ok = HttpStatusCode.Ok - val PartialContent = HttpStatusCode.PartialContent - val NotFound = HttpStatusCode.NotFound - val Unauthorized = HttpStatusCode.Unauthorized - val Forbidden = HttpStatusCode.Forbidden - val BadRequest = HttpStatusCode.BadRequest - val Created = HttpStatusCode.Created - val NoContent = HttpStatusCode.NoContent - val NotModified = HttpStatusCode.NotModified - - /** Matches any supplied matcher or fails on first with status in `stop`. - * This is a slightly modified version of original `choice`. - */ - def choiceUntil[F[_],A](stop: Set[HttpStatusCode])(matcher: Matcher[F, A], matchers: Matcher[F, A]*): Matcher[F, A] = { - def go(m: Matcher[F,A], next: Seq[Matcher[F, A]]): Matcher[F, A] = { - next.headOption match { - case None => m - case Some(nm) => m.flatMapR { - case MatchResult.Success(a) => Matcher.success(a) - case f: MatchResult.Failed[F] if stop contains f.response.header.status => Matcher.respond(f.response) - case f: MatchResult.Failed[F] => go(nm, next.tail) - } - } - } - go(matcher, matchers) - } - - def choice2[F[_],A](matcher: Matcher[F, A], matchers: Matcher[F, A]*): Matcher[F, A] = - choiceUntil[F,A](Set(Unauthorized, Forbidden))(matcher, matchers: _*) - - implicit final class ResponseBuilder(val status: HttpStatusCode) extends AnyVal { - def noBody: HttpResponse[IO] = emptyResponse[IO](status) - - def body[A](body: A)(implicit enc: BodyEncoder[A]): HttpResponse[IO] = - emptyResponse[IO](status).withBody(body) - - def streamBody[A](body: Stream[IO,A])(implicit enc: StreamBodyEncoder[IO,A]): HttpResponse[IO] = - noBody.withStreamBody(body)(enc) - - def message(msg: String) = body(Message(msg)) - def message(err: Throwable) = body(Message(err)) - - def whenEmpty:Pipe[IO,HttpResponse[IO],HttpResponse[IO]] = - _.through(streams.ifEmpty(Stream.emit(emptyResponse[IO](status)).covary[IO])) - } - - - type ResponseUpdate[F[_]] = HttpResponse[F] => HttpResponse[F] - object ResponseUpdate { - def identity[F[_]]: ResponseUpdate[F] = identity - } - - implicit final class ResponseOps[F[_]](val r: HttpResponse[F]) extends AnyVal { - def ++(f: ResponseUpdate[F]): HttpResponse[F] = f(r) - } - - def withContentLength[F[_]](len: Long): ResponseUpdate[F] = - _.withHeader(`Content-Length`(len)) - - def withContentLength[F[_]](value: Ior[Int, Int], length: Size): ResponseUpdate[F] = - _.withHeader { - value match { - case Ior.Left(n) => `Content-Length`(length.toBytes - n) - case Ior.Right(n) => `Content-Length`(n.toLong) - case Ior.Both(a, b) => `Content-Length`((b - a).toLong + 1) - } - } - - def withAcceptRanges[F[_]]: ResponseUpdate[F] = - _.withHeader(`Accept-Ranges`(Some(RangeUnit.Bytes))) - - def withETag[F[_]](id: String): ResponseUpdate[F] = - _.withHeader(ETag(EntityTag(id, false))) - - def withLastModified[F[_]](time: Instant): ResponseUpdate[F] = - _.withHeader(`Last-Modified`(time.atZone(ZoneId.of("UTC")).toLocalDateTime)) - - def withDisposition[F[_]](value: String, filename: String): ResponseUpdate[F] = - _.withHeader(`Content-Disposition`(ContentDisposition(value, Map("filename" -> filename)))) - - - def withContentRange[F[_]](bytes: Ior[Int, Int], length: Size): ResponseUpdate[F] = - _.withHeader { - bytes match { - case Ior.Left(n) => `Content-Range`(n.toLong, length.toBytes -1, Some(length.toBytes)) - case Ior.Right(n) => `Content-Range`(0, n.toLong, Some(length.toBytes)) - case Ior.Both(a, b) => `Content-Range`(a.toLong, b.toLong, Some(length.toBytes)) - } - } - - def withCookie[F[_]](domain: String, path: String)(name: String, value: String): ResponseUpdate[F] = { - val cookie = HttpCookie(name = name - , content = value - , httpOnly = true - , maxAge = None - , path = Some(path) - , domain = Some(domain) - , params = Map.empty - , expires = None - , secure = false - ) - _.withHeader(`Set-Cookie`(cookie)) - } - - - - - def cookie[F[_]](name: String): Matcher[F, HttpCookie] = - Matcher.Match[Nothing, HttpCookie] { (request, _) => - request.headers.collectFirst({ case Cookie(hc) if hc.name == name => hc}) match { - case None => MatchResult.BadRequest - case Some(h) => MatchResult.Success(h) - } - } - - def Head = method(HttpMethod.HEAD) - - def ifNoneMatch[F[_]]: Matcher[F, Option[String]] = - header[`If-None-Match`].? map { - case Some(`If-None-Match`(EntityTagRange.Range(List(EntityTag(tag, false))))) => Some(tag) - case _ => None - } - - def range: Matcher[Nothing, Option[Ior[Int, Int]]] = - header[Range].?.map(_.map { - case Range(ByteRange.Slice(first, last)) => - Ior.both(first.toInt, last.toInt) - case Range(ByteRange.FromOffset(offset)) => - Ior.left(offset.toInt) - case Range(ByteRange.Suffix(suffix)) => - Ior.right(suffix.toInt) - }) - - - def aliasId: Matcher[Nothing, String] = - Matcher.Match[Nothing, String] { (header, _) => - val h = header.headers.find { h => - h.name.toLowerCase == authz.aliasHeaderName.toLowerCase - } - h match { - case Some(GenericHeader(_, value)) => MatchResult.success(value.trim) - case _ => MatchResult.reply(HttpStatusCode.Unauthorized) - } - } - -} diff --git a/modules/server/src/main/scala/sharry/server/routes/upload.scala b/modules/server/src/main/scala/sharry/server/routes/upload.scala deleted file mode 100644 index cfae5608..00000000 --- a/modules/server/src/main/scala/sharry/server/routes/upload.scala +++ /dev/null @@ -1,270 +0,0 @@ -package sharry.server.routes - -import fs2.Stream -import cats.effect.IO -import shapeless.{::,HNil} -import scala.util.Try -import spinoco.fs2.http.routing._ -import com.github.t3hnar.bcrypt._ -import org.log4s._ -import bitpeace.{FileChunk, MimetypeHint} - -import sharry.store.data._ -import sharry.common.data._ -import sharry.common.sizes._ -import sharry.common.duration._ -import sharry.common.streams -import sharry.common.sha -import sharry.store.upload.UploadStore -import sharry.server.paths -import sharry.server.config._ -import sharry.server.notification -import sharry.server.notification.Notifier -import sharry.server.routes.syntax._ - -object upload { - private implicit val logger = getLogger - - def endpoint(auth: AuthConfig, uploadCfg: UploadConfig, store: UploadStore, notifier: Notifier) = - choice2(testUploadChunk(auth, store) - , createUpload(auth, uploadCfg, store) - , uploadChunks(auth, uploadCfg, store) - , publishUpload(auth, store) - , unpublishUpload(auth, store) - , getPublishedUpload(store) - , getUpload(auth, store) - , getAllUploads(auth, store) - , deleteUpload(auth, uploadCfg, store) - , notifyOnUpload(uploadCfg, store, notifier) - , editUpload(auth, uploadCfg, store)) - - def editUpload(authCfg: AuthConfig, cfg: UploadConfig, store: UploadStore): Route[IO] = - Post >> paths.uploads.matcher / uploadId :: authz.user(authCfg) :: jsonBody[UploadUpdate] map { - case id :: user :: up :: HNil => - store.updateUpload(id, up).map(_ => Ok.message("Upload updated")) - } - - - def createUpload(authCfg: AuthConfig, cfg: UploadConfig, store: UploadStore): Route[IO] = - Post >> paths.uploads.matcher >> authz.userId(authCfg, store) :: jsonBody[UploadCreate] map { - case account :: meta :: HNil => - checkValidity(meta, account.alias, cfg.maxValidity) match { - case Right(v) => - if (meta.id.isEmpty) Stream.emit(BadRequest.message("The upload id must not be empty!")) - else { - val uc = Upload( - id = meta.id, - login = account.login, - validity = v, - maxDownloads = meta.maxdownloads, - description = meta.description.asNonEmpty, - password = meta.password.asNonEmpty.map(_.bcrypt), - alias = account.aliasId - ) - store.createUpload(uc).map(_ => Ok.message("Upload created")) - } - case Left(msg) => - Stream.emit(BadRequest.message(msg)) - } - } - - private def checkValidity(meta: UploadCreate, alias: Option[Alias], maxValidity: Duration): Either[String, Duration] = - alias. - map(a => Right(a.validity)). - getOrElse(UploadCreate.parseValidity(meta.validity)). - flatMap { given => - if (maxValidity >= given) Right(given) - else Left("Validity time is too long.") - } - - - private def checkDelete(id: String, alias: Alias, time: Duration, store: UploadStore) = { - notification.checkAliasAccess(id, alias, time, store) - } - - private def doDeleteUpload(store: UploadStore, id: String, login: String) = - store.deleteUpload(id, login). - map(n => Ok.body(Map("filesRemoved" -> n))). - through(NotFound.whenEmpty) - - def deleteUpload(authCfg: AuthConfig, uploadCfg: UploadConfig, store: UploadStore): Route[IO] = - Delete >> paths.uploads.matcher / uploadId :: authz.userId(authCfg, store) map { - case id :: user :: HNil => - if (id.isEmpty) Stream.emit(BadRequest.message("id is empty")) - else user match { - case Username(login) => doDeleteUpload(store, id, login) - case AliasId(alias) => - checkDelete(id, alias, uploadCfg.aliasDeleteTime, store). - flatMap{ - case true => - logger.info(s"Delete upload $id as requested by alias $alias") - doDeleteUpload(store, id, alias.login) - case false => - logger.info(s"Not deleting upload $id as requested by alias $alias") - Stream.emit(Forbidden.message("Not authorized for deletion.")) - } - } - } - - def getAllUploads(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Get >> paths.uploads.matcher >> authz.user(authCfg) map { user => - // add paging or cope with chunk responses in elm - Stream.eval(store.listUploads(user).compile.toVector). - map(Ok.body(_)) - } - - def getUpload(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Get >> paths.uploads.matcher / uploadId :: authz.user(authCfg) map { - case id :: user :: HNil => - store.getUpload(id, user). - map(processDescription(paths.download)). - map(Ok.body(_)). - through(NotFound.whenEmpty) - } - - def getPublishedUpload(store: UploadStore): Route[IO] = - Get >> paths.uploadPublish.matcher / uploadId map { id => - store.getPublishedUpload(id). - map(processDescription(paths.downloadPublished)). - map(Ok.body(_)). - through(NotFound.whenEmpty) - } - - private def processDescription(baseUrl: paths.Path)(u: UploadInfo): UploadInfo = { - import yamusca.imports._, yamusca.implicits._ - - implicit val fileConverter: ValueConverter[UploadInfo.File] = f => Map( - "id" -> f.clientFileId, - "filename" -> f.filename, - "url" -> (baseUrl / f.meta.id).path, - "mimetype" -> f.meta.mimetype.asString, - "size" -> f.meta.length.asString - ).asMustacheValue - - val ctx = Context.from { key => key match { - case "id" => u.upload.publishId.map(Value.of) - case "files" => Some(u.files.asMustacheValue) - case name if name startsWith "file_" => - Try(name.drop(5).toInt).toOption match { - case Some(i) if i < u.files.size => - Some(u.files(i).asMustacheValue) - case _ => - None - } - case name if name startsWith "fileid_" => - Try(name.drop(7)). - toOption. - filter(_.trim.nonEmpty). - flatMap(id => u.files.find(_.clientFileId == id)). - map(_.asMustacheValue) - case _ => None - }} - - val desc = u.upload.description.map(mustache.parse) match { - case Some(Right(t)) => Some(mustache.render(t)(ctx)) - case Some(Left(err)) => u.upload.description - case None => None - } - - u.copy(upload = u.upload.copy(description = desc)) - } - - def publishUpload(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Post >> paths.uploadPublish.matcher / uploadId :: authz.user(authCfg) map { - case id :: user :: HNil => - store.publishUpload(id, user).flatMap { - case Right(pid) => store.getPublishedUpload(pid).map(Ok.body(_)) - case Left(msg) => Stream.emit(BadRequest.message(msg)) - } - } - - def unpublishUpload(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Post >> paths.uploadUnpublish.matcher / uploadId :: authz.user(authCfg) map { - case id :: login :: HNil => - store.unpublishUpload(id, login).flatMap { - case Right(_) => store.getUpload(id, login).map(Ok.body(_)) - case Left(msg) => Stream.emit(BadRequest.message(msg)) - } - } - - def notifyOnUpload(cfg: UploadConfig, store: UploadStore, notifier: Notifier): Route[IO] = - Post >> paths.uploadNotify.matcher / uploadId :: authz.alias(store) map { - case id :: alias :: HNil => - if (cfg.enableUploadNotification) { - notifier(id, alias, cfg.aliasDeleteTime + 30.seconds).drain ++ - Stream.emit(Ok.message("Notification scheduled.")) - } else { - Stream.emit(Ok.message("Upload notifications disabled.")) - } - } - - def testUploadChunk(authCfg: AuthConfig, store: UploadStore): Route[IO] = - Get >> paths.uploadData.matcher >> authz.userId(authCfg, store) >> chunkInfo map { (info: ChunkInfo) => - val fileId = makeFileId(info) - store.chunkExists(info.token, fileId, info.chunkNumber, info.currentChunkSize.bytes).map { - case true => - Ok.noBody - case false => - NoContent.noBody - } - } - - def uploadChunks(authCfg: AuthConfig, cfg: UploadConfig, store: UploadStore): Route[IO] = - Post >> paths.uploadData.matcher >> authz.userId(authCfg, store) :: chunkInfo :: body[IO].bytes map { - case user :: info :: bytes :: HNil => - // check totalChunks against totalLength/chunksize - // think about using reported totalLength for size-check, but it should not be possible to trick uploading too much - - val fileId = makeFileId(info) - val chunk = bytes.take(info.currentChunkSize.toLong). - through(streams.append). - map(data => FileChunk(fileId, info.chunkNumber -1L, data)) - - val saveChunk = for { - ch <- chunk - out <- store.addChunk(info.token, ch, info.chunkSize, info.totalChunks, MimetypeHint.filename(info.filename)) - _ <- if (out.length.notZero) store.createUploadFile(info.token, fileId, info.filename, info.fileIdentifier) else Stream.emit(()).covary[IO] - } yield () - - val sizeCheck = store.getUploadSize(info.token). - map({ case us@UploadSize(n, len) => - (us, n <= cfg.maxFiles && (len + info.currentChunkSize.bytes) <= cfg.maxFileSize) - }). - evalMap({ case (UploadSize(n, len), result) => IO { - if (!result) { - logger.info(s"Current upload chunk (${info.currentChunkSize.bytes.asString}) exceeds max size: size=${len + info.currentChunkSize.bytes} and count=$n") - } - result - }}). - through(streams.ifEmpty(Stream.emit(true))) - - sizeCheck.flatMap { - case true => - saveChunk.drain ++ Stream.emit(Ok.noBody) - case false => - logger.info("Uploading too many or too large files. Return with error.") - // http 404,415,500,501 tells resumable.js to cancel entire upload (other codes let it retry) - Stream.emit(NotFound.message("Size limit exceeded")) - } - } - - - private def uploadId: Matcher[IO, String] = - as[String].flatMap { s => - if (s.isEmpty) Matcher.respond(BadRequest.message("The upload token must not be empty!")) - else Matcher.success(s) - } - - private def makeFileId(info: ChunkInfo): String = - sha(info.token + info.fileIdentifier) - - private def chunkInfo: Matcher[IO, ChunkInfo] = - param[String]("token") :: param[Int]("resumableChunkNumber") :: - param[Int]("resumableChunkSize") :: param[Int]("resumableCurrentChunkSize") :: - param[Long]("resumableTotalSize") :: param[String]("resumableIdentifier") :: - param[String]("resumableFilename") :: param[Int]("resumableTotalChunks") flatMap { - case token :: num :: size :: currentSize :: totalSize :: ident :: file :: total :: HNil => - if (token.isEmpty) Matcher.respond[IO](BadRequest.message("Token is empty")) - else Matcher.success(ChunkInfo(token, num, size, currentSize, totalSize, ident, file, total)) - } -} diff --git a/modules/server/src/test/rest/test.rest b/modules/server/src/test/rest/test.rest deleted file mode 100644 index 8835560a..00000000 --- a/modules/server/src/test/rest/test.rest +++ /dev/null @@ -1,153 +0,0 @@ -# -*- restclient -*- - -# variables -:base = http://127.0.0.1:9090/api/v1 -:public = http://127.0.0.1:9090 - -# Login with username and password -POST :base/auth/login -Content-Type: application/json - -{"login":"admin", "pass":"admin"} -# -curl -i -H 'Content-Type: application/json' -XPOST 'http://127.0.0.1:9090/api/v1/auth/login' -d '{"login":"admin", "pass":"admin"}' - -# get all accounts -GET :base/accounts?q=a -Cookie: sharry_auth=$2a$10$TZEBhNY4UyGUb.rH6S0uR.%admin%2017-05-03T23:33:38.262Z%331328e501d4d7dc7c6f82e10408f5d8806fa7b82d1757e491d8a023377fa41a -# - -# get account -GET :base/accounts/admin -Cookie: sharry_auth=$2a$10$TZEBhNY4UyGUb.rH6S0uR.%admin%2017-05-03T23:33:38.262Z%331328e501d4d7dc7c6f82e10408f5d8806fa7b82d1757e491d8a023377fa41a -# - - -# test chunk -GET :base/upload-data?token=u4ihtpp5x1urb14um2v54f8&resumableChunkNumber=9&resumableChunkSize=262144&resumableCurrentChunkSize=262144&resumableTotalSize=4117764&resumableIdentifier=4117764-Alfine_11_Gangpdf&resumableFilename=Alfine_11_Gang.pdf&resumableRelativePath=Alfine_11_Gang.pdf&resumableTotalChunks=16 -Cookie: sharry_auth=$2a$10$.dhdWe7StqcNH2TsUlhN1O%admin%2017-10-28T23:03:42.573Z%b2d610385ececcf4aa1f76466786d543f0c0bd19200d59db85ac987b55c6d6e0 -# - -# publish upload -POST :base/upload-publish/us4ai5ox9z58ljp2rwqazwe -# - -# download ranges -GET :base/dlp/0b53fa182c4c65bb1572d06d6cfe37e7ae1d35dd438c28302e3e43ada181688c -Range: bytes=367886000- -# - -# get all uploads -GET :base/uploads -# - -# get upload -GET :base/uploads/us4ai5ox9z58ljp2rwqazwe -# - -# delete upload -DELETE :base/uploads/uvka5ab33opj5su1dto1t1b -x-sharry-alias: VdKyo4obL9u1O2PpTpTI -# - -# test download -HEAD :public/dlp/0cb317edbc8a0a1a1ff7682fe0cfbef6445e46f7dbfd4bdc576f0ac3c40eb89a -Cookie: sharry_dlpassword=test -# - - -# check password -POST :base/check-password/rJ-KdLR21CQsEtFZis46GvfdHM2LdsHJ -Content-Type: application/json - -{"password":"test"} -# - -# test zip download -GET :public/dlp/5BjfL5giB3Y1hUiqXSg6gMSTcorL6_lL43-UDcp/zip -# - -# update email -POST :base/account/email -Content-Type: application/json -Cookie: sharry_auth=$2a$10$bXVoVn/iG4euGK6cYjTzZ.%admin%2017-05-06T10:32:22.980Z%b64b09620922365ef0eaf73e54621cf03ae99319daeecb0a680119edec16c80a - -{ - "login": "admin", - "password": null, - "email": "admin@eknet.org", - "enabled": true, - "admin": true, - "extern": true -} -# - -# update password -POST :base/account/password -Content-Type: application/json -Cookie: sharry_auth=$2a$10$bXVoVn/iG4euGK6cYjTzZ.%admin%2017-05-06T10:32:22.980Z%b64b09620922365ef0eaf73e54621cf03ae99319daeecb0a680119edec16c80a - -{ - "login": "admin", - "password": "admin", - "email": "admin@eknet.org", - "enabled": true, - "admin": true, - "extern": true -} -# - - -# create alias -POST :base/aliases -Cookie: sharry_auth=$2a$10$1B.koVH2DoiD2pL0MOx31u%admin%2017-05-07T09:10:34.245Z%afbbbd5adf92ae1a090632eefc09e67e3e2fb1d57a0ad9cec861e500ca64ef48 -# - -# list aliases -GET :base/aliases -Cookie: sharry_auth=$2a$10$0AvuBdbZeqCO2CEz2FqFRe%admin%2017-11-16T20:45:06.778Z%a90a036e86b3ced8a67cf9cbb68f4f782eb2a49a02ebc7a342869023a0d6eaf4 -# - -# get single alias -GET :base/aliases/kMp8xzNgH8wNYUJU -Cookie: sharry_auth=$2a$10$1B.koVH2DoiD2pL0MOx31u%admin%2017-05-07T09:10:34.245Z%afbbbd5adf92ae1a090632eefc09e67e3e2fb1d57a0ad9cec861e500ca64ef48 -# - -# delete alias -DELETE :base/aliases/RZQbT6jmQb8_TfPC3LC3F -Cookie: sharry_auth=$2a$10$1B.koVH2DoiD2pL0MOx31u%admin%2017-05-07T09:10:34.245Z%afbbbd5adf92ae1a090632eefc09e67e3e2fb1d57a0ad9cec861e500ca64ef48 -# - -# update alias -POST :base/aliases/5CCKwPuhB4BUCw_P -Content-Type: application/json -Cookie: sharry_auth=$2a$10$0AvuBdbZeqCO2CEz2FqFRe%admin%2017-11-16T20:45:06.778Z%a90a036e86b3ced8a67cf9cbb68f4f782eb2a49a02ebc7a342869023a0d6eaf4 - -{ - "id": "a1234", - "login": "admin", - "name": "from Betty", - "validity": "PT120H", - "created": "2017-05-07T16:10:38Z", - "enable": false -} -# - - -# check mail -GET :base/mail/check?mail=111 -Cookie: sharry_auth=$2a$10$LcCnbrgEu4SJjcruYjdYnu%admin%2017-05-09T17:33:35.740Z%76fcfe48fe13c45f128af9a7508590c23dd65d31379801e064e76222857dd0da -# - -# send mail -POST :base/mail/send -Content-Type: application/json -Cookie: sharry_auth=$2a$10$ceGcFCyJzhuWbLN6X6HuS.%admin%2017-05-09T18:32:34.025Z%1eaaa7a90d1cf4a986da19b5932ce06fe168fa78ae9f17dac3af73199b1087e6 - -{"from":"noreply@eknet.org", "to":["a@uiaeuia.uiaeuae"], "subject":"This is a test", "text":"This is just a test mail"} -# - -# get mail templates -GET :base/mail/download-template?url=http&lang=de -Cookie: sharry_auth=$2a$10$BAb.HiZOUXPLb13zpSFFv.%admin%2017-05-09T20:51:47.747Z%7451e7c0022cd4b124bdaa3f2074b8618a1fc4f28d0cb7ae54dd60674a644a29 -# \ No newline at end of file diff --git a/modules/server/src/test/scala/sharry/server/codec/HttpHeaderCodecSpec.scala b/modules/server/src/test/scala/sharry/server/codec/HttpHeaderCodecSpec.scala deleted file mode 100644 index ec8421b2..00000000 --- a/modules/server/src/test/scala/sharry/server/codec/HttpHeaderCodecSpec.scala +++ /dev/null @@ -1,20 +0,0 @@ -package sharry.server.codec - -import org.scalatest._ -import scodec.bits.BitVector -import scodec.Attempt -import spinoco.protocol.http.header.GenericHeader - -class HttpHeaderCodecSpec extends FlatSpec with Matchers { - - "header codec" should "not fail on empty cookie headers" in { - HttpHeaderCodec.codec(2000).decodeValue(BitVector.view("Cookie:".getBytes)) should be ( - Attempt.successful(GenericHeader("cookie", "")) - ) - - HttpHeaderCodec.codec(2000).decodeValue(BitVector.view("Cookie: ".getBytes)) should be ( - Attempt.successful(GenericHeader("cookie", "")) - ) - } - -} diff --git a/modules/store/src/main/resources/db/migration/mariadb/V1.0.0__initial.sql b/modules/store/src/main/resources/db/migration/mariadb/V1.0.0__initial.sql new file mode 100644 index 00000000..9a7c7488 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/mariadb/V1.0.0__initial.sql @@ -0,0 +1,95 @@ +CREATE TABLE IF NOT EXISTS `filemeta` ( + `id` varchar(254) not null primary key, + `timestamp` varchar(40) not null, + `mimetype` varchar(254) not null, + `length` bigint not null, + `checksum` varchar(254) not null, + `chunks` int not null, + `chunksize` int not null +); + +CREATE TABLE IF NOT EXISTS `filechunk` ( + fileId varchar(254) not null, + chunkNr int not null, + chunkLength int not null, + chunkData mediumblob not null, + primary key (fileId, chunkNr) +); + + +CREATE TABLE `account_` ( + `id` varchar(254) not null primary key, + `login` varchar(254) not null, + `source` varchar(254) not null, + `state` varchar(254) not null, + `password` varchar(254) not null, + `email` varchar(254), + `admin` boolean not null, + `logincount` int not null, + `lastlogin` varchar(40), + `created` varchar(40) not null, + unique(`login`) +); + +CREATE TABLE `invitation` ( + `id` varchar(254) not null primary key, + `created` varchar(40) not null +); + +CREATE TABLE `alias_` ( + `id` varchar(254) not null primary key, + `account_id` varchar(254) not null, + `name_` varchar(254) not null, + `validity` int not null, + `enabled` boolean not null, + `created` varchar(40) not null, + foreign key (`account_id`) references `account_` (`id`) + on delete cascade +); + +CREATE TABLE `share` ( + `id` varchar(254) not null primary key, + `account_id` varchar(254) not null, + `alias_id` varchar(254), + `name_` varchar(254), + `validity` int not null, + `max_views` int not null, + `password` varchar(254), + `description` text, + `created` varchar(40) not null, + foreign key (`account_id`) references `account_` (`id`) + on delete cascade, + foreign key (`alias_id`) references `alias_` (`id`) + on delete set null +); + +CREATE TABLE `publish_share` ( + `id` varchar(254) not null primary key, + `share_id` varchar(254) not null, + `enabled` boolean not null, + `views` int not null, + `last_access` varchar(40), + `publish_date` varchar(40) not null, + `publish_until` varchar(40) not null, + `created` varchar(40) not null, + unique(`share_id`), + foreign key (`share_id`) references `share` (`id`) + on delete cascade +); + +CREATE INDEX `publish_share_until_idx` ON `publish_share`(`publish_until`); +CREATE INDEX `publish_share_date_idx` ON `publish_share`(`publish_date`); + +CREATE TABLE `share_file` ( + `id` varchar(254) not null primary key, + `share_id` varchar(254) not null, + `file_id` varchar(254) not null, + `filename` varchar(2000), + `created` varchar(40) not null, + `real_size` bigint not null, + unique(`share_id`, `file_id`), + foreign key (`share_id`) references `share` (`id`) + on delete cascade, + foreign key (`file_id`) references `filemeta` (`id`) + on delete cascade +); diff --git a/modules/store/src/main/resources/db/migration/postgresql/V1.0.0__initial.sql b/modules/store/src/main/resources/db/migration/postgresql/V1.0.0__initial.sql new file mode 100644 index 00000000..76532a76 --- /dev/null +++ b/modules/store/src/main/resources/db/migration/postgresql/V1.0.0__initial.sql @@ -0,0 +1,94 @@ +CREATE TABLE IF NOT EXISTS "filemeta" ( + "id" varchar(254) not null primary key, + "timestamp" varchar(40) not null, + "mimetype" varchar(254) not null, + "length" bigint not null, + "checksum" varchar(254) not null, + "chunks" int not null, + "chunksize" int not null +); + +CREATE TABLE IF NOT EXISTS "filechunk" ( + fileId varchar(254) not null, + chunkNr int not null, + chunkLength int not null, + chunkData bytea not null, + primary key (fileId, chunkNr) +); + +CREATE TABLE "account_" ( + "id" varchar(254) not null primary key, + "login" varchar(254) not null, + "source" varchar(254) not null, + "state" varchar(254) not null, + "password" varchar(254) not null, + "email" varchar(254), + "admin" boolean not null, + "logincount" int not null, + "lastlogin" varchar(40), + "created" varchar(40) not null, + unique("login") +); + +CREATE TABLE "invitation" ( + "id" varchar(254) not null primary key, + "created" varchar(40) not null +); + +CREATE TABLE "alias_" ( + "id" varchar(254) not null primary key, + "account_id" varchar(254) not null, + "name_" varchar(254) not null, + "validity" int not null, + "enabled" boolean not null, + "created" varchar(40) not null, + foreign key ("account_id") references "account_" ("id") + on delete cascade +); + +CREATE TABLE "share" ( + "id" varchar(254) not null primary key, + "account_id" varchar(254) not null, + "alias_id" varchar(254), + "name_" varchar(254), + "validity" int not null, + "max_views" int not null, + "password" varchar(254), + "description" text, + "created" varchar(40) not null, + foreign key ("account_id") references "account_" ("id") + on delete cascade, + foreign key ("alias_id") references "alias_" ("id") + on delete set null +); + +CREATE TABLE "publish_share" ( + "id" varchar(254) not null primary key, + "share_id" varchar(254) not null, + "enabled" boolean not null, + "views" int not null, + "last_access" varchar(40), + "publish_date" varchar(40) not null, + "publish_until" varchar(40) not null, + "created" varchar(40) not null, + unique("share_id"), + foreign key ("share_id") references "share" ("id") + on delete cascade +); + +CREATE INDEX "publish_share_until_idx" ON "publish_share"("publish_until"); +CREATE INDEX "publish_share_date_idx" ON "publish_share"("publish_date"); + +CREATE TABLE "share_file" ( + "id" varchar(254) not null primary key, + "share_id" varchar(254) not null, + "file_id" varchar(254) not null, + "filename" varchar(2000), + "created" varchar(40) not null, + "real_size" bigint not null, + unique("share_id", "file_id"), + foreign key ("share_id") references "share" ("id") + on delete cascade, + foreign key ("file_id") references "filemeta" ("id") + on delete cascade +); diff --git a/modules/store/src/main/scala/sharry/store/AddResult.scala b/modules/store/src/main/scala/sharry/store/AddResult.scala new file mode 100644 index 00000000..5bb7dd6b --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/AddResult.scala @@ -0,0 +1,46 @@ +package sharry.store + +import AddResult._ + +sealed trait AddResult { + def toEither: Either[Throwable, Unit] + def isSuccess: Boolean + + def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A + + def isError: Boolean = + !isSuccess +} + +object AddResult { + + def fromUpdateExpectChange(errMsg: String)(e: Either[Throwable, Int]): AddResult = + e.fold(Failure, n => if (n > 0) Success else Failure(new Exception(errMsg))) + + def fromEither[B](e: Either[Throwable, B]): AddResult = + e.fold(Failure, _ => Success) + + case object Success extends AddResult { + def toEither = Right(()) + val isSuccess = true + def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A = + fa(this) + } + + case class EntityExists(msg: String) extends AddResult { + def toEither = Left(new Exception(msg)) + val isSuccess = false + def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A = + fb(this) + + def withMsg(msg: String): EntityExists = + EntityExists(msg) + } + + case class Failure(ex: Throwable) extends AddResult { + def toEither = Left(ex) + val isSuccess = false + def fold[A](fa: Success.type => A, fb: EntityExists => A, fc: Failure => A): A = + fc(this) + } +} diff --git a/modules/store/src/main/scala/sharry/store/JdbcConfig.scala b/modules/store/src/main/scala/sharry/store/JdbcConfig.scala new file mode 100644 index 00000000..dfa2397b --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/JdbcConfig.scala @@ -0,0 +1,38 @@ +package sharry.store + +import sharry.common.LenientUri + +case class JdbcConfig(url: LenientUri, user: String, password: String) { + + val dbmsName: Option[String] = + JdbcConfig.extractDbmsName(url) + + def driverClass = + dbmsName match { + case Some("mariadb") => + "org.mariadb.jdbc.Driver" + case Some("postgresql") => + "org.postgresql.Driver" + case Some("h2") => + "org.h2.Driver" + case Some("sqlite") => + "org.sqlite.JDBC" + case Some(n) => + sys.error(s"Unknown DBMS: $n") + case None => + sys.error("No JDBC url specified") + } + + override def toString: String = + s"JdbcConfig($url, $user, ***)" +} + +object JdbcConfig { + def extractDbmsName(jdbcUrl: LenientUri): Option[String] = + jdbcUrl.scheme.head match { + case "jdbc" => + jdbcUrl.scheme.tail.headOption + case _ => + None + } +} diff --git a/modules/store/src/main/scala/sharry/store/Limit.scala b/modules/store/src/main/scala/sharry/store/Limit.scala deleted file mode 100644 index 2ef5ee07..00000000 --- a/modules/store/src/main/scala/sharry/store/Limit.scala +++ /dev/null @@ -1,14 +0,0 @@ -package sharry.store - -case class Limit(limit: Int, offset: Int) - -object Limit { - def offset(n: Int) = Limit(0, n) - def limit(n: Int) = Limit(n, 0) - def limitOffset(limit: Int, offset: Int) = Limit(limit, offset) - - def page(size: Int, num: Int): Limit = { - if (num <= 1) limit(size) - else limitOffset(size, (num -1) * size) - } -} diff --git a/modules/store/src/main/scala/sharry/store/Store.scala b/modules/store/src/main/scala/sharry/store/Store.scala new file mode 100644 index 00000000..f89c8641 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/Store.scala @@ -0,0 +1,47 @@ +package sharry.store + +import bitpeace.Bitpeace +import cats.effect._ +import fs2._ +import _root_.doobie._ +import _root_.doobie.hikari.HikariTransactor +import sharry.store.doobie.StoreImpl + +import scala.concurrent.ExecutionContext + +trait Store[F[_]] { + + def transact[A](prg: ConnectionIO[A]): F[A] + + def transact[A](prg: Stream[ConnectionIO, A]): Stream[F, A] + + def bitpeace: Bitpeace[F] + + def add(insert: ConnectionIO[Int], exists: ConnectionIO[Boolean]): F[AddResult] +} + +object Store { + + def create[F[_]: Effect: ContextShift]( + jdbc: JdbcConfig, + connectEC: ExecutionContext, + blocker: Blocker, + runMigration: Boolean + ): Resource[F, Store[F]] = { + + val hxa = HikariTransactor.newHikariTransactor[F]( + jdbc.driverClass, + jdbc.url.asString, + jdbc.user, + jdbc.password, + connectEC, + blocker + ) + + for { + xa <- hxa + st = new StoreImpl[F](jdbc, xa) + _ <- if (runMigration) Resource.liftF(st.migrate) else Resource.pure(()) + } yield st + } +} diff --git a/modules/store/src/main/scala/sharry/store/account/AccountStore.scala b/modules/store/src/main/scala/sharry/store/account/AccountStore.scala deleted file mode 100644 index 16838e20..00000000 --- a/modules/store/src/main/scala/sharry/store/account/AccountStore.scala +++ /dev/null @@ -1,35 +0,0 @@ -package sharry.store.account - -import fs2.Stream -import cats.effect.IO -import sharry.common.data.Account -import sharry.store.Limit - -/** On top of `ContentStore` associate accounts to data. - * - * While stored data in sitebag is considered public, the association - * of a data to an account is not. This store is for associating user - * accounts to stored data. The data itself is shared across - * accounts. - */ -trait AccountStore { - - def accountExists(login: String): Stream[IO,Boolean] - - def getAccount(login: String): Stream[IO,Account] - - def createAccount(account: Account): Stream[IO,Unit] - - def updateAccount(account: Account): Stream[IO,Boolean] - - def setAccountEnabled(login: String, flag: Boolean): Stream[IO,Boolean] - - def updatePassword(login: String, password: Option[String]): Stream[IO,Boolean] - - def updateEmail(login: String, email: Option[String]): Stream[IO,Boolean] - - def deleteAccount(login: String): Stream[IO,Boolean] - - def listLogins(q: String, limit: Option[Limit]): Stream[IO,String] - -} diff --git a/modules/store/src/main/scala/sharry/store/account/SqlAccountStore.scala b/modules/store/src/main/scala/sharry/store/account/SqlAccountStore.scala deleted file mode 100644 index 2629d39a..00000000 --- a/modules/store/src/main/scala/sharry/store/account/SqlAccountStore.scala +++ /dev/null @@ -1,54 +0,0 @@ -package sharry.store.account - -import fs2.Stream -import cats.effect.IO -import doobie._, doobie.implicits._ -import sharry.common.data.Account -import sharry.store.Limit - -class SqlAccountStore(xa: Transactor[IO]) extends AccountStore with SqlStatements { - - def accountExists(login: String): Stream[IO,Boolean] = Stream.eval { - existsAccount(login).transact(xa) - } - - def getAccount(login: String): Stream[IO,Account] = - Stream.eval(selectAccount(login).transact(xa)).flatMap { - case Some(a) => Stream(a) - case None => Stream.empty - } - - def createAccount(account: Account): Stream[IO,Unit] = { - Stream.eval(insertAccount(account).run.transact(xa)).map(_ => ()) - } - - def updateAccount(account: Account): Stream[IO,Boolean] = Stream.eval { - updateAccountSql(account).run.map(_ > 0).transact(xa) - } - - def updatePassword(login: String, password: Option[String]): Stream[IO,Boolean] = - Stream.eval(sqlUpdatePassword(login, password).run.map(_ > 0).transact(xa)) - - def updateEmail(login: String, email: Option[String]): Stream[IO,Boolean] = - Stream.eval(sqlUpdateEmail(login, email).run.map(_ > 0).transact(xa)) - - def setAccountEnabled(login: String, flag: Boolean): Stream[IO,Boolean] = Stream.eval { - updateEnabledSql(login, flag).run.map(_ > 0).transact(xa) - } - - def deleteAccount(login: String): Stream[IO,Boolean] = Stream.eval { - val t = for { - n <- deleteAccountSql(login).run - } yield n > 0 - t.transact(xa) - } - - def listLogins(q: String, limit: Option[Limit]): Stream[IO,String] = - selectLogins(q, limit).stream.transact(xa) - -} - -object SqlAccountStore { - def apply(xa: Transactor[IO]): SqlAccountStore = - new SqlAccountStore(xa) -} diff --git a/modules/store/src/main/scala/sharry/store/account/SqlStatements.scala b/modules/store/src/main/scala/sharry/store/account/SqlStatements.scala deleted file mode 100644 index 33e574d7..00000000 --- a/modules/store/src/main/scala/sharry/store/account/SqlStatements.scala +++ /dev/null @@ -1,67 +0,0 @@ -package sharry.store.account - -import org.log4s._ -import doobie.implicits._ -import sharry.common.data.Account -import sharry.store.Limit -import sharry.store.columns._ - -trait SqlStatements { - - implicit def logHandler(implicit l: Logger) = logSql(l) - - def insertAccount(a: Account) = - sql"""INSERT INTO Account (login,password,email,admin,enabled,extern) VALUES( - ${a.login}, ${a.password}, ${a.email}, ${a.admin}, ${a.enabled}, ${a.extern} - )""".update - - def selectAccount(login: String) = - sql"""SELECT login,password,email,enabled,admin,extern FROM Account WHERE login = ${login}""". - query[Account]. - option - - def selectLogins(partial: String, limit: Option[Limit]) = { - val q = { - val s = fr"SELECT login FROM Account" - val term = s"%${partial}%" - if (partial.isEmpty) s ++ fr"ORDER BY login" - else s ++ fr"WHERE login like $term ORDER BY login" - } - limit match { - case None => - q.query[String] - case Some(l) => - (q ++ fr"LIMIT ${l.limit} OFFSET ${l.offset}").query[String] - } - } - - - def existsAccount(login: String) = - sql"""SELECT count(login) FROM Account WHERE login = ${login}""". - query[Int]. - unique. - map(_ > 0) - - - def deleteAccountSql(login: String) = - sql"""DELETE FROM Account WHERE login = $login""".update - - def updateAccountSql(a: Account) = - sql"""UPDATE Account SET - password = ${a.password}, - email = ${a.email}, - admin = ${a.admin}, - enabled = ${a.enabled}, - extern = ${a.extern} - WHERE login = ${a.login}""".update - - def updateEnabledSql(login: String, flag: Boolean) = - sql"""UPDATE Account SET enabled = $flag WHERE login = $login""".update - - def sqlUpdateEmail(login: String, email: Option[String]) = - sql"""UPDATE Account SET email = $email WHERE login = $login""".update - - def sqlUpdatePassword(login: String, password: Option[String]) = - sql"""UPDATE Account SET password = $password WHERE login = $login AND extern = false""".update - -} diff --git a/modules/store/src/main/scala/sharry/store/columns.scala b/modules/store/src/main/scala/sharry/store/columns.scala deleted file mode 100644 index 50b424f7..00000000 --- a/modules/store/src/main/scala/sharry/store/columns.scala +++ /dev/null @@ -1,63 +0,0 @@ -package sharry.store - -import java.time.Instant -import java.time.temporal._ -import org.log4s._ -import scodec.bits.ByteVector -import sharry.common.mime.MimeType -import sharry.common.sizes._ -import sharry.common.duration._ -import doobie._ -import doobie.util.log.{Success, ProcessingFailure, ExecFailure} - -object columns { - - implicit val bvMeta: Meta[ByteVector] = - Meta[Array[Byte]].xmap( - ar => ByteVector(ar), - bv => bv.toArray - ) - - implicit val mimetypeMeta: Meta[MimeType] = - Meta[String].xmap(MimeType.parse(_).get, _.asString) - - implicit val instantMeta: Meta[Instant] = - Meta[String].xmap(Instant.parse, _.truncatedTo(ChronoUnit.SECONDS).toString) - - implicit val durationMeta: Meta[Duration] = - Meta[String].xmap((java.time.Duration.parse _) andThen Duration.fromJava, _.asJava.toString) - - implicit val sizeMeta: Meta[Size] = - Meta[Long].xmap[Size](n => Bytes(n), _.toBytes) - - def logSql(logger: Logger): LogHandler = LogHandler { - case Success(s, a, e1, e2) => - logger.trace(s"""Successful Statement Execution: - | - | ${s.lines.dropWhile(_.trim.isEmpty).mkString("\n ")} - | - | arguments = [${a.mkString(", ")}] - | elapsed = ${e1.toMillis} ms exec + ${e2.toMillis} ms processing (${(e1 + e2).toMillis} ms total) - """.stripMargin) - - case ProcessingFailure(s, a, e1, e2, t) => - logger.error(s"""Failed Resultset Processing: - | - | ${s.lines.dropWhile(_.trim.isEmpty).mkString("\n ")} - | - | arguments = [${a.mkString(", ")}] - | elapsed = ${e1.toMillis} ms exec + ${e2.toMillis} ms processing (failed) (${(e1 + e2).toMillis} ms total) - | failure = ${t.getMessage} - """.stripMargin) - - case ExecFailure(s, a, e1, t) => - logger.error(s"""Failed Statement Execution: - | - | ${s.lines.dropWhile(_.trim.isEmpty).mkString("\n ")} - | - | arguments = [${a.mkString(", ")}] - | elapsed = ${e1.toMillis} ms exec (failed) - | failure = ${t.getMessage} - """.stripMargin) - } -} diff --git a/modules/store/src/main/scala/sharry/store/data/Alias.scala b/modules/store/src/main/scala/sharry/store/data/Alias.scala deleted file mode 100644 index 0c308569..00000000 --- a/modules/store/src/main/scala/sharry/store/data/Alias.scala +++ /dev/null @@ -1,34 +0,0 @@ -package sharry.store.data - -import java.time.Instant -import cats.data.Validated -import io.circe._, io.circe.generic.semiauto._ -import sharry.common.JsonCodec -import sharry.common.rng._ -import sharry.common.duration._ - -case class Alias( - id: String - ,login: String - ,name: String - ,validity: Duration - ,created: Instant - ,enable: Boolean -) - -object Alias { - import JsonCodec._ - - def generate(login: String, name: String, validity: Duration): Alias = - Alias(Gen.ident(16,24).generate(), login, name, validity, Instant.now, true) - - def validateId(id: String): Validated[String, String] = { - val chars = (('a' to 'z') ++ ('A' to 'Z') ++ ('0' to '9') ++ "_-").toSet - if (id.forall(chars.contains)) Validated.valid(id) - else Validated.invalid(s"Not an alphanumeric identifier: $id") - } - - implicit val _aliasDecoder: Decoder[Alias] = deriveDecoder[Alias] - implicit val _aliasEncoder: Encoder[Alias] = deriveEncoder[Alias] - -} diff --git a/modules/store/src/main/scala/sharry/store/data/UploadSize.scala b/modules/store/src/main/scala/sharry/store/data/UploadSize.scala deleted file mode 100644 index 25f62554..00000000 --- a/modules/store/src/main/scala/sharry/store/data/UploadSize.scala +++ /dev/null @@ -1,8 +0,0 @@ -package sharry.store.data - -import sharry.common.sizes._ - -case class UploadSize( - files: Int - , size: Size -) diff --git a/modules/store/src/main/scala/sharry/store/doobie/Column.scala b/modules/store/src/main/scala/sharry/store/doobie/Column.scala new file mode 100644 index 00000000..e640d470 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/doobie/Column.scala @@ -0,0 +1,61 @@ +package sharry.store.doobie + +import doobie._, doobie.implicits._ + +case class Column(name: String, ns: String = "", alias: String = "") { + + val f = { + val col = + if (ns.isEmpty) Fragment.const(name) + else Fragment.const(ns + "." + name) + if (alias.isEmpty) col + else col ++ fr"as" ++ Fragment.const(alias) + } + + def ::(ns: String): Column = + Column(name, ns, alias) + + def as(alias: String): Column = + Column(name, ns, alias) + + def is[A: Put](value: A): Fragment = + f ++ fr" = $value" + + def isNot[A: Put](value: A): Fragment = + f ++ fr"<> $value" + + def is[A: Put](ov: Option[A]): Fragment = ov match { + case Some(v) => f ++ fr" = $v" + case None => f ++ fr"is null" + } + + def isNull: Fragment = + f ++ fr"is null" + + def is(c: Column): Fragment = + f ++ fr"=" ++ c.f + + def like(value: String): Fragment = { + val str = value.toLowerCase + fr"LOWER(" ++ f ++ fr") LIKE $str" + } + + def isGt[A: Put](a: A): Fragment = + f ++ fr"> $a" + + def isLt[A: Put](a: A): Fragment = + f ++ fr"< $a" + + def isGt(c: Column): Fragment = + f ++ fr">" ++ c.f + + def increment(n: Int): Fragment = + f ++ fr"=" ++ f ++ fr"+ $n" + + def setTo[A: Put](value: A): Fragment = + is(value) + + def setTo[A: Put](va: Option[A]): Fragment = + f ++ fr" = $va" + +} diff --git a/modules/store/src/main/scala/sharry/store/doobie/DoobieMeta.scala b/modules/store/src/main/scala/sharry/store/doobie/DoobieMeta.scala new file mode 100644 index 00000000..62081a9e --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/doobie/DoobieMeta.scala @@ -0,0 +1,59 @@ +package sharry.store.doobie + +import java.time.format.DateTimeFormatter +import java.time.{Instant, LocalDate} + +import doobie._ +import doobie.util.log.Success +import io.circe.{Decoder, Encoder} +import sharry.common._ +import sharry.common.syntax.all._ +import bitpeace.Mimetype + +trait DoobieMeta { + + implicit val sqlLogging = LogHandler({ + case e @ Success(_, _, _, _) => + DoobieMeta.logger.trace("SQL " + e) + case e => + DoobieMeta.logger.error(s"SQL Failure: $e") + }) + + def jsonMeta[A](implicit d: Decoder[A], e: Encoder[A]): Meta[A] = + Meta[String].imap(str => str.parseJsonAs[A].fold(ex => throw ex, identity))( + a => e.apply(a).noSpaces + ) + + implicit val metaUserState: Meta[AccountState] = + Meta[String].timap(AccountState.unsafe)(AccountState.asString) + + implicit val metaAccountSource: Meta[AccountSource] = + Meta[String].timap(AccountSource.unsafe)(_.name) + + implicit val metaPassword: Meta[Password] = + Meta[String].timap(Password(_))(_.pass) + + implicit val metaIdent: Meta[Ident] = + Meta[String].timap(Ident.unsafe)(_.id) + + implicit val metaTimestamp: Meta[Timestamp] = + Meta[String].timap(s => Timestamp(Instant.parse(s)))(_.value.toString) + + implicit val metaLocalDate: Meta[LocalDate] = + Meta[String].timap(str => LocalDate.parse(str))(_.format(DateTimeFormatter.ISO_DATE)) + + implicit val metaDuration: Meta[Duration] = + Meta[Long].timap(n => Duration.seconds(n))(_.seconds) + + implicit val metaByteSize: Meta[ByteSize] = + Meta[Long].timap(n => ByteSize(n))(_.bytes) + + implicit val metaMimetype: Meta[Mimetype] = + Meta[String].imap(Mimetype.parse(_).fold(ex => throw ex, identity))(_.asString) + +} + +object DoobieMeta extends DoobieMeta { + import org.log4s._ + private val logger = getLogger +} diff --git a/modules/store/src/main/scala/sharry/store/doobie/Sql.scala b/modules/store/src/main/scala/sharry/store/doobie/Sql.scala new file mode 100644 index 00000000..f64dde25 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/doobie/Sql.scala @@ -0,0 +1,60 @@ +package sharry.store.doobie + +import doobie._ +import doobie.implicits._ +import sharry.common.Timestamp + +object Sql { + + def commas(fs: Seq[Fragment]): Fragment = + fs.reduce(_ ++ Fragment.const(",") ++ _) + + def commas(fa: Fragment, fas: Fragment*): Fragment = + commas(fa :: fas.toList) + + def currentTime: ConnectionIO[Timestamp] = + Timestamp.current[ConnectionIO] + + def insertRow(table: Fragment, cols: List[Column], vals: Fragment): Fragment = + Fragment.const("INSERT INTO ") ++ table ++ Fragment.const(" (") ++ + commas(cols.map(_.f)) ++ Fragment.const(") VALUES (") ++ vals ++ Fragment.const(")") + + def updateRow(table: Fragment, where: Fragment, setter: Fragment): Fragment = + Fragment.const("UPDATE ") ++ table ++ Fragment.const(" SET ") ++ setter ++ this.where(where) + + def selectSimple(cols: Seq[Column], table: Fragment, where: Fragment): Fragment = + selectSimple(commas(cols.map(_.f)), table, where) + + def selectSimple(cols: Fragment, table: Fragment, where: Fragment): Fragment = + Fragment.const("SELECT ") ++ cols ++ + Fragment.const(" FROM ") ++ table ++ this.where(where) + + def selectCount(col: Column, table: Fragment, where: Fragment): Fragment = + Fragment.const("SELECT COUNT(") ++ col.f ++ Fragment.const(") FROM ") ++ table ++ this.where( + where + ) + + def deleteFrom(table: Fragment, where: Fragment): Fragment = + fr"DELETE FROM" ++ table ++ this.where(where) + + def where(fa: Fragment): Fragment = + if (isEmpty(fa)) Fragment.empty + else Fragment.const(" WHERE ") ++ fa + + def isEmpty(fragment: Fragment): Boolean = + Fragment.empty.toString() == fragment.toString() + + def and(fs: Seq[Fragment]): Fragment = + Fragment.const(" (") ++ fs + .filter(f => !isEmpty(f)) + .reduce(_ ++ Fragment.const(" AND ") ++ _) ++ Fragment.const(") ") + + def and(f0: Fragment, fs: Fragment*): Fragment = + and(f0 :: fs.toList) + + def or(fs: Seq[Fragment]): Fragment = + Fragment.const(" (") ++ fs.reduce(_ ++ Fragment.const(" OR ") ++ _) ++ Fragment.const(") ") + def or(f0: Fragment, fs: Fragment*): Fragment = + or(f0 :: fs.toList) + +} diff --git a/modules/store/src/main/scala/sharry/store/doobie/StoreImpl.scala b/modules/store/src/main/scala/sharry/store/doobie/StoreImpl.scala new file mode 100644 index 00000000..112f36c0 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/doobie/StoreImpl.scala @@ -0,0 +1,38 @@ +package sharry.store.doobie + +import bitpeace.{Bitpeace, BitpeaceConfig, TikaMimetypeDetect} +import cats.effect.Effect +import cats.implicits._ +import sharry.common.Ident +import sharry.store.migrate.FlywayMigrate +import sharry.store.{AddResult, JdbcConfig, Store} +import doobie._ +import doobie.implicits._ + +final class StoreImpl[F[_]: Effect](jdbc: JdbcConfig, xa: Transactor[F]) extends Store[F] { + val bitpeaceCfg = + BitpeaceConfig("filemeta", "filechunk", TikaMimetypeDetect, Ident.randomId[F].map(_.id)) + + def migrate: F[Int] = + FlywayMigrate.run[F](jdbc) + + def transact[A](prg: doobie.ConnectionIO[A]): F[A] = + prg.transact(xa) + + def transact[A](prg: fs2.Stream[doobie.ConnectionIO, A]): fs2.Stream[F, A] = + prg.transact(xa) + + def bitpeace: Bitpeace[F] = + Bitpeace(bitpeaceCfg, xa) + + def add(insert: ConnectionIO[Int], exists: ConnectionIO[Boolean]): F[AddResult] = + for { + save <- transact(insert).attempt + exist <- save.swap.traverse(ex => transact(exists).map(b => (ex, b))) + } yield exist.swap match { + case Right(_) => AddResult.Success + case Left((_, true)) => + AddResult.EntityExists("Adding failed, because the entity already exists.") + case Left((ex, _)) => AddResult.Failure(ex) + } +} diff --git a/modules/store/src/main/scala/sharry/store/evolution.scala b/modules/store/src/main/scala/sharry/store/evolution.scala deleted file mode 100644 index e171abd2..00000000 --- a/modules/store/src/main/scala/sharry/store/evolution.scala +++ /dev/null @@ -1,193 +0,0 @@ -package sharry.store - -import org.log4s._ -import fs2.{Pure, Stream} -import cats.effect.IO -import cats.implicits._ -import doobie._, doobie.implicits._ -import sharry.common.streams - -object evolution { - - implicit private[this] val logger = getLogger - - type Change = Transactor[IO] => Stream[IO, Unit] - - object Change { - def apply(update: Update0): Change = - xa => { - streams.slogT(_.info(update.sql)) ++ - Stream.eval(update.run.transact(xa)).map(_ => ()) - } - } - - sealed trait Dbms { - def blob: Fragment - def currentTimestamp: Fragment - def dropDatabase(db: String): Fragment - } - case object H2 extends Dbms { - val blob = Fragment.const("blob") - val currentTimestamp = Fragment.const("current_timestamp()") - - def dropDatabase(db: String) = fr"drop all objects delete files;" - - } - case object Postgres extends Dbms { - val blob = Fragment.const("bytea") - val currentTimestamp = Fragment.const("current_timestamp") - - def dropDatabase(db: String) = fr"drop database $db; create database $db;" - } - - object Dbms { - def apply(jdbcUrl: String): Dbms = - jdbcUrl.split(":").toList match { - case _ :: "postgresql" :: _ => Postgres - case _ :: "h2" :: _ => H2 - case _ => sys.error(s"unknown dbms: $jdbcUrl") - } - } - - def apply(jdbcUrl: String): Runner = - new Runner(Dbms(jdbcUrl), "sitebagdev") - - def apply(dbms: Dbms, db: String): Runner = - new Runner(dbms, db) - - final class Runner(dbms: Dbms, db: String) { - - private val changes = changesFor(dbms) - - /** Run all changes not yet applied */ - def runChanges(xa: Transactor[IO]): IO[Unit] = { - Stream.eval(getState(xa)).flatMap { version => - changes.zipWithIndex.drop(version.toLong).flatMap { - case (change, idx) => - change(xa) ++ Stream.eval(updateState(idx+1)(xa)) - } - }.compile.drain - } - - /** get the current state of the database */ - def getState(xa: Transactor[IO]): IO[Int] = { - val version = sql"""SELECT max(version) FROM dbversion""" - .query[Int] - .unique - .transact(xa) - version.handleError(_ => 0) - } - - def dropDatabase(xa: Transactor[IO]): IO[Unit] = { - dbms.dropDatabase(db).update.run.transact(xa).map(_ => ()) - } - - private def updateState(version: Long)(xa: Transactor[IO]): IO[Unit] = { - sql"""INSERT INTO dbversion (version) VALUES ($version)""".update - .run.transact(xa).map(_ => ()) - } - } - - def changesFor(dbms: Dbms): Stream[Pure, Change] = Stream( - /* This table is used to track this list of changes. When the changes - * are applied to a database, it can use this info to run only the - * changes that have not been applied. - */ - Change((fr"""CREATE TABLE IF NOT EXISTS dbversion ( - createdb timestamp not null default""" ++ dbms.currentTimestamp ++ fr""", - version int not null, - primary key (version) - ); - """).update), - - /* BinaryStore. Following tables are for storing binary data. In order - * to have some random access to the bytes, they are not stored as - * one blob, but in chunks of blobs. Additionally, the - * content-type is stored. - */ - Change((fr""" - CREATE TABLE IF NOT EXISTS FileMeta ( - id varchar(64) not null, - timestamp varchar(40) not null, - mimetype varchar(254) not null, - length bigint not null, - chunks int not null, - chunksize int not null, - primary key (id) - ); - CREATE TABLE IF NOT EXISTS FileChunk ( - fileId varchar(64) not null, - chunkNr int not null, - chunkLength int not null, - chunkData""" ++ dbms.blob ++ fr""" not null, - primary key (fileId, chunkNr) - );""").update), - - /* This table is used to maintain accounts to the application. - */ - Change(sql""" - CREATE TABLE IF NOT EXISTS Account ( - login varchar(254) not null, - password varchar(254) null, - email varchar(254) null, - admin boolean not null, - enabled boolean not null, - extern boolean not null, - primary key (login)); - CREATE INDEX account_email_idx ON Account(email);""".update), - - Change(sql""" - CREATE TABLE IF NOT EXISTS Upload ( - id varchar(254) not null primary key, - login varchar(254) not null, - alias varchar(254), - description text, - validity varchar(50) not null, - maxdownloads int, - password varchar(254), - created varchar(40) not null, - downloads int, - lastDownload varchar(40), - publishId varchar(200), - publishDate varchar(40), - publishUntil varchar(40), - foreign key (login) references Account(login) on delete cascade); - CREATE INDEX uploadconfig_publishid_idx ON Upload(publishId); - CREATE INDEX uploadconfig_publishuntil_idx ON Upload(publishUntil); - CREATE INDEX uploadconfig_publishdate_idx ON Upload(publishDate);""".update), - - Change(sql""" - CREATE TABLE IF NOT EXISTS UploadFile ( - uploadId varchar(254) not null, - fileId varchar(64) not null, - filename varchar(2000), - downloads int, - lastDownload varchar(40), - primary key (uploadId, fileId), - foreign key (uploadId) references Upload(id), - foreign key (fileId) references FileMeta(id))""".update), - - Change(sql""" - CREATE TABLE IF NOT EXISTS Alias ( - id varchar(254) not null primary key, - login varchar(254) not null, - name varchar(254) not null, - validity varchar(50) not null, - created varchar(40) not null, - enable boolean not null - )""".update), - - Change(sql""" - ALTER TABLE UploadFile ADD COLUMN clientFileId varchar(512); - UPDATE UploadFile SET clientFileId = fileId WHERE clientFileId is null; - """.update), - - Change(sql""" - ALTER TABLE FileMeta ADD COLUMN checksum varchar(254); - UPDATE FileMeta SET checksum = id WHERE checksum is null; - ALTER TABLE FileMeta ALTER COLUMN checksum set not null; - """.update), - Change(sql"""UPDATE FileChunk SET chunkNr = chunkNr - 1""".update), - Change(sql"""ALTER TABLE Upload ADD COLUMN name varchar(254);""".update) - ) -} diff --git a/modules/store/src/main/scala/sharry/store/migrate/FlywayMigrate.scala b/modules/store/src/main/scala/sharry/store/migrate/FlywayMigrate.scala new file mode 100644 index 00000000..e6407aac --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/migrate/FlywayMigrate.scala @@ -0,0 +1,49 @@ +package sharry.store.migrate + +import cats.effect.Sync +import sharry.store.JdbcConfig +import org.flywaydb.core.Flyway +import org.log4s._ + +object FlywayMigrate { + private[this] val logger = getLogger + + def run[F[_]: Sync](jdbc: JdbcConfig): F[Int] = Sync[F].delay { + logger.info("Running db migrations...") + val fw = makeFlyway(jdbc) + fw.repair() + fw.migrate() + } + + def makeFlyway(jdbc: JdbcConfig) = { + val locations = findLocations(jdbc) + logger.info(s"Using migration locations: $locations") + Flyway + .configure() + .cleanDisabled(true) + .dataSource(jdbc.url.asString, jdbc.user, jdbc.password) + .locations(locations: _*) + .load() + } + + def baselineFlyway(jdbc: JdbcConfig): Flyway = { + val locations = findLocations(jdbc) + Flyway + .configure() + .dataSource(jdbc.url.asString, jdbc.user, jdbc.password) + .baselineOnMigrate(true) + .locations(locations: _*) + .load() + } + + def findLocations(jdbc: JdbcConfig) = + jdbc.dbmsName match { + case Some(dbtype) => + val name = if (dbtype == "h2") "postgresql" else dbtype + List("classpath:db/migration/common", s"classpath:db/migration/${name}") + case None => + logger.warn(s"Cannot read database name from jdbc url: ${jdbc.url}. Go with H2") + List("classpath:db/migration/common", "classpath:db/h2") + } + +} diff --git a/modules/store/src/main/scala/sharry/store/migrate/MigrateFrom06.scala b/modules/store/src/main/scala/sharry/store/migrate/MigrateFrom06.scala new file mode 100644 index 00000000..fdf34dde --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/migrate/MigrateFrom06.scala @@ -0,0 +1,276 @@ +package sharry.store.migrate + +import fs2.Stream +import doobie._ +import doobie.implicits._ +import cats.implicits._ +import cats.effect._ +import org.log4s.getLogger +import scala.concurrent.ExecutionContext + +import sharry.common._ +import sharry.common.syntax.all._ +import sharry.store.Store +import sharry.store.JdbcConfig +import sharry.store.records._ +import sharry.store.doobie.Sql +import sharry.store.doobie.DoobieMeta._ +import cats.data.OptionT + +final class MigrateFrom06[F[_]: Effect: ContextShift]( + cfg: JdbcConfig, + store: Store[F], + blocker: Blocker +) { + private[this] val logger = getLogger + + def migrate: F[Unit] = + for { + a <- createTables + b <- copyAccounts + c <- copyAlias + d <- copyShare + e <- copyFiles + errs = a + b + c + d + e + _ <- if (errs == 0) dropOldTables *> flywayBaseline *> logger.finfo[F]("Migration done") + else logger.finfo[F]("Some error occured, you might try again") + } yield () + + def flywayBaseline: F[Unit] = Effect[F].delay { + val fw = FlywayMigrate.baselineFlyway(cfg) + fw.migrate() + () + } + + def dropOldTables: F[Unit] = + for { + _ <- logger.finfo[F]("Dropping old tables") + _ <- store.transact(sql"DROP TABLE dbversion".update.run) + _ <- store.transact(sql"DROP TABLE uploadfile".update.run) + _ <- store.transact(sql"DROP TABLE upload".update.run) + _ <- store.transact(sql"DROP TABLE alias".update.run) + _ <- store.transact(sql"DROP TABLE account".update.run) + } yield () + + def createTables: F[Int] = { + val db = cfg.dbmsName match { + case Some("h2") => "postgresql" + case Some(n) => n + case None => sys.error(s"Unknown dbms for url: ${cfg.url}") + } + val file = Option(getClass.getResource(s"/db/migration/$db/V1.0.0__initial.sql")) match { + case None => sys.error("Schema file not found") + case Some(f) => f + } + val text = fs2.io + .readInputStream(Effect[F].delay(file.openStream()), 8 * 1024, blocker) + .through(fs2.text.utf8Decode) + .fold1(_ + _) + .compile + .lastOrError + + for { + stmt <- text + _ <- logger.finfo[F]("Creating new tables") + n <- result(store.transact(Fragment.const(stmt).update.run), "Error creating tables") + } yield n + } + + def copyAlias: F[Int] = { + val next: Fragment = + sql"SELECT ROW_NUMBER() OVER() AS rn,t.* FROM alias t" + + logger.finfo[F]("Copying aliases...") *> + loadChunks[OldAlias](next)(-1) + .evalMap(_.toRAlias) + .evalTap(a => logger.finfo[F](s"Inserting alias: $a")) + .evalMap(a => result(store.transact(RAlias.insert(a)), "Error inserting alias")) + .compile + .foldMonoid + } + + def copyShare: F[Int] = { + val next: Fragment = + sql"SELECT ROW_NUMBER() OVER() AS rn, t.* FROM upload t" + + logger.finfo[F]("Copying shares...") *> + loadChunks[Upload](next)(-1) + .evalMap( + u => + for { + share <- u.toShare + psha <- u.toPublish.value + _ <- logger.finfo[F](s"Inserting share: $share") + n <- result(store.transact(RShare.insert(share)), "Error inserting share") + _ <- psha.map(p => store.transact(RPublishShare.insert(p))).getOrElse(0.pure[F]) + } yield n + ) + .compile + .foldMonoid + } + + def copyFiles: F[Int] = { + val q: Fragment = + sql"SELECT ROW_NUMBER() OVER() AS rn,t.* FROM uploadfile t" + + logger.finfo[F]("Copying files...") *> + loadChunks[UploadFile](q)(-1) + .evalMap(_.toRShareFile) + .evalTap(f => logger.finfo[F](s"Insert file: $f")) + .evalMap(f => result(store.transact(RShareFile.insert(f)), "Error inserting file")) + .compile + .foldMonoid + } + + def copyAccounts: F[Int] = { + val next: Fragment = + sql"SELECT ROW_NUMBER() OVER() AS rn,t.* FROM account t" + + logger.finfo[F]("Copying accounts...") *> + loadChunks[OldAccount](next)(-1) + .evalMap(_.toAccount) + .evalTap(a => logger.finfo[F](s"Insert account: $a")) + .evalMap(a => result(store.transact(RAccount.insert(a)), "Error inserting account")) + .compile + .foldMonoid + } + + def loadChunks[A <: RowNum: Read](q: Fragment)(start: Long): Stream[F, A] = { + val query = fr"SELECT * FROM (" ++ q ++ fr") v WHERE v.rn > $start ORDER BY v.rn" + + Stream.eval(store.transact(query.query[A].stream.take(50).compile.toVector)).flatMap { v => + if (v.isEmpty) Stream.empty + else Stream.emits(v) ++ loadChunks(q)(v.last.rownum) + } + } + + + def result[A](fu: F[A], errmsg: => String): F[Int] = + fu.attempt.flatMap { + case Right(_) => 0.pure[F] + case Left(ex) => + logger.ferror[F](ex)(errmsg).as(1) + } + + def accountId(login: Ident): F[Ident] = + store.transact( + Sql + .selectSimple(Seq(RAccount.Columns.id), RAccount.table, RAccount.Columns.login.is(login)) + .query[Ident] + .unique + ) + + def getFileLength(fid: Ident): F[ByteSize] = + store.transact(sql"SELECT length FROM filemeta WHERE id = $fid".query[ByteSize].unique) + + trait RowNum { + def rownum: Long + } + case class OldAccount( + rownum: Long, + login: Ident, + password: Option[Password], + email: Option[String], + admin: Boolean, + enabled: Boolean, + extern: Boolean + ) extends RowNum { + def toAccount: F[RAccount] = + for { + now <- Timestamp.current[F] + id <- Ident.randomId[F] + } yield RAccount( + id, + login, + if (extern) AccountSource.Extern else AccountSource.Intern, + if (enabled) AccountState.Active else AccountState.Disabled, + password.getOrElse(Password.empty), + email, + admin, + 0, + None, + now + ) + + } + + case class UploadFile( + rownum: Long, + id: Ident, + fileId: Ident, + filename: Option[String], + donwloads: Int, + lastDownload: Option[Timestamp] + ) extends RowNum{ + + def toRShareFile: F[RShareFile] = + for { + now <- Timestamp.current[F] + len <- getFileLength(fileId) + } yield RShareFile(fileId, id, fileId, filename, now, len) + } + + case class Upload( + rownum: Long, + id: Ident, + login: Ident, + alias: Option[Ident], + descr: Option[String], + validity: java.time.Duration, + maxdl: Int, + password: Option[Password], + created: Timestamp, + downloads: Int, + lastdl: Option[Timestamp], + publishId: Option[Ident], + publishDate: Option[Timestamp], + publishUntil: Option[Timestamp], + name: Option[String] + ) extends RowNum { + + def toShare: F[RShare] = + for { + accId <- accountId(login) + } yield RShare(id, accId, alias, name, Duration(validity), maxdl, password, descr, created) + + def toPublish: OptionT[F, RPublishShare] = + for { + pid <- OptionT.fromOption[F](publishId) + pd <- OptionT.fromOption[F](publishDate) + pu <- OptionT.fromOption[F](publishUntil) + } yield RPublishShare(pid, id, true, downloads, lastdl, pd, pu, pd) + + } + + case class OldAlias( + rownum: Long, + id: Ident, + login: Ident, + name: String, + validity: java.time.Duration, + created: Timestamp, + enabled: Boolean + ) extends RowNum { + + def toRAlias: F[RAlias] = + for { + accId <- accountId(login) + } yield RAlias(id, accId, name, Duration(validity), enabled, created) + } + + implicit def metaJavaDuration: Meta[java.time.Duration] = + Meta[String].timap(s => java.time.Duration.parse(s))(_.toString) +} + +object MigrateFrom06 { + + def apply[F[_]: Effect: ContextShift]( + cfg: JdbcConfig, + connectEC: ExecutionContext, + blocker: Blocker + ): Resource[F, MigrateFrom06[F]] = + for { + store <- Store.create(cfg, connectEC, blocker, false) + } yield new MigrateFrom06[F](cfg, store, blocker) + +} diff --git a/modules/store/src/main/scala/sharry/store/records/ModAccount.scala b/modules/store/src/main/scala/sharry/store/records/ModAccount.scala new file mode 100644 index 00000000..fcc4daf2 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/ModAccount.scala @@ -0,0 +1,10 @@ +package sharry.store.records + +import sharry.common._ + +case class ModAccount( + state: AccountState, + admin: Boolean, + email: Option[String], + password: Option[Password] +) diff --git a/modules/store/src/main/scala/sharry/store/records/RAccount.scala b/modules/store/src/main/scala/sharry/store/records/RAccount.scala new file mode 100644 index 00000000..641b62a3 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/RAccount.scala @@ -0,0 +1,140 @@ +package sharry.store.records + +import fs2.Stream +import cats.implicits._ +import doobie._, doobie.implicits._ +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ + +case class RAccount( + id: Ident, + login: Ident, + source: AccountSource, + state: AccountState, + password: Password, + email: Option[String], + admin: Boolean, + loginCount: Int, + lastLogin: Option[Timestamp], + created: Timestamp +) { + + def accountId(alias: Option[Ident]): AccountId = + AccountId(id, login, admin, alias) +} + +object RAccount { + val table = fr"account_" + + object Columns { + val id = Column("id") + val login = Column("login") + val source = Column("source") + val state = Column("state") + val password = Column("password") + val email = Column("email") + val admin = Column("admin") + val loginCount = Column("logincount") + val lastLogin = Column("lastlogin") + val created = Column("created") + + val all = List(id, login, source, state, password, email, admin, loginCount, lastLogin, created) + } + + import Columns._ + + def insert(v: RAccount): ConnectionIO[Int] = { + val sql = Sql.insertRow( + table, + all, + fr"${v.id},${v.login},${v.source},${v.state},${v.password},${v.email},${v.admin},${v.loginCount},${v.lastLogin},${v.created}" + ) + sql.update.run + } + + def update(aid: Ident, v: ModAccount): ConnectionIO[Int] = { + val up1 = Sql.updateRow( + table, + Sql.and(id.is(aid), source.is(AccountSource.intern)), + Sql.commas( + state.setTo(v.state), + email.setTo(v.email), + admin.setTo(v.admin), + password.setTo(v.password.getOrElse(Password.empty)) + ) + ) + + val up2 = Sql.updateRow( + table, + Sql.and(id.is(aid), source.is(AccountSource.intern)), + Sql.commas(state.setTo(v.state), email.setTo(v.email), admin.setTo(v.admin)) + ) + + val up3 = Sql.updateRow( + table, + Sql.and(id.is(aid), source.isNot(AccountSource.intern)), + Sql.commas(state.setTo(v.state), email.setTo(v.email), admin.setTo(v.admin)) + ) + + for { + n <- if (v.password.nonEmpty) up1.update.run else up2.update.run + k <- if (n == 0) up3.update.run else 0.pure[ConnectionIO] + } yield n + k + } + + def setEmail(aid: Ident, v: Option[String]): ConnectionIO[Int] = + Sql.updateRow(table, id.is(aid), email.setTo(v)).update.run + + def updatePassword(aid: Ident, pw: Password): ConnectionIO[Int] = + Sql.updateRow(table, id.is(aid), password.setTo(pw)).update.run + + def updateStatsById(accId: Ident): ConnectionIO[Int] = + Sql.currentTime.flatMap( + t => + Sql + .updateRow( + table, + id.is(accId), + Sql.commas( + loginCount.increment(1), + lastLogin.setTo(t) + ) + ) + .update + .run + ) + + def findByLogin(user: Ident): ConnectionIO[Option[RAccount]] = + Sql.selectSimple(all, table, login.is(user)).query[RAccount].option + + def findById(uid: Ident): ConnectionIO[Option[RAccount]] = + Sql.selectSimple(all, table, id.is(uid)).query[RAccount].option + + def findByAlias(alias: Ident): ConnectionIO[Option[RAccount]] = { + val aliasId = "n" :: RAlias.Columns.id + val aliasEnabled = "n" :: RAlias.Columns.enabled + val aliasAccount = "n" :: RAlias.Columns.account + val accId = "a" :: Columns.id + val from = table ++ fr"a INNER JOIN" ++ RAlias.table ++ fr"n ON" ++ accId.is(aliasAccount) + Sql + .selectSimple( + all.map("a" :: _), + from, + Sql.and(aliasId.is(alias), aliasEnabled.is(true)) + ) + .query[RAccount] + .option + + } + + def existsByLogin(user: Ident): ConnectionIO[Boolean] = + Sql.selectCount(login, table, login.is(user)).query[Int].map(_ > 0).unique + + def findAll(loginQ: String): Stream[ConnectionIO, RAccount] = { + val q = + if (loginQ.isEmpty) Fragment.empty + else login.like("%" + loginQ + "%") + Sql.selectSimple(all, table, q).query[RAccount].stream + } +} diff --git a/modules/store/src/main/scala/sharry/store/records/RAlias.scala b/modules/store/src/main/scala/sharry/store/records/RAlias.scala new file mode 100644 index 00000000..f4a9bbd0 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/RAlias.scala @@ -0,0 +1,86 @@ +package sharry.store.records + +import fs2.Stream +import cats.implicits._ +import doobie._, doobie.implicits._ +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ +import cats.effect.Sync + +case class RAlias( + id: Ident, + account: Ident, + name: String, + validity: Duration, + enabled: Boolean, + created: Timestamp +) + +object RAlias { + val table = fr"alias_" + + object Columns { + val id = Column("id") + val account = Column("account_id") + val name = Column("name_") + val validity = Column("validity") + val enabled = Column("enabled") + val created = Column("created") + + val all = List(id, account, name, validity, enabled, created) + } + + def createNew[F[_]: Sync]( + account: Ident, + name: String, + validity: Duration, + enabled: Boolean + ): F[RAlias] = + for { + id <- Ident.randomId[F] + now <- Timestamp.current[F] + } yield RAlias(id, account, name, validity, enabled, now) + + import Columns._ + + def insert(v: RAlias): ConnectionIO[Int] = { + val sql = Sql.insertRow( + table, + all, + fr"${v.id},${v.account},${v.name},${v.validity},${v.enabled},${v.created}" + ) + sql.update.run + } + + def update(aid: Ident, acc: Ident, v: RAlias): ConnectionIO[Int] = + Sql + .updateRow( + table, + Sql.and(id.is(aid), account.is(acc)), + Sql.commas( + id.setTo(v.id), + name.setTo(v.name), + validity.setTo(v.validity), + enabled.setTo(v.enabled) + ) + ) + .update + .run + + def findById(aliasId: Ident, accId: Ident): ConnectionIO[Option[RAlias]] = + Sql.selectSimple(all, table, Sql.and(id.is(aliasId), account.is(accId))).query[RAlias].option + + def existsById(aliasId: Ident): ConnectionIO[Boolean] = + Sql.selectCount(id, table, id.is(aliasId)).query[Int].map(_ > 0).unique + + def findAll(acc: Ident, nameQ: String): Stream[ConnectionIO, RAlias] = { + val q = + if (nameQ.isEmpty) Fragment.empty + else name.like("%" + nameQ + "%") + Sql.selectSimple(all, table, Sql.and(account.is(acc), q)).query[RAlias].stream + } + + def delete(aliasId: Ident, accId: Ident): ConnectionIO[Int] = + Sql.deleteFrom(table, Sql.and(account.is(accId), id.is(aliasId))).update.run +} diff --git a/modules/store/src/main/scala/sharry/store/records/RInvitation.scala b/modules/store/src/main/scala/sharry/store/records/RInvitation.scala new file mode 100644 index 00000000..754db3cf --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/RInvitation.scala @@ -0,0 +1,50 @@ +package sharry.store.records + +import cats.implicits._ +import cats.effect.Sync +import doobie._ +import doobie.implicits._ +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ + +case class RInvitation(id: Ident, created: Timestamp) {} + +object RInvitation { + + val table = fr"invitation" + + object Columns { + val id = Column("id") + val created = Column("created") + val all = List(id, created) + } + import Columns._ + + def generate[F[_]: Sync]: F[RInvitation] = + for { + c <- Timestamp.current[F] + i <- Ident.randomId[F] + } yield RInvitation(i, c) + + def insert(v: RInvitation): ConnectionIO[Int] = + Sql.insertRow(table, all, fr"${v.id},${v.created}").update.run + + def insertNew: ConnectionIO[RInvitation] = + generate[ConnectionIO].flatMap(v => insert(v).map(_ => v)) + + def findById(invite: Ident): ConnectionIO[Option[RInvitation]] = + Sql.selectSimple(all, table, id.is(invite)).query[RInvitation].option + + def delete(invite: Ident): ConnectionIO[Int] = + Sql.deleteFrom(table, id.is(invite)).update.run + + def useInvite(invite: Ident, minCreated: Timestamp): ConnectionIO[Boolean] = { + val get = + Sql.selectCount(id, table, Sql.and(id.is(invite), created.isGt(minCreated))).query[Int].unique + for { + inv <- get + _ <- delete(invite) + } yield inv > 0 + } +} diff --git a/modules/store/src/main/scala/sharry/store/records/RPublishShare.scala b/modules/store/src/main/scala/sharry/store/records/RPublishShare.scala new file mode 100644 index 00000000..353d1bc1 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/RPublishShare.scala @@ -0,0 +1,97 @@ +package sharry.store.records + +//import cats.implicits._ +import doobie._, doobie.implicits._ +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ +import cats.effect.Sync + +case class RPublishShare( + id: Ident, + shareId: Ident, + enabled: Boolean, + views: Int, + lastAccess: Option[Timestamp], + publishDate: Timestamp, + publishUntil: Timestamp, + created: Timestamp +) + +object RPublishShare { + + val table = fr"publish_share" + + object Columns { + + val id = Column("id") + val shareId = Column("share_id") + val enabled = Column("enabled") + val views = Column("views") + val lastAccess = Column("last_access") + val publishDate = Column("publish_date") + val publishUntil = Column("publish_until") + val created = Column("created") + + val all = List(id, shareId, enabled, views, lastAccess, publishDate, publishUntil, created) + } + + import Columns._ + + def insert(v: RPublishShare): ConnectionIO[Int] = + Sql + .insertRow( + table, + all, + fr"${v.id},${v.shareId},${v.enabled},${v.views}," ++ + fr"${v.lastAccess},${v.publishDate},${v.publishUntil}," ++ + fr"${v.created}" + ) + .update + .run + + def update(v: RPublishShare): ConnectionIO[Int] = + Sql + .updateRow( + table, + shareId.is(v.shareId), + Sql.commas( + id.setTo(v.id), + enabled.setTo(v.enabled), + views.setTo(v.views), + lastAccess.setTo(v.lastAccess), + publishDate.setTo(v.publishDate), + publishUntil.setTo(v.publishUntil) + ) + ) + .update + .run + + def existsByShare(share: Ident): ConnectionIO[Boolean] = + Sql.selectCount(id, table, shareId.is(share)).query[Int].unique.map(_ > 0) + + def findByShare(share: Ident): ConnectionIO[Option[RPublishShare]] = + Sql.selectSimple(all, table, shareId.is(share)).query[RPublishShare].option + + def initialInsert[F[_]: Sync](share: Ident): ConnectionIO[RPublishShare] = + for { + now <- Timestamp.current[ConnectionIO] + id <- Ident.randomId[ConnectionIO] + validity <- RShare.getDuration(share) + record = RPublishShare(id, share, true, 0, None, now, now.plus(validity), now) + n <- insert(record) + } yield record + + def update(share: Ident, enable: Boolean, reuseId: Boolean): ConnectionIO[Int] = + for { + nid <- Ident.randomId[ConnectionIO] + validity <- RShare.getDuration(share) + now <- Timestamp.current[ConnectionIO] + sets = Seq(enabled.setTo(enable)) ++ + (if (enable) Seq(publishDate.setTo(now), publishUntil.setTo(now.plus(validity))) + else Seq.empty) ++ + (if (reuseId) Seq.empty else Seq(id.setTo(nid))) + frag <- Sql.updateRow(table, shareId.is(share), Sql.commas(sets)).update.run + } yield frag + +} diff --git a/modules/store/src/main/scala/sharry/store/records/RShare.scala b/modules/store/src/main/scala/sharry/store/records/RShare.scala new file mode 100644 index 00000000..25faac55 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/RShare.scala @@ -0,0 +1,58 @@ +package sharry.store.records + +import doobie._, doobie.implicits._ +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ + +case class RShare( + id: Ident, + accountId: Ident, + aliasId: Option[Ident], + name: Option[String], + validity: Duration, + maxViews: Int, + password: Option[Password], + description: Option[String], + created: Timestamp +) + +object RShare { + + val table = fr"share" + + object Columns { + + val id = Column("id") + val accountId = Column("account_id") + val aliasId = Column("alias_id") + val name = Column("name_") + val validity = Column("validity") + val maxViews = Column("max_views") + val password = Column("password") + val description = Column("description") + val created = Column("created") + + val all = List(id, accountId, aliasId, name, validity, maxViews, password, description, created) + } + + import Columns._ + + def insert(v: RShare): ConnectionIO[Int] = + Sql + .insertRow( + table, + all, + fr"${v.id},${v.accountId},${v.aliasId},${v.name}," ++ + fr"${v.validity},${v.maxViews},${v.password}," ++ + fr"${v.description},${v.created}" + ) + .update + .run + + def getDuration(share: Ident): ConnectionIO[Duration] = + Sql.selectSimple(Seq(validity), table, id.is(share)).query[Duration].unique + + def delete(sid: Ident): ConnectionIO[Int] = + Sql.deleteFrom(table, id.is(sid)).update.run +} diff --git a/modules/store/src/main/scala/sharry/store/records/RShareFile.scala b/modules/store/src/main/scala/sharry/store/records/RShareFile.scala new file mode 100644 index 00000000..62388b77 --- /dev/null +++ b/modules/store/src/main/scala/sharry/store/records/RShareFile.scala @@ -0,0 +1,53 @@ +package sharry.store.records + +import doobie._, doobie.implicits._ +import sharry.common._ +import sharry.store.doobie._ +import sharry.store.doobie.DoobieMeta._ + +case class RShareFile( + id: Ident, + shareId: Ident, + fileId: Ident, + filename: Option[String], + created: Timestamp, + realSize: ByteSize +) + +object RShareFile { + + val table = fr"share_file" + + object Columns { + val id = Column("id") + val shareId = Column("share_id") + val fileId = Column("file_id") + val filename = Column("filename") + val created = Column("created") + val realSize = Column("real_size") + val all = List(id, shareId, fileId, filename, created, realSize) + } + + import Columns._ + + def insert(v: RShareFile): ConnectionIO[Int] = + Sql + .insertRow(table, all, fr"${v.id},${v.shareId},${v.fileId},${v.filename},${v.created},${v.realSize}") + .update + .run + + def getFileMetaId(sfId: Ident): ConnectionIO[Option[Ident]] = + Sql.selectSimple(Seq(fileId), table, id.is(sfId)).query[Ident].option + + def findById(fileId: Ident): ConnectionIO[Option[RShareFile]] = + Sql.selectSimple(all, table, id.is(fileId)).query[RShareFile].option + + def delete(shareFileId: Ident): ConnectionIO[Int] = + Sql.deleteFrom(table, id.is(shareFileId)).update.run + + def deleteByFileId(fid: Ident): ConnectionIO[Int] = + Sql.deleteFrom(table, fileId.is(fid)).update.run + + def setRealSize(fid: Ident, size: ByteSize): ConnectionIO[Int] = + Sql.updateRow(table, id.is(fid), realSize.setTo(size)).update.run +} diff --git a/modules/store/src/main/scala/sharry/store/upload/SqlStatements.scala b/modules/store/src/main/scala/sharry/store/upload/SqlStatements.scala deleted file mode 100644 index f985fe63..00000000 --- a/modules/store/src/main/scala/sharry/store/upload/SqlStatements.scala +++ /dev/null @@ -1,274 +0,0 @@ -package sharry.store.upload - -import java.time.Instant -import cats.data.NonEmptyList -import cats.implicits._ -import cats.effect.IO -import doobie._, doobie.implicits._ -import org.log4s._ -import bitpeace.sql.Statements - -import sharry.common.mime._ -import sharry.common.sizes._ -import sharry.common.duration._ -import sharry.common.data._ -import sharry.store.columns._ -import sharry.store.data._ - -trait SqlStatements extends Statements[IO] { - - private[this] val logger = getLogger - private implicit val logHandler = logSql(logger) - - def insertUploadConfig(uc: Upload) = { - // if this is an upload through an alias we set the „publishUntil” - // field using the given validity so these uploads are garbage - // collected although not published. If a user chooses to publish - // this upload, this date is overwritten. - //TODO: introduce a global validity for non-published uploads - val until = uc.alias match { - case Some(a) => Some(Instant.now plus uc.validity.asJava) - case None => uc.validUntil - } - sql"""INSERT INTO Upload VALUES ( - ${uc.id}, ${uc.login}, ${uc.alias}, ${uc.description}, ${uc.validity}, - ${uc.maxDownloads}, ${uc.password}, ${uc.created}, - ${uc.downloads}, ${uc.lastDownload}, ${uc.publishId}, ${uc.publishDate}, ${until}, ${uc.name})""".update - } - - def sqlSetUploadTimestamp(uploadId: String, fileId: String, time: Instant) = - for { - a <- sql"""UPDATE FileMeta SET timestamp = $time WHERE id = $fileId""".update.run - b <- sql"""UPDATE Upload SET created = $time WHERE id = $uploadId""".update.run - } yield a + b - - def sqlSetUploadName(uploadId: String, name: Option[String]) = - sql"""UPDATE Upload SET name = $name WHERE id = $uploadId""".update - - def setFileMetaMimeType(fileId: String, mimetype: MimeType) = - sql"""UPDATE FileMeta SET mimetype = ${mimetype.asString} WHERE id = $fileId""".update - - def sqlChunkExists(uploadId: String, fileId: String, chunkNr: Int, chunkLength: Size) = { - val check = sql"""SELECT count(*) FROM UploadFile AS uf - INNER JOIN FileChunk AS fc ON uf.fileId = fc.fileId - WHERE uf.uploadId = $uploadId AND uf.fileId = $fileId AND fc.chunknr = $chunkNr""". - query[Int]. - unique. - map(_ > 0) - - for { - b <- check - f <- if (b) sqlChunkLengthCheckOrRemove(fileId, chunkNr, chunkLength) else b.pure[ConnectionIO] - } yield f - } - - def sqlChunkLengthCheckOrRemove(fileId: String, chunkNr: Int, chunkLength: Size) = { - val query = sql"""SELECT count(*) FROM FileChunk - WHERE fileId = $fileId AND chunknr = $chunkNr AND length(chunkData) != ${chunkLength.toBytes}""". - query[Int].unique - - val delete = sql"""DELETE FROM FileChunk WHERE fileId = $fileId AND chunknr = $chunkNr""".update.run - - for { - n <- query - _ <- if (n == 1) delete else 0.pure[ConnectionIO] - } yield n == 0 - } - - def insertUploadFile(f: UploadFile): Update0 = - sql"""INSERT INTO UploadFile VALUES (${f.uploadId}, ${f.fileId}, ${f.filename}, ${f.downloads}, ${f.lastDownload}, ${f.clientFileId})""".update - - def insertUploadFile(id: String, fileId: String, filename: String, downloads: Int, lastDownload: Option[Instant], clientFileId: String): ConnectionIO[UploadFile] = { - val uf = UploadFile(id, fileId, filename, downloads, lastDownload, clientFileId) - for { - _ <- insertUploadFile(uf).run - } yield uf - } - - def sqlListUploads(login: String) = - sql"""SELECT up.id,up.login,up.validity,up.maxdownloads,up.alias,up.description,up.password,up.created,up.downloads,up.lastDownload,up.publishId,up.publishDate,al.name,up.name - FROM Upload as up LEFT OUTER JOIN Alias as al ON up.alias = al.id - WHERE up.login = $login ORDER BY created DESC""". - query[Upload]. - stream - - def sqlGetUpload(id: String, login: String) = - sql"""SELECT up.id,up.login,up.validity,up.maxdownloads,up.alias,up.description,up.password,up.created,up.downloads,up.lastDownload,up.publishId,up.publishDate,al.name,up.name - FROM Upload as up LEFT OUTER JOIN Alias as al ON up.alias = al.id - WHERE up.id = $id AND up.login = $login""". - query[Upload]. - option - - def sqlGetPublishedUpload(id: String) = - sql"""SELECT up.id,up.login,up.validity,up.maxdownloads,up.alias,up.description,up.password,up.created,up.downloads,up.lastDownload,up.publishId,up.publishDate,al.name,up.name - FROM Upload as up LEFT OUTER JOIN Alias as al ON up.alias = al.id - WHERE up.publishId = $id""". - query[Upload]. - option - - def sqlGetPublishedUploadByFileId(fileId: String) = - sql"""SELECT up.id,up.login,up.validity,up.maxdownloads,up.alias,up.description,up.password,up.created,up.downloads,up.lastDownload,up.publishId,up.publishDate,al.name,up.name, - fm.id,fm.timestamp,fm.mimetype,fm.length,fm.checksum,fm.chunks,fm.chunksize, uf.filename, uf.clientFileId - FROM Upload AS up - INNER JOIN UploadFile AS uf ON uf.uploadId = up.id AND uf.fileId = $fileId - INNER JOIN FileMeta AS fm ON fm.id = uf.fileId - LEFT OUTER JOIN Alias as al ON up.alias = al.id - WHERE up.publishId is not null""". - query[(Upload, UploadInfo.File)]. - option - - def sqlGetUploadByFileId(fileId: String, login: String) = - sql"""SELECT up.id,up.login,up.validity,up.maxdownloads,up.alias,up.description,up.password,up.created,up.downloads,up.lastDownload,up.publishId,up.publishDate,al.name,up.name, - fm.id,fm.timestamp,fm.mimetype,fm.length,fm.checksum,fm.chunks,fm.chunksize, uf.filename, uf.clientFileId - FROM Upload AS up - INNER JOIN UploadFile AS uf ON uf.uploadId = up.id AND uf.fileId = $fileId - INNER JOIN FileMeta AS fm ON fm.id = uf.fileId - LEFT OUTER JOIN Alias AS al ON up.alias = al.id - WHERE up.login = $login""". - query[(Upload, UploadInfo.File)]. - option - - def sqlGetUploadFiles(id: String, login: String) = - sql"""SELECT fm.id,fm.timestamp,fm.mimetype,fm.length,fm.checksum,fm.chunks,fm.chunksize, uf.filename, uf.clientFileId from UploadFile AS uf - INNER JOIN FileMeta AS fm ON uf.fileId = fm.id - INNER JOIN Upload AS up ON up.id = uf.uploadId - WHERE uf.uploadId = $id AND up.login = $login""". - query[UploadInfo.File]. - to[List] - - def sqlGetUploadInfo(id: String, login: String) = - for { - upload <- sqlGetUpload(id, login) - files <- sqlGetUploadFiles(id, login) - } yield upload.map(up => UploadInfo(up, files)) - - def sqlPublishUpload(id: String, login: String, publishId: String, publishDate: Instant, valid: Duration) = - sql"""UPDATE Upload SET publishId = $publishId, publishDate = $publishDate, publishUntil = ${publishDate.plus(valid.asJava)} - WHERE publishId is null AND id = $id AND login = $login""". - update - - def sqlUnpublishUpload(id: String, login: String) = - sql"""UPDATE Upload SET publishId = null, publishDate = null, publishUntil = null - WHERE id = $id AND login = $login""". - update - - def sqlUpdateDownloadStats(publishId: String, inc: Int, last: Instant) = - sql"""UPDATE Upload SET downloads = downloads + $inc, lastDownload = $last WHERE publishId = $publishId""". - update - - def sqlUpdateFileDownloadStats(uploadId: String, fileId: String, inc: Int, last: Instant) = - sql"""UPDATE UploadFile SET downloads = downloads + $inc, lastDownload = $last WHERE fileId = $fileId AND uploadId = $uploadId""". - update - - def sqlSelectFileIds(uploadId: String) = - sql"""SELECT fileId FROM UploadFile WHERE uploadId = $uploadId""". - query[String]. - to[List] - - def sqlDeleteFileChunks(ids: NonEmptyList[String]) = - (sql"""DELETE FROM FileChunk WHERE """ ++ Fragments.in(fr"fileId", ids)).update - - def sqlDeleteFileMeta(ids: NonEmptyList[String]) = - (sql"""DELETE FROM FileMeta WHERE """ ++ Fragments.in(fr"id", ids)).update - - def sqlDeleteUploadFile(id: String) = - sql"""DELETE FROM UploadFile WHERE uploadId = $id""". - update - - def sqlDeleteUpload(id: String, fileIds: List[String]) = - NonEmptyList.fromList(fileIds) match { - case Some(ids) => - for { - _ <- sqlDeleteUploadFile(id).run - _ <- sql"""DELETE FROM Upload WHERE id = $id""".update.run - n <- sqlDeleteFileMeta(ids).run - _ <- sqlDeleteFileChunks(ids).run - } yield n - - case None => - for { - _ <- sql"""DELETE FROM Upload WHERE id = $id""".update.run - _ <- sqlDeleteUploadFile(id).run - } yield 0 - - } - - - def sqlListInvalidSince(since: Instant) = - sql"""SELECT id,publishUntil FROM Upload WHERE publishUntil < $since""". - query[(String, Instant)]. - stream - - def sqlInsertAlias(alias: Alias) = - sql"""INSERT INTO Alias VALUES (${alias.id}, ${alias.login}, ${alias.name}, ${alias.validity}, ${alias.created}, ${alias.enable})""". - update - - def sqlListAliases(login: String) = - sql"""SELECT id,login,name,validity,created,enable - FROM Alias WHERE login = $login - ORDER BY created DESC""". - query[Alias]. - stream - - def sqlGetAlias(id: String) = - sql"""SELECT id,login,name,validity,created,enable - FROM Alias WHERE id = $id""". - query[Alias]. - option - - def sqlDeleteAlias(id: String, login: String) = - sql"""DELETE FROM Alias WHERE id = $id AND login = $login""".update - - def sqlUpdateAlias(a: Alias, id: String) = - sql"""UPDATE Alias SET id = ${a.id}, name = ${a.name}, validity = ${a.validity}, enable = ${a.enable} - WHERE id = ${id} AND login = ${a.login}""".update - - def sqlGetActiveAlias(id: String) = - sql"""SELECT al.id,al.login,al.name,al.validity,al.created,al.enable - FROM Alias AS al - INNER JOIN Account AS ac ON al.login = ac.login - WHERE al.id = $id AND al.enable AND ac.enabled""". - query[Alias]. - option - - def sqlGetUploadSize(id: String) = - sql"""SELECT count(*), COALESCE(sum(length), 0) - FROM UploadFile AS uf - INNER JOIN FileMeta AS fm ON uf.fileid = fm.id - WHERE uf.uploadid = $id""". - query[UploadSize]. - unique - - def sqlGetUploadSizeFromChunks(id: String) = - sql"""SELECT count(distinct fm.id), COALESCE(sum(length(fc.chunkdata)), 0) - FROM UploadFile AS uf - INNER JOIN FileMeta AS fm ON uf.fileid = fm.id - INNER JOIN FileChunk AS fc ON fc.fileid = fm.id - WHERE uf.uploadid = $id""". - query[UploadSize]. - unique - - implicit class BitpeaceFilemeta(fm: FileMeta) { - def asBitpeace: bitpeace.FileMeta = bitpeace.FileMeta( - fm.id - , fm.timestamp - , bitpeace.Mimetype(fm.mimetype.primary , fm.mimetype.sub, fm.mimetype.params) - , fm.length.toBytes - , fm.checksum - , fm.chunks - , fm.chunksize.toBytes.toInt - ) - } - - implicit class SharryFileMeta(fm: bitpeace.FileMeta) { - def asSharry: FileMeta = FileMeta( - fm.id - , fm.timestamp - , MimeType(fm.mimetype.primary, fm.mimetype.sub, fm.mimetype.params) - , fm.length.bytes - , fm.checksum - , fm.chunks - , fm.chunksize.bytes - ) - } -} diff --git a/modules/store/src/main/scala/sharry/store/upload/SqlUploadStore.scala b/modules/store/src/main/scala/sharry/store/upload/SqlUploadStore.scala deleted file mode 100644 index cc906b8a..00000000 --- a/modules/store/src/main/scala/sharry/store/upload/SqlUploadStore.scala +++ /dev/null @@ -1,166 +0,0 @@ -package sharry.store.upload - -import java.time.Instant -import fs2.{Pipe, Stream} -import cats.effect.IO -import doobie._, doobie.implicits._ -import cats.implicits._ -import org.log4s._ -import bitpeace.{Bitpeace, BitpeaceConfig, MimetypeHint, FileChunk, RangeDef} -import scala.concurrent.ExecutionContext - -import sharry.common.mime._ -import sharry.common.rng._ -import sharry.common.sizes._ -import sharry.common.streams -import sharry.common.zip -import sharry.common.data._ -import sharry.store.data._ - -class SqlUploadStore(xa: Transactor[IO], val config: BitpeaceConfig[IO]) extends UploadStore with SqlStatements { - private[this] val logger = getLogger - - private val binaryStore: Bitpeace[IO] = Bitpeace(config, xa) - - def updateUpload(id: String, up: UploadUpdate): Stream[IO, Unit] = - Stream.eval(sqlSetUploadName(id, Option(up.name).map(_.trim).filter(_.nonEmpty)).run.transact(xa).map(_ => ())) - - def createUpload(up: Upload): Stream[IO, Unit] = - Stream.eval(insertUploadConfig(up).run.transact(xa)).map(_ => ()) - - def deleteUpload(id: String, login: String): Stream[IO, Int] = { - for { - fileIds <- Stream.eval(sqlSelectFileIds(id).transact(xa)) - _ <- getUpload(id, login) - n <- Stream.eval(sqlDeleteUpload(id, fileIds).transact(xa)) - } yield n - } - - def createUploadFile(uploadId: String, fileId: String, filename: String, clientFileId: String): Stream[IO, UploadFile] = - Stream.eval(insertUploadFile(uploadId, fileId, filename, 0, None, clientFileId).transact(xa)) - - def updateMime(fileId: String, mimeType: MimeType): Stream[IO, Int] = - Stream.eval(setFileMetaMimeType(fileId, mimeType).run.transact(xa)) - - def updateTimestamp(uploadId: String, fileId: String, time: Instant): Stream[IO, Int] = - Stream.eval(sqlSetUploadTimestamp(uploadId, fileId, time).transact(xa)) - - def addChunk(uploadId: String, fc: FileChunk, chunksize: Int, totalChunks: Int, hint: MimetypeHint): Stream[IO, FileMeta] = - binaryStore.addChunk(fc, chunksize, totalChunks, hint).map(_.result.asSharry) - - def chunkExists(uploadId: String, fileId: String, chunkNr: Int, chunkLength: Size): Stream[IO, Boolean] = - Stream.eval(sqlChunkExists(uploadId, fileId, chunkNr, chunkLength).transact(xa)) - - def listUploads(login: String): Stream[IO, Upload] = - sqlListUploads(login).transact(xa) - - def getUpload(id: String, login: String): Stream[IO, UploadInfo] = - Stream.eval(sqlGetUploadInfo(id, login).transact(xa)). - through(streams.optionToEmpty) - - def getPublishedUpload(id: String): Stream[IO, UploadInfo] = { - val update = sqlUpdateDownloadStats(id, 1, Instant.now).run - val get = for { - up <- sqlGetPublishedUpload(id) - files <- up match { - case Some(u) => sqlGetUploadFiles(u.id, u.login) - case None => Nil.pure[ConnectionIO] - } - } yield up.map(UploadInfo(_, files)) - - val resp = Stream.eval { - for { - up <- get.transact(xa) - _ <- update.transact(xa) - } yield up - } - resp.through(streams.optionToEmpty) - } - - def getUploadSize(id: String): Stream[IO, UploadSize] = - Stream.eval(sqlGetUploadSizeFromChunks(id).transact(xa)) - - def publishUpload(id: String, login: String): Stream[IO, Either[String, String]] = { - Stream.eval(sqlGetUpload(id, login).transact(xa)). - through(streams.optionToEmpty). - flatMap { up => - up.publishId match { - case Some(publishId) => - Stream.emit(Left(s"The upload $id is already published ($publishId)")) - case None => - val publishId = Gen.ident(32, 42).generate() - Stream.eval(sqlPublishUpload(id, login, publishId, Instant.now, up.validity).run.transact(xa)). - map(n => { - if (n == 1) Right(publishId) - else Left("Internal error, published more than one upload") - }) - } - } - } - - def unpublishUpload(id: String, login: String): Stream[IO,Either[String,Unit]] = - Stream.eval(sqlGetUpload(id, login).transact(xa)). - through(streams.optionToEmpty). - flatMap { up => - up.publishId match { - case None => - Stream.emit(Left(s"The upload $id is not published already.")) - case Some(_) => - Stream.eval(sqlUnpublishUpload(id, login).run.transact(xa)). - map(n => - if (n == 1) Right(()) - else Left("Internal error: unpublished more than one upload")) - } - } - - def getUploadByFileId(fileId: String, login: String): Stream[IO, (Upload, UploadInfo.File)] = - Stream.eval(sqlGetUploadByFileId(fileId, login).transact(xa)). - through(streams.optionToEmpty) - - def getPublishedUploadByFileId(fileId: String): Stream[IO, (Upload, UploadInfo.File)] = - Stream.eval(sqlGetPublishedUploadByFileId(fileId).transact(xa)). - through(streams.optionToEmpty) - - def fetchData(range: RangeDef): Pipe[IO, UploadInfo.File, Byte] = - _.map(_.meta.asBitpeace).through(binaryStore.fetchData(range)) - - def fetchData2(range: RangeDef): Pipe[IO, UploadInfo.File, Byte] = - _.map(_.meta.asBitpeace).through(binaryStore.fetchData2(range)) - - def zipAll(chunkSize: Int)(implicit EC: ExecutionContext): Pipe[IO, UploadInfo, Byte] = - _.flatMap(info => Stream.emits(info.files)). - map(f => f.filename -> Stream.emit(f).covary[IO].through(fetchData2(RangeDef.all))). - through(zip.zip(chunkSize)) - - - def cleanup(invalidSince: Instant): Stream[IO,Int] = { - sqlListInvalidSince(invalidSince).transact(xa).flatMap { case (id, validUntil) => - logger.info(s"Cleanup invalid since $invalidSince removes upload $id (validUntil $validUntil") - for { - fileIds <- Stream.eval(sqlSelectFileIds(id).transact(xa)) - _ <- Stream.eval(sqlDeleteUpload(id, fileIds).transact(xa)) - } yield 1 - } - } - - def createAlias(alias: Alias): Stream[IO, Unit] = - Stream.eval(sqlInsertAlias(alias).run.map(_ => ()).transact(xa)) - - def listAliases(login: String): Stream[IO, Alias] = - sqlListAliases(login).transact(xa) - - def getAlias(id: String): Stream[IO, Alias] = - Stream.eval(sqlGetAlias(id).transact(xa)). - through(streams.optionToEmpty) - - def getActiveAlias(id: String): Stream[IO, Alias] = - Stream.eval(sqlGetActiveAlias(id).transact(xa)). - through(streams.optionToEmpty) - - def deleteAlias(id: String, login: String): Stream[IO, Int] = - Stream.eval(sqlDeleteAlias(id, login).run.transact(xa)) - - def updateAlias(alias: Alias, id: String): Stream[IO, Int] = - Stream.eval(sqlUpdateAlias(alias, id).run.transact(xa)) - -} diff --git a/modules/store/src/main/scala/sharry/store/upload/UploadStore.scala b/modules/store/src/main/scala/sharry/store/upload/UploadStore.scala deleted file mode 100644 index 21e1a9f0..00000000 --- a/modules/store/src/main/scala/sharry/store/upload/UploadStore.scala +++ /dev/null @@ -1,72 +0,0 @@ -package sharry.store.upload - -import java.time.Instant -import fs2.{Pipe, Stream} -import cats.effect.IO -import bitpeace.{FileChunk, RangeDef, MimetypeHint} -import scala.concurrent.ExecutionContext - -import sharry.common.mime._ -import sharry.common.sizes._ -import sharry.common.data._ -import sharry.store.data._ - -trait UploadStore { - - def updateUpload(id: String, up: UploadUpdate): Stream[IO, Unit] - - def createUpload(up: Upload): Stream[IO, Unit] - - def createUploadFile(uploadId: String, fileId: String, filename: String, clientFileId: String): Stream[IO, UploadFile] - - def deleteUpload(id: String, login: String): Stream[IO, Int] - - def updateMime(fileId: String, mimeType: MimeType): Stream[IO, Int] - - def updateTimestamp(uploadId: String, fileId: String, time: Instant): Stream[IO, Int] - - def addChunk(uploadId: String, fc: FileChunk, chunksize: Int, totalChunks: Int, hint: MimetypeHint): Stream[IO, FileMeta] - - def chunkExists(uploadId: String, fileId: String, chunkNr: Int, chunkLength: Size): Stream[IO, Boolean] - - def listUploads(login: String): Stream[IO, Upload] - - def getUpload(id: String, login: String): Stream[IO, UploadInfo] - - def getPublishedUpload(id: String): Stream[IO, UploadInfo] - - def getUploadSize(id: String): Stream[IO, UploadSize] - - def publishUpload(id: String, login: String): Stream[IO, Either[String, String]] - - def unpublishUpload(id: String, login: String): Stream[IO,Either[String,Unit]] - - def getUploadByFileId(fileId: String, login: String): Stream[IO, (Upload, UploadInfo.File)] - - def getPublishedUploadByFileId(fileId: String): Stream[IO, (Upload, UploadInfo.File)] - - /** Fetch data using one connection per chunk. So connections are - * closed immediately after reading a chunk. */ - def fetchData(range: RangeDef): Pipe[IO, UploadInfo.File, Byte] - - /** Fetch data using one connection for the whole stream. It is closed - * once the stream terminates. */ - def fetchData2(range: RangeDef): Pipe[IO, UploadInfo.File, Byte] - - def zipAll(chunkSize: Int)(implicit EC: ExecutionContext): Pipe[IO, UploadInfo, Byte] - - def cleanup(invalidSince: Instant): Stream[IO,Int] - - def createAlias(alias: Alias): Stream[IO, Unit] - - def listAliases(login: String): Stream[IO, Alias] - - def getAlias(id: String): Stream[IO, Alias] - - /** Get an enabled alias whose referring account is enabled, too. */ - def getActiveAlias(id: String): Stream[IO, Alias] - - def deleteAlias(id: String, login: String): Stream[IO, Int] - - def updateAlias(alias: Alias, id: String): Stream[IO, Int] -} diff --git a/modules/store/src/test/resources/files/file.pdf b/modules/store/src/test/resources/files/file.pdf deleted file mode 100644 index 616b4974b78f4e8089bb2e68a3cc98d893ace879..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65404 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͑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

7A`z0Ry+ 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 Yr0?M5=I{$5E6eYzLXwb($cjS#4>F$py#N3J diff --git a/modules/store/src/test/scala/sharry/store/StoreFixtures.scala b/modules/store/src/test/scala/sharry/store/StoreFixtures.scala deleted file mode 100644 index 60ef7189..00000000 --- a/modules/store/src/test/scala/sharry/store/StoreFixtures.scala +++ /dev/null @@ -1,46 +0,0 @@ -package sharry.store - -import java.io.InputStream -import java.time.Instant -import java.net.URL -import fs2.Stream -import cats.effect.IO -import doobie._ -import sharry.common._ -import sharry.common.file._ - -trait StoreFixtures { - private def evo(db: String) = evolution(evolution.H2, db) - - def now = Instant.now - - def tx(db: String): Transactor[IO] = - Transactor.fromDriverManager[IO]( - "org.h2.Driver", s"jdbc:h2:$db", "sa", "" - ) - - def newDb(xa: Transactor[IO], db: String): IO[Unit] = { - (Stream.eval(evo(db).dropDatabase(xa)) ++ Stream.eval(evo(db).runChanges(xa))).compile.drain - } - - def resource(name: String): IO[InputStream] = - IO(Option(getClass.getResourceAsStream(name)).get) - - def resourceUrl(name: String): URL = - Option(getClass.getResource(name)).get - - def newDb(code: Transactor[IO] => Any): Unit = { - val name = rng.Gen.alphaNum(4, 12).generate() - val db = file("target")/name - val xa = tx(db.absolute.toString) - try { - newDb(xa, name).unsafeRunSync - code(xa) - } finally { - db.parent. - list. - filter(_.name startsWith name). - foreach(_.delete.unsafeRunSync) - } - } -} diff --git a/modules/store/src/test/scala/sharry/store/account/SqlAccountStoreTest.scala b/modules/store/src/test/scala/sharry/store/account/SqlAccountStoreTest.scala deleted file mode 100644 index db070199..00000000 --- a/modules/store/src/test/scala/sharry/store/account/SqlAccountStoreTest.scala +++ /dev/null @@ -1,47 +0,0 @@ -package sharry.store.account - -import org.scalatest._ -import doobie.implicits._ -import sharry.store._ -import sharry.common.data._ - -class SqlAccountStoreTest extends FlatSpec with Matchers with StoreFixtures { - - "create" should "create a new account" in newDb { xa => - val store = SqlAccountStore(xa) - val acc = Account("test", Some("pass")) - store.accountExists(acc.login).compile.last.unsafeRunSync.get should be (false) - store.createAccount(acc).compile.drain.unsafeRunSync - store.accountExists(acc.login).compile.last.unsafeRunSync.get should be (true) - } - - it should "save all data of the account" in newDb { xa => - val store = SqlAccountStore(xa) - val acc = Account.newInternal("test", "pass") - store.createAccount(acc).compile.drain.unsafeRunSync - store.getAccount(acc.login).compile.last.unsafeRunSync.get should be (acc) - } - - "delete" should "remove an account" in newDb { xa => - val store = SqlAccountStore(xa) - val acc = Account("test", Some("pass")) - store.createAccount(acc).compile.drain.unsafeRunSync - - store.accountExists(acc.login).compile.last.unsafeRunSync.get should be (true) - store.deleteAccount(acc.login).compile.last.unsafeRunSync.get should be (true) - store.accountExists(acc.login).compile.last.unsafeRunSync.get should be (false) - - sql"""select count(*) from Upload""".query[Int].unique.transact(xa).unsafeRunSync should be (0) - } - - - "set enabled" should "set enabled flag" in newDb { xa => - val store = SqlAccountStore(xa) - val acc = Account("test", Some("pass"), enabled = true) - store.createAccount(acc).compile.drain.unsafeRunSync - - store.setAccountEnabled(acc.login, false).compile.last.unsafeRunSync.get should be (true) - val accdb = store.getAccount(acc.login).compile.last.unsafeRunSync.get - accdb should be (acc.copy(enabled = false)) - } -} diff --git a/modules/webapp/src/main/css/sharry.css b/modules/webapp/src/main/css/sharry.css deleted file mode 100644 index 9f1a2eac..00000000 --- a/modules/webapp/src/main/css/sharry.css +++ /dev/null @@ -1,76 +0,0 @@ -body { - background-color: #ffffff; -} -.ui.menu .item img.logo { - margin-right: 1.5em; -} -.main.container { - margin-top: 4em; -} -.wireframe { - margin-top: 2em; -} -.ui.footer.segment { - margin: 5em 0em 0em; - padding: 5em 0em; -} - -/* login page */ -.login-page-column { - max-width: 450px; -} -body > .grid { - height: 100%; -} -.login-page-image { - margin-top: -100px; -} - -/* share page */ -.sharry-dropzone { - height: 10em; - display: flex; - align-items: center; -} -.sharry-dropzone > p.sharry-dropzone-text { - margin-right: auto; - margin-left: auto; -} - -.sharry-footer { - position: fixed; - bottom: 0px; - opacity: 0.5; - font-size: 0.7em; -} - -blockquote { - padding-left: 0.8em; - border-left: 4px solid #8b4513; -} - -.sharry-md-edit { - width: 100%; - height: 30em; - border: none; - outline: none; - border-right: 1px solid black; - font-family: monospace; - font-size: 1em; -} - -.sharry-manual { - font-size: 1.1em; - line-height: normal; - padding-bottom: 80px; -} - -.sharry-manual pre { - padding: 9px; - border: 1px solid #ccc; - border-radius: 4px; -} - -.sharry-manual pre code, code { - font-size: 0.8em; -} diff --git a/modules/webapp/src/main/elm/Api.elm b/modules/webapp/src/main/elm/Api.elm new file mode 100644 index 00000000..2901da75 --- /dev/null +++ b/modules/webapp/src/main/elm/Api.elm @@ -0,0 +1,572 @@ +module Api exposing + ( changePassword + , createAccount + , createAlias + , createEmptyShare + , createEmptyShareAlias + , deleteAlias + , deleteFile + , deleteShare + , fileOpenUrl + , fileSecUrl + , findShares + , getAlias + , getAliasTemplate + , getEmail + , getOpenShare + , getShare + , getShareTemplate + , listAccounts + , listAlias + , loadAccount + , login + , loginSession + , logout + , modifyAccount + , modifyAlias + , newInvite + , notifyAliasUpload + , oauthUrl + , publishShare + , refreshSession + , register + , sendMail + , setDescription + , setEmail + , setMaxViews + , setName + , setPassword + , setValidity + , unpublishShare + , versionInfo + ) + +import Api.Model.AccountCreate exposing (AccountCreate) +import Api.Model.AccountDetail exposing (AccountDetail) +import Api.Model.AccountList exposing (AccountList) +import Api.Model.AccountModify exposing (AccountModify) +import Api.Model.AliasChange exposing (AliasChange) +import Api.Model.AliasDetail exposing (AliasDetail) +import Api.Model.AliasList exposing (AliasList) +import Api.Model.AuthResult exposing (AuthResult) +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.EmailChange exposing (EmailChange) +import Api.Model.EmailInfo exposing (EmailInfo) +import Api.Model.GenInvite exposing (GenInvite) +import Api.Model.IdResult exposing (IdResult) +import Api.Model.InviteResult exposing (InviteResult) +import Api.Model.MailTemplate exposing (MailTemplate) +import Api.Model.OAuthItem exposing (OAuthItem) +import Api.Model.PasswordChange exposing (PasswordChange) +import Api.Model.PublishData exposing (PublishData) +import Api.Model.Registration exposing (Registration) +import Api.Model.ShareDetail exposing (ShareDetail) +import Api.Model.ShareList exposing (ShareList) +import Api.Model.ShareProperties exposing (ShareProperties) +import Api.Model.SimpleMail exposing (SimpleMail) +import Api.Model.SingleNumber exposing (SingleNumber) +import Api.Model.SingleString exposing (SingleString) +import Api.Model.UserPass exposing (UserPass) +import Api.Model.VersionInfo exposing (VersionInfo) +import Data.Flags exposing (Flags) +import Http +import Task +import Url +import Util.Http as Http2 + + +getAliasTemplate : + Flags + -> String + -> (Result Http.Error MailTemplate -> msg) + -> Cmd msg +getAliasTemplate flags aliasId receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/mail/template/alias/" ++ aliasId + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.MailTemplate.decoder + } + + +getShareTemplate : + Flags + -> String + -> (Result Http.Error MailTemplate -> msg) + -> Cmd msg +getShareTemplate flags shareId receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/mail/template/share/" ++ shareId + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.MailTemplate.decoder + } + + +sendMail : + Flags + -> SimpleMail + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +sendMail flags mail receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/mail/send" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.SimpleMail.encode mail) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +notifyAliasUpload : + Flags + -> String + -> String + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +notifyAliasUpload flags aliasId shareId receive = + Http2.aliasPost + { url = flags.config.baseUrl ++ "/api/v2/alias/mail/notify/" ++ shareId + , aliasId = aliasId + , body = Http.emptyBody + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +fileSecUrl : Flags -> String -> String -> String +fileSecUrl flags share fid = + flags.config.baseUrl ++ "/api/v2/sec/share/" ++ share ++ "/file/" ++ fid + + +fileOpenUrl : Flags -> String -> String -> String +fileOpenUrl flags share fid = + flags.config.baseUrl ++ "/api/v2/open/share/" ++ share ++ "/file/" ++ fid + + +setPassword : + Flags + -> String + -> Maybe String + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setPassword flags id value receive = + case value of + Just name -> + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/password" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.SingleString.encode (SingleString name)) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + Nothing -> + Http2.authDelete + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/password" + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +setMaxViews : + Flags + -> String + -> Int + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setMaxViews flags id value receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/maxviews" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.SingleNumber.encode (SingleNumber value)) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +setValidity : + Flags + -> String + -> Int + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setValidity flags id value receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/validity" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.SingleNumber.encode (SingleNumber value)) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +setName : + Flags + -> String + -> Maybe String + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setName flags id value receive = + case value of + Just name -> + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/name" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.SingleString.encode (SingleString name)) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + Nothing -> + Http2.authDelete + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/name" + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +setDescription : + Flags + -> String + -> String + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +setDescription flags id value receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/description" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.SingleString.encode (SingleString value)) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +deleteShare : Flags -> String -> (Result Http.Error BasicResult -> msg) -> Cmd msg +deleteShare flags id receive = + Http2.authDelete + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +deleteFile : + Flags + -> String + -> String + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +deleteFile flags share file receive = + Http2.authDelete + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ share ++ "/file/" ++ file + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +publishShare : Flags -> String -> PublishData -> (Result Http.Error BasicResult -> msg) -> Cmd msg +publishShare flags id pd receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/publish" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.PublishData.encode pd) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +unpublishShare : Flags -> String -> (Result Http.Error BasicResult -> msg) -> Cmd msg +unpublishShare flags id receive = + Http2.authDelete + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id ++ "/publish" + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +getShare : Flags -> String -> (Result Http.Error ShareDetail -> msg) -> Cmd msg +getShare flags id receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/share/" ++ id + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.ShareDetail.decoder + } + + +getOpenShare : Flags -> String -> Maybe String -> (Result Http.Error ShareDetail -> msg) -> Cmd msg +getOpenShare flags id pass receive = + Http2.getH + { url = flags.config.baseUrl ++ "/api/v2/open/share/" ++ id + , headers = + case pass of + Just pw -> + [ Http.header "Sharry-Password" pw ] + + Nothing -> + [] + , expect = Http.expectJson receive Api.Model.ShareDetail.decoder + } + + +findShares : Flags -> String -> (Result Http.Error ShareList -> msg) -> Cmd msg +findShares flags query receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/share/search?q=" ++ Url.percentEncode query + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.ShareList.decoder + } + + +createEmptyShareAlias : + Flags + -> String + -> ShareProperties + -> (Result Http.Error IdResult -> msg) + -> Cmd msg +createEmptyShareAlias flags aliasId props receive = + Http2.aliasPost + { url = flags.config.baseUrl ++ "/api/v2/alias/upload/new" + , aliasId = aliasId + , body = Http.jsonBody (Api.Model.ShareProperties.encode props) + , expect = Http.expectJson receive Api.Model.IdResult.decoder + } + + +createEmptyShare : Flags -> ShareProperties -> (Result Http.Error IdResult -> msg) -> Cmd msg +createEmptyShare flags props receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/upload/new" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.ShareProperties.encode props) + , expect = Http.expectJson receive Api.Model.IdResult.decoder + } + + +deleteAlias : Flags -> String -> (Result Http.Error BasicResult -> msg) -> Cmd msg +deleteAlias flags id receive = + Http2.authDelete + { url = flags.config.baseUrl ++ "/api/v2/sec/alias/" ++ id + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +createAlias : Flags -> AliasChange -> (Result Http.Error IdResult -> msg) -> Cmd msg +createAlias flags ac receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/alias" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.AliasChange.encode ac) + , expect = Http.expectJson receive Api.Model.IdResult.decoder + } + + +modifyAlias : Flags -> String -> AliasChange -> (Result Http.Error IdResult -> msg) -> Cmd msg +modifyAlias flags id ac receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/alias/" ++ id + , account = getAccount flags + , body = Http.jsonBody (Api.Model.AliasChange.encode ac) + , expect = Http.expectJson receive Api.Model.IdResult.decoder + } + + +getAlias : Flags -> String -> (Result Http.Error AliasDetail -> msg) -> Cmd msg +getAlias flags id receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/alias/" ++ id + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.AliasDetail.decoder + } + + +listAlias : Flags -> String -> (Result Http.Error AliasList -> msg) -> Cmd msg +listAlias flags q receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/alias?q=" ++ Url.percentEncode q + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.AliasList.decoder + } + + +changePassword : + Flags + -> PasswordChange + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +changePassword flags pwc receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/settings/password" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.PasswordChange.encode pwc) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +getEmail : Flags -> (Result Http.Error EmailInfo -> msg) -> Cmd msg +getEmail flags receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/sec/settings/email" + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.EmailInfo.decoder + } + + +setEmail : Flags -> Maybe String -> (Result Http.Error BasicResult -> msg) -> Cmd msg +setEmail flags memail receive = + let + url = + flags.config.baseUrl ++ "/api/v2/sec/settings/email" + + acc = + getAccount flags + + exp = + Http.expectJson receive Api.Model.BasicResult.decoder + in + case memail of + Just email -> + Http2.authPost + { url = url + , account = acc + , body = Http.jsonBody (Api.Model.EmailChange.encode (EmailChange email)) + , expect = exp + } + + Nothing -> + Http2.authDelete + { url = url + , account = acc + , expect = exp + } + + +modifyAccount : + Flags + -> String + -> AccountModify + -> (Result Http.Error BasicResult -> msg) + -> Cmd msg +modifyAccount flags id input receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/admin/account/" ++ id + , account = getAccount flags + , body = Http.jsonBody (Api.Model.AccountModify.encode input) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +createAccount : Flags -> AccountCreate -> (Result Http.Error BasicResult -> msg) -> Cmd msg +createAccount flags input receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/admin/account" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.AccountCreate.encode input) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +loadAccount : Flags -> String -> (Result Http.Error AccountDetail -> msg) -> Cmd msg +loadAccount flags id receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/admin/account/" ++ id + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.AccountDetail.decoder + } + + +listAccounts : Flags -> String -> (Result Http.Error AccountList -> msg) -> Cmd msg +listAccounts flags q receive = + Http2.authGet + { url = flags.config.baseUrl ++ "/api/v2/admin/account?q=" ++ Url.percentEncode q + , account = getAccount flags + , expect = Http.expectJson receive Api.Model.AccountList.decoder + } + + +register : Flags -> Registration -> (Result Http.Error BasicResult -> msg) -> Cmd msg +register flags reg receive = + Http.post + { url = flags.config.baseUrl ++ "/api/v2/open/signup/register" + , body = Http.jsonBody (Api.Model.Registration.encode reg) + , expect = Http.expectJson receive Api.Model.BasicResult.decoder + } + + +newInvite : Flags -> GenInvite -> (Result Http.Error InviteResult -> msg) -> Cmd msg +newInvite flags req receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/admin/signup/newinvite" + , account = getAccount flags + , body = Http.jsonBody (Api.Model.GenInvite.encode req) + , expect = Http.expectJson receive Api.Model.InviteResult.decoder + } + + +login : Flags -> UserPass -> (Result Http.Error AuthResult -> msg) -> Cmd msg +login flags up receive = + Http.post + { url = flags.config.baseUrl ++ "/api/v2/open/auth/login" + , body = Http.jsonBody (Api.Model.UserPass.encode up) + , expect = Http.expectJson receive Api.Model.AuthResult.decoder + } + + +logout : Flags -> (Result Http.Error () -> msg) -> Cmd msg +logout flags receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/auth/logout" + , account = getAccount flags + , body = Http.emptyBody + , expect = Http.expectWhatever receive + } + + +loginSession : Flags -> (Result Http.Error AuthResult -> msg) -> Cmd msg +loginSession flags receive = + Http2.authPost + { url = flags.config.baseUrl ++ "/api/v2/sec/auth/session" + , account = getAccount flags + , body = Http.emptyBody + , expect = Http.expectJson receive Api.Model.AuthResult.decoder + } + + +versionInfo : Flags -> (Result Http.Error VersionInfo -> msg) -> Cmd msg +versionInfo flags receive = + Http.get + { url = flags.config.baseUrl ++ "/api/v2/open/info/version" + , expect = Http.expectJson receive Api.Model.VersionInfo.decoder + } + + +refreshSession : Flags -> (Result Http.Error AuthResult -> msg) -> Cmd msg +refreshSession flags receive = + case flags.account of + Just acc -> + if acc.success && acc.validMs > 30000 then + let + delay = + acc.validMs - 30000 |> toFloat + in + Http2.executeIn delay receive (refreshSessionTask flags) + + else + Cmd.none + + Nothing -> + Cmd.none + + +refreshSessionTask : Flags -> Task.Task Http.Error AuthResult +refreshSessionTask flags = + Http2.authTask + { url = flags.config.baseUrl ++ "/api/v2/sec/auth/session" + , method = "POST" + , headers = [] + , account = getAccount flags + , body = Http.emptyBody + , resolver = Http2.jsonResolver Api.Model.AuthResult.decoder + , timeout = Nothing + } + + +getAccount : Flags -> AuthResult +getAccount flags = + Maybe.withDefault Api.Model.AuthResult.empty flags.account + + +oauthUrl : Flags -> OAuthItem -> String +oauthUrl flags item = + flags.config.baseUrl ++ "/api/v2/open/auth/oauth/" ++ item.id diff --git a/modules/webapp/src/main/elm/App/Data.elm b/modules/webapp/src/main/elm/App/Data.elm new file mode 100644 index 00000000..71fa3851 --- /dev/null +++ b/modules/webapp/src/main/elm/App/Data.elm @@ -0,0 +1,139 @@ +module App.Data exposing (..) + +import Api.Model.AuthResult exposing (AuthResult) +import Api.Model.VersionInfo exposing (VersionInfo) +import Browser exposing (UrlRequest) +import Browser.Navigation exposing (Key) +import Data.Flags exposing (Flags) +import Data.UploadState exposing (UploadState) +import Http +import Page exposing (Page(..)) +import Page.Account.Data +import Page.Alias.Data +import Page.Detail.Data +import Page.Home.Data +import Page.Info.Data +import Page.Login.Data +import Page.NewInvite.Data +import Page.OpenDetail.Data +import Page.OpenShare.Data +import Page.Register.Data +import Page.Settings.Data +import Page.Share.Data +import Page.Upload.Data +import Url exposing (Url) +import Util.Maybe + + +type alias Model = + { flags : Flags + , key : Key + , page : Page + , navMenuOpen : Bool + , version : VersionInfo + , homeModel : Page.Home.Data.Model + , loginModel : Page.Login.Data.Model + , registerModel : Page.Register.Data.Model + , newInviteModel : Page.NewInvite.Data.Model + , infoModel : Page.Info.Data.Model + , accountModel : Page.Account.Data.Model + , uploadModel : Page.Upload.Data.Model + , aliasModel : Page.Alias.Data.Model + , shareModel : Page.Share.Data.Model + , openShareModel : Page.OpenShare.Data.Model + , settingsModel : Page.Settings.Data.Model + , detailModel : Page.Detail.Data.Model + , openDetailModel : Page.OpenDetail.Data.Model + } + + +init : Key -> Url -> Flags -> Model +init key url flags = + let + page = + Page.fromUrl url |> Maybe.withDefault HomePage + in + { flags = flags + , key = key + , page = page + , navMenuOpen = False + , version = Api.Model.VersionInfo.empty + , homeModel = Page.Home.Data.emptyModel + , loginModel = Page.Login.Data.empty + , registerModel = Page.Register.Data.emptyModel + , newInviteModel = Page.NewInvite.Data.emptyModel + , infoModel = Page.Info.Data.emptyModel + , accountModel = Page.Account.Data.emptyModel + , uploadModel = Page.Upload.Data.emptyModel + , aliasModel = Page.Alias.Data.emptyModel flags + , shareModel = Page.Share.Data.emptyModel flags + , openShareModel = Page.OpenShare.Data.emptyModel + , settingsModel = Page.Settings.Data.emptyModel + , detailModel = Page.Detail.Data.emptyModel + , openDetailModel = Page.OpenDetail.Data.emptyModel + } + + +type Msg + = NavRequest UrlRequest + | NavChange Url + | VersionResp (Result Http.Error VersionInfo) + | HomeMsg Page.Home.Data.Msg + | LoginMsg Page.Login.Data.Msg + | RegisterMsg Page.Register.Data.Msg + | NewInviteMsg Page.NewInvite.Data.Msg + | InfoMsg Page.Info.Data.Msg + | UploadMsg Page.Upload.Data.Msg + | AliasMsg Page.Alias.Data.Msg + | ShareMsg Page.Share.Data.Msg + | OpenShareMsg Page.OpenShare.Data.Msg + | AccountMsg Page.Account.Data.Msg + | SettingsMsg Page.Settings.Data.Msg + | DetailMsg Page.Detail.Data.Msg + | OpenDetailMsg Page.OpenDetail.Data.Msg + | Logout + | LogoutResp (Result Http.Error ()) + | SessionCheckResp (Result Http.Error AuthResult) + | SetPage Page + | ToggleNavMenu + | UploadStateMsg (Result String UploadState) + | UploadStoppedMsg (Maybe String) + + +isSignedIn : Flags -> Bool +isSignedIn flags = + flags.account + |> Maybe.map .success + |> Maybe.withDefault False + + +isAdmin : Flags -> Bool +isAdmin flags = + flags.account + |> Util.Maybe.filter .success + |> Maybe.map .admin + |> Maybe.withDefault False + + +checkPage : Flags -> Page -> Page +checkPage flags page = + if Page.isAdmin page && not (isAdmin flags) then + InfoPage 0 + + else if Page.isSecured page && isSignedIn flags then + page + + else if Page.isOpen page then + page + + else + Page.loginPage page + + +defaultPage : Flags -> Page +defaultPage flags = + if isSignedIn flags then + HomePage + + else + LoginPage ( Nothing, False ) diff --git a/modules/webapp/src/main/elm/App/Model.elm b/modules/webapp/src/main/elm/App/Model.elm deleted file mode 100644 index 748334bc..00000000 --- a/modules/webapp/src/main/elm/App/Model.elm +++ /dev/null @@ -1,122 +0,0 @@ -module App.Model exposing (..) - -import Resumable -import Data exposing (Alias, Account, RemoteConfig, UploadInfo, Upload, UploadId(..), accountDecoder) -import Http -import Time exposing (Time) -import Pages.Login.Model as LoginModel -import Pages.AccountEdit.Model as AccountEditModel -import Pages.Upload.Model as UploadModel -import PageLocation as PL - -import Widgets.DownloadView as DownloadView -import Pages.Login.Update as LoginUpdate -import Pages.Login.Data as LoginData -import Pages.AccountEdit.Model as AccountEditModel -import Pages.AccountEdit.Update as AccountEditUpdate -import Pages.Upload.Model as UploadModel -import Pages.Download.Model as DownloadModel -import Pages.UploadList.Model as UploadListModel -import Pages.Profile.Model as ProfileModel -import Pages.AliasList.Model as AliasListModel -import Pages.AliasUpload.Model as AliasUploadModel -import Pages.Manual.Model as ManualModel -import Pages.Error.Model as ErrorModel -import Time exposing (Time) -import Navigation - -type Msg - = SetPage (Cmd Msg) - | DeferredTick Time - | LoginMsg LoginData.Msg - | AccountEditMsg AccountEditModel.Msg - | UploadMsg UploadModel.Msg - | Logout - | LoginRefresh Time - | LoginRefreshDone (Result Http.Error Account) - | ResumableMsg Resumable.Handle Resumable.Msg - | RandomString String - | UrlChange Navigation.Location - | UploadData (Result Http.Error UploadInfo) - | LoadUploadsResult (Result Http.Error (List Upload)) - | UploadListMsg UploadListModel.Msg - | DownloadMsg DownloadModel.Msg - | ProfileMsg ProfileModel.Msg - | AliasListMsg AliasListModel.Msg - | LoadAliasesResult (Result Http.Error (List Alias)) - | AliasUploadMsg AliasUploadModel.Msg - | LoadAliasResult (Result Http.Error Alias) - | ManualPageContent (Result Http.Error String) - | ManualMsg ManualModel.Msg - -type Page - = LoginPage - | IndexPage - | NewSharePage - | AccountEditPage - | DownloadPage - | UploadListPage - | ProfilePage - | AliasListPage - | AliasUploadPage - | TimeoutPage - | ManualPage - | ErrorPage - -type alias Model = - { page: Page - , location: Navigation.Location - , login: LoginModel.Model - , accountEdit: AccountEditModel.Model - , upload: UploadModel.Model - , download: DownloadModel.Model - , uploadList: UploadListModel.Model - , profile: Maybe ProfileModel.Model - , aliases: AliasListModel.Model - , aliasUpload: AliasUploadModel.Model - , manualModel: ManualModel.Model - , errorModel: ErrorModel.Model - , user: Maybe Account - , serverConfig: RemoteConfig - , deferred: List (Cmd Msg) - } - -isPublicPage: Model -> Bool -isPublicPage model = - case model.page of - LoginPage -> True - AliasUploadPage -> True - ManualPage -> True - ErrorPage -> True - DownloadPage -> - case PL.downloadPageId model.location.hash of - Just (Uid _) -> False - _ -> True - _ -> False - -initModel: RemoteConfig -> Maybe Account -> Navigation.Location -> Model -initModel cfg acc location = - { page = Maybe.withDefault LoginPage (Maybe.map (\x -> IndexPage) acc) - , location = location - , login = LoginModel.fromUrls cfg.urls cfg.welcomeMessage - , accountEdit = AccountEditModel.emptyModel cfg.urls - , upload = UploadModel.emptyModel cfg - , download = DownloadModel.emptyModel - , uploadList = UploadListModel.emptyModel cfg.urls - , profile = Maybe.map (ProfileModel.makeModel cfg.urls) acc - , aliases = AliasListModel.emptyModel cfg - , aliasUpload = AliasUploadModel.emptyModel cfg acc - , manualModel = ManualModel.makeModel "" - , errorModel = ErrorModel.emptyModel - , user = acc - , serverConfig = cfg - , deferred = [] - } - -clearModel: Model -> Model -clearModel model = - initModel model.serverConfig model.user model.location - -isAuthenticated: Model -> Bool -isAuthenticated model = - Data.isPresent model.user diff --git a/modules/webapp/src/main/elm/App/Pages.elm b/modules/webapp/src/main/elm/App/Pages.elm deleted file mode 100644 index 72b0d095..00000000 --- a/modules/webapp/src/main/elm/App/Pages.elm +++ /dev/null @@ -1,175 +0,0 @@ -module App.Pages exposing (withLocation) - -import Http -import Navigation -import Json.Decode as Decode - -import Ports -import Data exposing (UploadId(..), RemoteConfig) -import PageLocation as PL -import App.Model exposing (..) -import Pages.Profile.Model as ProfileModel - -pageExtracts: List (Model -> Maybe (Model, Cmd Msg)) -pageExtracts = - [ - findNewSharePage - ,findIndexPage - ,findUploadsPage - ,findDownloadPage - ,findLoginPage - ,findAccountEditPage - ,findProfilePage - ,findAliasListPage - ,findAliasUploadPage - ,findTimeoutPage - ,findManualPage - ,findErrorPage - ] - -withLocation: Model -> (Model, Cmd Msg) -withLocation model = - let - default = (model, Cmd.none) - all = List.map (\f -> f model) pageExtracts - result = List.foldl (Data.maybeOrElse) Nothing all - in - Maybe.withDefault default result - - - -httpGetUpload: RemoteConfig -> UploadId -> Cmd Msg -httpGetUpload cfg id = - let - url = case id of - Uid uid -> - cfg.urls.uploads ++ "/" ++ uid - Pid pid -> - cfg.urls.uploadPublish ++ "/" ++ pid - in - Http.get url Data.decodeUploadInfo - |> Http.send UploadData - -httpGetUploads: RemoteConfig -> Cmd Msg -httpGetUploads cfg = - Http.get cfg.urls.uploads (Decode.list Data.decodeUpload) - |> Http.send LoadUploadsResult - -httpGetAliases: RemoteConfig -> Cmd Msg -httpGetAliases cfg = - Http.get cfg.urls.aliases (Decode.list Data.decodeAlias) - |> Http.send LoadAliasesResult - -httpGetAlias: RemoteConfig -> String -> Cmd Msg -httpGetAlias cfg id = - Http.get (cfg.urls.aliases ++"/"++ id) Data.decodeAlias - |> Http.send LoadAliasResult - -httpGetManualPage: RemoteConfig -> String -> Cmd Msg -httpGetManualPage cfg page = - Http.getString (cfg.urls.manual ++ "/" ++ page ++ "?mdLinkPrefix=%23manual/") - |> Http.send ManualPageContent - -findIndexPage: Model -> Maybe (Model, Cmd Msg) -findIndexPage model = - if model.location.hash == PL.indexPageHref || model.location.hash == "" then - {model|page = IndexPage} ! [] |> Just - else - Nothing - -findLoginPage: Model -> Maybe (Model, Cmd Msg) -findLoginPage model = - if String.startsWith PL.loginPageHref model.location.hash then - let - m = clearModel model - in - {m | page = LoginPage} ! [] |> Just - else - Nothing - - -findUploadsPage: Model -> Maybe (Model, Cmd Msg) -findUploadsPage model = - if model.location.hash == PL.uploadsPageHref then - {model | page = UploadListPage} ! [httpGetUploads model.serverConfig] |> Just - else - Nothing - - -findDownloadPage: Model -> Maybe (Model, Cmd Msg) -findDownloadPage model = - let - location = model.location - mCmd = Maybe.map (httpGetUpload model.serverConfig) (PL.downloadPageId location.hash) - f cmd = {model | page = DownloadPage} ! [cmd] - in - Maybe.map f mCmd - - -findAccountEditPage: Model -> Maybe (Model, Cmd Msg) -findAccountEditPage model = - if model.location.hash == PL.accountEditPageHref then - {model | page = AccountEditPage} ! [] |> Just - else - Nothing - -findNewSharePage: Model -> Maybe (Model, Cmd Msg) -findNewSharePage model = - if model.location.hash == PL.newSharePageHref then - {model | page = NewSharePage} ! [] |> Just - else - Nothing - -findProfilePage: Model -> Maybe (Model, Cmd Msg) -findProfilePage model = - if model.location.hash == PL.profilePageHref then - let - default = model.user |> Maybe.map (ProfileModel.makeModel model.serverConfig.urls) - pm = Data.maybeOrElse model.profile default - in - {model | page = ProfilePage, profile = pm} ! [] |> Just - else - Nothing - -findAliasListPage: Model -> Maybe (Model, Cmd Msg) -findAliasListPage model = - if model.location.hash == PL.aliasListPageHref then - {model | page = AliasListPage} ! [httpGetAliases model.serverConfig] |> Just - else - Nothing - -findAliasUploadPage: Model -> Maybe (Model, Cmd Msg) -findAliasUploadPage model = - case PL.aliasUploadPageId model.location.hash of - Just id -> - {model | page = AliasUploadPage} ! [httpGetAlias model.serverConfig id] |> Just - Nothing -> - Nothing - -findTimeoutPage: Model -> Maybe (Model, Cmd Msg) -findTimeoutPage model = - if model.location.hash == PL.timeoutPageHref then - let - cmd = model.user - |> Maybe.map Ports.removeAccount - |> Maybe.withDefault Cmd.none - model_ = initModel model.serverConfig Nothing model.location - in - {model_ | page = TimeoutPage} ! [cmd] |> Just - else - Nothing - -findManualPage: Model -> Maybe (Model, Cmd Msg) -findManualPage model = - case PL.manualPageName model.location.hash of - Just name -> - {model | page = ManualPage} ! [httpGetManualPage model.serverConfig name] |> Just - Nothing -> - Nothing - -findErrorPage: Model -> Maybe (Model, Cmd Msg) -findErrorPage model = - if PL.errorPageHref == model.location.hash then - {model | page = ErrorPage} ! [] |> Just - else - Nothing diff --git a/modules/webapp/src/main/elm/App/Update.elm b/modules/webapp/src/main/elm/App/Update.elm index ad0d752f..9c86c958 100644 --- a/modules/webapp/src/main/elm/App/Update.elm +++ b/modules/webapp/src/main/elm/App/Update.elm @@ -1,246 +1,395 @@ -module App.Update exposing (..) - -import Http - -import Resumable -import Data exposing (accountDecoder) -import App.Model exposing (..) -import Ports exposing (..) -import PageLocation as PL - -import App.Pages as Pages -import Pages.Login.Update as LoginUpdate -import Pages.AccountEdit.Update as AccountEditUpdate -import Pages.Upload.Model as UploadModel -import Pages.Upload.Update as UploadUpdate -import Pages.Download.Model as DownloadModel -import Pages.Download.Update as DownloadUpdate -import Pages.UploadList.Model as UploadListModel -import Pages.UploadList.Update as UploadListUpdate -import Pages.Profile.Model as ProfileModel -import Pages.Profile.Update as ProfileUpdate -import Pages.AliasList.Model as AliasListModel -import Pages.AliasList.Update as AliasListUpdate -import Pages.AliasUpload.Model as AliasUploadModel -import Pages.AliasUpload.Update as AliasUploadUpdate -import Pages.Manual.Model as ManualModel -import Pages.Error.Model as ErrorModel - -update: Msg -> Model -> (Model, Cmd Msg) +module App.Update exposing (initPage, update) + +import Api +import App.Data exposing (..) +import Browser exposing (UrlRequest(..)) +import Browser.Navigation as Nav +import Data.Flags +import Page exposing (Page(..)) +import Page.Account.Data +import Page.Account.Update +import Page.Alias.Data +import Page.Alias.Update +import Page.Detail.Data +import Page.Detail.Update +import Page.Home.Data +import Page.Home.Update +import Page.Info.Data +import Page.Info.Update +import Page.Login.Data +import Page.Login.Update +import Page.NewInvite.Data +import Page.NewInvite.Update +import Page.OpenDetail.Data +import Page.OpenDetail.Update +import Page.OpenShare.Data +import Page.OpenShare.Update +import Page.Register.Data +import Page.Register.Update +import Page.Settings.Data +import Page.Settings.Update +import Page.Share.Data +import Page.Share.Update +import Page.Upload.Data +import Page.Upload.Update +import Ports +import Url +import Util.Update + + +update : Msg -> Model -> ( Model, Cmd Msg ) update msg model = case msg of - UrlChange loc -> - let - (model_, cmd) = Pages.withLocation {model | location = loc} - in - case model.user of - Just _ -> - -- unfortunately, the upload pages still needs some - -- more: setup of resumable.js event handlers. This is - -- tricky because the command must execute _after_ the - -- dom elements are present. - -- - -- putting the below in `findNewSharePage` function - -- resulted in an uncaugh-type runtime error from - -- within elm, that I couldn't resolve. - -- - -- So now these special cases are handled here. In - -- order to route the response back to the correct - -- part of the model, we add a page attribute. - if model_.page == NewSharePage then - let - cfg = Resumable.makeStandardConfig model_.serverConfig - msgs = List.map UploadMsg (UploadModel.resumableMsg (Resumable.Initialize {cfg | page = "newshare"})) - (model__, cmd_) = List.foldl combineResults (model_, Cmd.none) msgs - in - model__ ! [cmd, cmd_] - else - (model_, cmd) - - Nothing -> - if isPublicPage model_ then - (model_, cmd) - else - model_ ! [PL.loginPage loc] - - SetPage cmd -> - model ! [cmd] - - DeferredTick time -> - {model|deferred = []} ! model.deferred - - LoginMsg msg -> - let - (val, cmd, user) = LoginUpdate.update msg model.login - redirect = PL.loginPageRedirect model.location - in - case user of - Just n -> - {model | login = val, page = IndexPage, user = Just n } ! [setAccount n, redirect] - _ -> - ({model | login = val}, Cmd.map LoginMsg cmd) + HomeMsg lm -> + updateHome lm model - AccountEditMsg msg -> - let - (val, cmd) = AccountEditUpdate.update msg model.accountEdit - in - ({model | accountEdit = val}, Cmd.map AccountEditMsg cmd) + LoginMsg lm -> + updateLogin lm model - UploadMsg msg -> - let - (val, cmd, cmdd) = UploadUpdate.update msg model.upload - in - ({model| upload = val, deferred = (Cmd.map UploadMsg cmdd) :: model.deferred}, Cmd.map UploadMsg cmd) + RegisterMsg lm -> + updateRegister lm model - DownloadMsg msg -> - let - (val, cmd) = DownloadUpdate.update msg model.download - in - {model | download = val} ! [Cmd.map DownloadMsg cmd] + NewInviteMsg lm -> + updateNewInvite lm model - Logout -> - case model.user of - Just acc -> - initModel model.serverConfig Nothing model.location ! [removeAccount acc, PL.indexPage] - Nothing -> - (model, Cmd.none) - - LoginRefresh time -> - case model.user of - Just acc -> - (model, refreshCookie model) - Nothing -> - (model, Cmd.none) - - LoginRefreshDone acc -> - (model, Cmd.none) - - RandomString s -> - update (UploadMsg (UploadModel.randomPasswordMsg s)) model - - ResumableMsg page rmsg -> - -- we have to decide here which pages receive the resumable events - let - (model_, cmd_) = - if page == "newshare" then - let - msgs = List.map UploadMsg (UploadModel.resumableMsg rmsg) - in - List.foldl combineResults (model, Cmd.none) msgs - else if page == "aliasupload" then - let - msgs = List.map AliasUploadMsg (AliasUploadModel.makeResumableMsg rmsg) - in - List.foldl combineResults (model, Cmd.none) msgs - else - model ! [] - in - model_ ! [cmd_] + InfoMsg lm -> + updateInfo lm model - UploadData (Ok data) -> - let - dlmodel = DownloadModel.makeModel data model.serverConfig model.user - defcmd = (Ports.initAccordionAndTabs ()) :: (Ports.initEmbeds ()) :: model.deferred - in - {model | download = dlmodel, page = DownloadPage, deferred = defcmd} ! [] + AccountMsg lm -> + updateAccount lm model - UploadData (Err error) -> - let - msg = Debug.log "Error getting published download " (Data.errorMessage error) - in - {model| page = ErrorPage, errorModel = ErrorModel.initModel msg} ! [PL.timeoutCmd error] + AliasMsg lm -> + updateAlias lm model - LoadUploadsResult (Ok uploads) -> - {model | uploadList = UploadListModel.makeModel model.serverConfig.urls uploads, page = UploadListPage} ! [] + UploadMsg lm -> + updateUpload lm model - LoadUploadsResult (Err error) -> - let - msg = Debug.log "Error getting list of uploads " (Data.errorMessage error) - in - {model| page = ErrorPage, errorModel = ErrorModel.initModel msg} ! [PL.timeoutCmd error] + ShareMsg lm -> + updateShare lm model - LoadAliasesResult (Ok aliases) -> - {model | aliases = AliasListModel.makeModel model.serverConfig aliases, page = AliasListPage} ! [] + OpenShareMsg lm -> + updateOpenShare lm model - LoadAliasesResult (Err error) -> - let - msg = Debug.log "Error getting list of aliases " (Data.errorMessage error) - in - {model| page = ErrorPage, errorModel = ErrorModel.initModel msg} ! [PL.timeoutCmd error] + SettingsMsg lm -> + updateSettings lm model - LoadAliasResult (Ok alia) -> - let - cfg = Resumable.makeAliasConfig model.serverConfig alia.id - msgs = List.map AliasUploadMsg (AliasUploadModel.makeResumableMsg (Resumable.Initialize {cfg | page = "aliasupload"})) - (model_, cmd_) = List.foldl combineResults (model, Cmd.none) msgs - in - {model_ | aliasUpload = AliasUploadModel.makeModel model.serverConfig model.user alia, page = AliasUploadPage} ! [cmd_] + DetailMsg lm -> + updateDetail lm model - LoadAliasResult (Err error) -> - let - msg = Debug.log "Error getting alias " (Data.errorMessage error) - in - --empty/invalid alias is handled at the page - if Data.isNotFound error then - model ! [PL.timeoutCmd error] - else - {model| page = ErrorPage, errorModel = ErrorModel.initModel msg} ! [PL.timeoutCmd error] + OpenDetailMsg lm -> + updateOpenDetail lm model + + SetPage p -> + ( { model | page = p } + , Cmd.none + ) + + ToggleNavMenu -> + ( { model | navMenuOpen = not model.navMenuOpen } + , Cmd.none + ) + + UploadStateMsg (Ok lmsg) -> + Util.Update.andThen1 + [ updateShare (Page.Share.Data.Uploading lmsg) + , updateOpenShare (Page.OpenShare.Data.Uploading lmsg) + , updateDetail (Page.Detail.Data.Uploading lmsg) + ] + model - UploadListMsg msg -> + UploadStoppedMsg err -> + Util.Update.andThen1 + [ updateShare (Page.Share.Data.UploadStopped err) + , updateOpenShare (Page.OpenShare.Data.UploadStopped err) + , updateDetail (Page.Detail.Data.UploadStopped err) + ] + model + + UploadStateMsg (Err str) -> let - (ulm, ulc) = UploadListUpdate.update msg model.uploadList + _ = + Debug.log "upload err" str in - {model | uploadList = ulm} ! [Cmd.map UploadListMsg ulc] + ( model, Cmd.none ) + + VersionResp (Ok info) -> + ( { model | version = info }, Cmd.none ) - ProfileMsg msg -> - case model.profile of - Just um -> + VersionResp (Err _) -> + ( model, Cmd.none ) + + Logout -> + ( model + , Cmd.batch + [ Api.logout model.flags LogoutResp + , Ports.removeAccount () + ] + ) + + LogoutResp _ -> + ( { model | loginModel = Page.Login.Data.empty }, Page.goto (LoginPage ( Nothing, False )) ) + + SessionCheckResp res -> + case res of + Ok lr -> let - (m, c) = ProfileUpdate.update msg um + newFlags = + if lr.success then + Data.Flags.withAccount model.flags lr + + else + Data.Flags.withoutAccount model.flags + + command = + if lr.success then + Api.refreshSession newFlags SessionCheckResp + + else + Cmd.batch [ Ports.removeAccount (), Page.goto (Page.loginPage model.page) ] in - {model | profile = Just m} ! [Cmd.map ProfileMsg c] - Nothing -> - model ! [] + ( { model | flags = newFlags }, command ) - AliasListMsg msg -> - let - (m, c) = AliasListUpdate.update msg model.aliases - in - {model | aliases = m} ! [Cmd.map AliasListMsg c] + Err _ -> + ( model, Cmd.batch [ Ports.removeAccount (), Page.goto (Page.loginPage model.page) ] ) - AliasUploadMsg msg -> - let - (val, cmd, cmdd) = AliasUploadUpdate.update msg model.aliasUpload - in - ({model| aliasUpload = val, deferred = (Cmd.map AliasUploadMsg cmdd) :: model.deferred}, Cmd.map AliasUploadMsg cmd) + NavRequest req -> + case req of + Internal url -> + let + urlStr = + Url.toString url + + extern = + not <| + String.startsWith + (model.flags.config.baseUrl ++ "/app") + urlStr + + isCurrent = + Page.fromUrl url + |> Maybe.map (\p -> p == model.page) + |> Maybe.withDefault True + in + ( model + , if extern then + Nav.load urlStr - ManualPageContent (Ok cnt) -> - let - (mm, cmd) = ManualModel.update (ManualModel.Content cnt) model.manualModel - in - {model | manualModel = mm} ! [Cmd.map ManualMsg cmd] + else if isCurrent then + Cmd.none - ManualPageContent (Err error) -> - let - msg = Debug.log "Error loading manual page " (Data.errorMessage error) - in - {model| page = ErrorPage, errorModel = ErrorModel.initModel msg} ! [] + else + Nav.pushUrl model.key (Url.toString url) + ) + + External url -> + ( model + , Nav.load url + ) - ManualMsg msg -> + NavChange url -> let - (mm, cmd) = ManualModel.update msg model.manualModel + page = + Page.fromUrl url |> Maybe.withDefault HomePage + + ( m, c ) = + initPage model page in - {model | manualModel = mm} ! [Cmd.map ManualMsg cmd] + ( { m | page = page }, c ) + + +updateOpenDetail : Page.OpenDetail.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateOpenDetail lmsg model = + let + ( lm, lc ) = + Page.OpenDetail.Update.update model.flags lmsg model.openDetailModel + in + ( { model | openDetailModel = lm } + , Cmd.map OpenDetailMsg lc + ) -combineResults: Msg -> (Model, Cmd Msg) -> (Model, Cmd Msg) -combineResults msg (model, cmd) = +updateDetail : Page.Detail.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateDetail lmsg model = let - (m_, c_) = update msg model + ( lm, lc ) = + Page.Detail.Update.update model.flags lmsg model.detailModel in - (m_, Cmd.batch [cmd, c_]) + ( { model | detailModel = lm } + , Cmd.map DetailMsg lc + ) + + +updateSettings : Page.Settings.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateSettings lmsg model = + let + ( lm, lc ) = + Page.Settings.Update.update model.flags lmsg model.settingsModel + in + ( { model | settingsModel = lm } + , Cmd.map SettingsMsg lc + ) + + +updateAlias : Page.Alias.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateAlias lmsg model = + let + ( lm, lc ) = + Page.Alias.Update.update model.key model.flags lmsg model.aliasModel + in + ( { model | aliasModel = lm } + , Cmd.map AliasMsg lc + ) + + +updateUpload : Page.Upload.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateUpload lmsg model = + let + ( lm, lc ) = + Page.Upload.Update.update model.key model.flags lmsg model.uploadModel + in + ( { model | uploadModel = lm } + , Cmd.map UploadMsg lc + ) + + +updateOpenShare : Page.OpenShare.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateOpenShare lmsg model = + let + aliasId = + case model.page of + OpenSharePage id -> + id + + _ -> + "" + + ( lm, lc ) = + Page.OpenShare.Update.update aliasId model.flags lmsg model.openShareModel + in + ( { model | openShareModel = lm } + , Cmd.map OpenShareMsg lc + ) + + +updateShare : Page.Share.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateShare lmsg model = + let + ( lm, lc ) = + Page.Share.Update.update model.flags lmsg model.shareModel + in + ( { model | shareModel = lm } + , Cmd.map ShareMsg lc + ) + + +updateAccount : Page.Account.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateAccount lmsg model = + let + ( lm, lc ) = + Page.Account.Update.update model.key model.flags lmsg model.accountModel + in + ( { model | accountModel = lm } + , Cmd.map AccountMsg lc + ) + + +updateRegister : Page.Register.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateRegister lmsg model = + let + ( lm, lc ) = + Page.Register.Update.update model.flags lmsg model.registerModel + in + ( { model | registerModel = lm } + , Cmd.map RegisterMsg lc + ) + + +updateNewInvite : Page.NewInvite.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateNewInvite lmsg model = + let + ( lm, lc ) = + Page.NewInvite.Update.update model.flags lmsg model.newInviteModel + in + ( { model | newInviteModel = lm } + , Cmd.map NewInviteMsg lc + ) + + +updateLogin : Page.Login.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateLogin lmsg model = + let + ( lm, lc, ar ) = + Page.Login.Update.update (Page.loginPageReferrer model.page) model.flags lmsg model.loginModel + + newFlags = + Maybe.map (Data.Flags.withAccount model.flags) ar + |> Maybe.withDefault model.flags + in + ( { model | loginModel = lm, flags = newFlags } + , Cmd.map LoginMsg lc + ) + + +updateHome : Page.Home.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateHome lmsg model = + let + ( lm, lc ) = + Page.Home.Update.update model.flags lmsg model.homeModel + in + ( { model | homeModel = lm } + , Cmd.map HomeMsg lc + ) + + +updateInfo : Page.Info.Data.Msg -> Model -> ( Model, Cmd Msg ) +updateInfo lmsg model = + let + ( lm, lc ) = + Page.Info.Update.update model.flags lmsg model.infoModel + in + ( { model | infoModel = lm } + , Cmd.map InfoMsg lc + ) + + +initPage : Model -> Page -> ( Model, Cmd Msg ) +initPage model page = + case page of + HomePage -> + ( model, Cmd.none ) + + LoginPage _ -> + updateLogin Page.Login.Data.Init model + + RegisterPage -> + ( model, Cmd.none ) + + NewInvitePage -> + ( model, Cmd.none ) + + InfoPage _ -> + ( model, Cmd.none ) + + AccountPage aid -> + updateAccount (Page.Account.Data.Init aid) model + + AliasPage aid -> + updateAlias (Page.Alias.Data.Init aid) model + + UploadPage -> + updateUpload Page.Upload.Data.Init model + + SharePage -> + ( model, Cmd.none ) + + OpenSharePage _ -> + ( model, Cmd.none ) + + SettingsPage -> + updateSettings Page.Settings.Data.Init model + + DetailPage id -> + updateDetail (Page.Detail.Data.Init id) model -refreshCookie: Model -> Cmd Msg -refreshCookie model = - Http.post (model.serverConfig.urls.authCookie) Http.emptyBody accountDecoder - |> Http.send LoginRefreshDone + OpenDetailPage id -> + updateOpenDetail (Page.OpenDetail.Data.Init id) model diff --git a/modules/webapp/src/main/elm/App/View.elm b/modules/webapp/src/main/elm/App/View.elm index 84a5eb75..c7f83d9e 100644 --- a/modules/webapp/src/main/elm/App/View.elm +++ b/modules/webapp/src/main/elm/App/View.elm @@ -1,202 +1,308 @@ -module App.View exposing (..) +module App.View exposing (view) -import Html exposing (Html, Attribute, button, div, text, span, h1, a, i, p) -import Html.Attributes exposing (class, classList, href) +import Api.Model.AuthResult exposing (AuthResult) +import App.Data exposing (..) +import Html exposing (..) +import Html.Attributes exposing (..) import Html.Events exposing (onClick) -import List -import Color exposing (Color) - -import App.Update exposing (..) -import App.Model exposing (..) -import App.Pages exposing (..) - -import Data exposing (Account) -import PageLocation as PL -import Pages.Login.View as LoginView -import Pages.AccountEdit.View as AccountEditView -import Pages.Upload.View as UploadView -import Pages.Download.View as DownloadView -import Pages.UploadList.View as UploadListView -import Pages.Profile.View as ProfileView -import Pages.AliasList.View as AliasListView -import Pages.AliasUpload.View as AliasUploadView -import Pages.Timeout.View as TimeoutView -import Pages.Manual.View as ManualView -import Pages.Error.View as ErrorView - -view: Model -> Html Msg +import Page exposing (Page(..)) +import Page.Account.View +import Page.Alias.View +import Page.Detail.View +import Page.Home.View +import Page.Info.View +import Page.Login.View +import Page.NewInvite.View +import Page.OpenDetail.View +import Page.OpenShare.View +import Page.Register.View +import Page.Settings.View +import Page.Share.View +import Page.Upload.View + + +view : Model -> Html Msg view model = - case model.user of - Nothing -> - case model.page of - DownloadPage -> - div [class "ui container"] - [Html.map DownloadMsg (DownloadView.view model.download) - ,(footer model) - ] + case model.page of + LoginPage _ -> + loginLayout model - AliasUploadPage -> - div [class "ui container"] - [(Html.map AliasUploadMsg (AliasUploadView.view model.aliasUpload)) - ,(footer model)] - - TimeoutPage -> - div [class "ui container"] - [TimeoutView.view] - - ManualPage -> - div [class "ui container"] - [ManualView.view model.manualModel] - - ErrorPage -> - div [class "ui container"] - [ErrorView.view model.errorModel] - - _ -> - Html.map LoginMsg (LoginView.view model.login) - - Just acc -> - case model.page of - LoginPage -> - Html.map LoginMsg (LoginView.view model.login) - - IndexPage -> - div [class "ui container"] - [ - (navbar acc model) - ,(indexView model) - ,(footer model) - ] + RegisterPage -> + registerLayout model - NewSharePage -> - div [class "ui container"] - [ - (navbar acc model) - , Html.map UploadMsg (UploadView.view model.upload) - ,(footer model) - ] - AccountEditPage -> - div [class "ui container"] - [ (navbar acc model) - , Html.map AccountEditMsg (AccountEditView.view model.accountEdit) - ,(footer model) - ] + _ -> + defaultLayout model - DownloadPage -> - div [class "ui container"] - [ (navbar acc model) - , Html.map DownloadMsg (DownloadView.view model.download) - ,(footer model) - ] - UploadListPage -> - div [class "ui container"] - [ (navbar acc model) - ,(Html.map UploadListMsg (UploadListView.view model.uploadList)) - ,(footer model) - ] +loginLayout : Model -> Html Msg +loginLayout model = + div [ class "login-layout" ] + [ viewLogin model + , footer model + ] - ProfilePage -> - div [class "ui container"] - [(navbar acc model) - ,model.profile - |> Maybe.map ProfileView.view - |> Maybe.map (Html.map ProfileMsg) - |> Maybe.withDefault (div[][]) - ,(footer model) - ] - AliasListPage -> - div [class "ui container"] - [(navbar acc model) - ,(Html.map AliasListMsg (AliasListView.view model.aliases)) - ,(footer model) - ] +registerLayout : Model -> Html Msg +registerLayout model = + div [ class "register-layout" ] + [ viewRegister model + , footer model + ] - AliasUploadPage -> - div [class "ui container"] - [(navbar acc model) - ,(Html.map AliasUploadMsg (AliasUploadView.view model.aliasUpload)) - ,(footer model)] - - TimeoutPage -> - div [class "ui container"] - [(navbar acc model) - ,TimeoutView.view - ,(footer model) - ] - ManualPage -> - div [class "ui container"] - [(navbar acc model) - ,ManualView.view model.manualModel - ,(footer model) - ] +defaultLayout : Model -> Html Msg +defaultLayout model = + div [ class "default-layout" ] + [ div [ class "ui fixed top sticky attached large menu black-bg" ] + [ div [ class "ui fluid container" ] + [ a + [ class "header item narrow-item" + , case model.flags.account of + Just _ -> + Page.href HomePage - ErrorPage -> - div [class "ui container"] - [(navbar acc model) - ,ErrorView.view model.errorModel - ,(footer model) + Nothing -> + href "#" + ] + [ img + [ src <| model.flags.config.assetsPath ++ "/img/icon.svg" + , class "ui image logo-icon" ] + [] + , text model.flags.config.appName + ] + , loginInfo model + ] + ] + , div [ class "main-content" ] + [ case model.page of + HomePage -> + viewHome model + + LoginPage _ -> + viewLogin model + + RegisterPage -> + viewRegister model + + NewInvitePage -> + viewNewInvite model + + InfoPage n -> + viewInfo n model + + AccountPage id -> + viewAccount id model + + AliasPage id -> + viewAlias id model + + UploadPage -> + viewUpload model + + SharePage -> + viewShare model + + OpenSharePage id -> + viewOpenShare id model + + SettingsPage -> + viewSettings model + + DetailPage id -> + viewDetail id model + + OpenDetailPage id -> + viewOpenDetail id model + ] + , footer model + ] + + +viewOpenDetail : String -> Model -> Html Msg +viewOpenDetail id model = + Html.map OpenDetailMsg (Page.OpenDetail.View.view model.flags model.openDetailModel) + + +viewDetail : String -> Model -> Html Msg +viewDetail id model = + Html.map DetailMsg (Page.Detail.View.view model.flags model.detailModel) -adminHtml: Account -> Html Msg -> Html Msg -adminHtml account html = - if account.admin then html else span[][] - -nonAdminHtml: Account -> Html Msg -> Html Msg -nonAdminHtml account html = - if not account.admin then html else span[][] - - -navbar: Account -> Model -> Html Msg -navbar account model = - div [class "ui fixed compact menu"] - [ - a [href PL.indexPageHref, class "header item"] [text model.serverConfig.appName] - ,a [href PL.uploadsPageHref, class "item"] [text "My Uploads"] - ,a [href PL.aliasListPageHref, class "item"][text "Aliases"] - ,div [class "right menu"] - [ - a [href PL.accountEditPageHref, class "item"] [text "Edit Accounts"] |> adminHtml account - ,a [href PL.profilePageHref, class "item"][text "Profile"] |> nonAdminHtml account - ,a [href (PL.manualPageHref "index.md"), class "item"][text "Manual"] - ,a [onClick (Logout), class "item"][text "Logout"] +viewSettings : Model -> Html Msg +viewSettings model = + Html.map SettingsMsg (Page.Settings.View.view model.settingsModel) + + +viewAlias : Maybe String -> Model -> Html Msg +viewAlias id model = + Html.map AliasMsg (Page.Alias.View.view model.flags id model.aliasModel) + + +viewUpload : Model -> Html Msg +viewUpload model = + Html.map UploadMsg (Page.Upload.View.view model.uploadModel) + + +viewOpenShare : String -> Model -> Html Msg +viewOpenShare id model = + Html.map OpenShareMsg (Page.OpenShare.View.view model.flags id model.openShareModel) + + +viewShare : Model -> Html Msg +viewShare model = + Html.map ShareMsg (Page.Share.View.view model.flags model.shareModel) + + +viewAccount : Maybe String -> Model -> Html Msg +viewAccount id model = + Html.map AccountMsg (Page.Account.View.view id model.accountModel) + + +viewInfo : Int -> Model -> Html Msg +viewInfo msgnum model = + Html.map InfoMsg (Page.Info.View.view msgnum model.infoModel) + + +viewNewInvite : Model -> Html Msg +viewNewInvite model = + Html.map NewInviteMsg (Page.NewInvite.View.view model.flags model.newInviteModel) + + +viewRegister : Model -> Html Msg +viewRegister model = + Html.map RegisterMsg (Page.Register.View.view model.flags model.registerModel) + + +viewLogin : Model -> Html Msg +viewLogin model = + Html.map LoginMsg (Page.Login.View.view model.flags model.loginModel) + + +viewHome : Model -> Html Msg +viewHome model = + Html.map HomeMsg (Page.Home.View.view model.homeModel) + + +loginInfo : Model -> Html Msg +loginInfo model = + div [ class "right menu" ] + (case model.flags.account of + Just acc -> + [ userMenu model acc + ] + + Nothing -> + [ a + [ class "item" + , Page.href (Page.loginPage model.page) + ] + [ text "Login" + ] + , a + [ class "item" + , Page.href RegisterPage + ] + [ text "Register" + ] + ] + ) + + +userMenu : Model -> AuthResult -> Html Msg +userMenu model acc = + div + [ class "ui dropdown icon link item" + , onClick ToggleNavMenu + ] + [ i [ class "ui bars icon" ] [] + , div + [ classList + [ ( "left menu", True ) + , ( "transition visible", model.navMenuOpen ) + ] + ] + [ menuEntry model + HomePage + [ img + [ class "image icon logo-icon" + , src (model.flags.config.assetsPath ++ "/img/icon.svg") + ] + [] + , text "Home" + ] + , div [ class "divider" ] [] + , menuEntry model + UploadPage + [ i [ class "ui upload icon" ] [] + , text "Shares" + ] + , menuEntry model + (AliasPage Nothing) + [ i [ class "ui dot circle outline icon" ] [] + , text "Aliases" + ] + , if acc.admin then + menuEntry model + (AccountPage Nothing) + [ i [ class "ui users icon" ] [] + , text "Accounts" + ] + + else + span [] [] + , menuEntry model + SettingsPage + [ i [ class "ui cog icon" ] [] + , text "Settings" + ] + , if acc.admin && model.flags.config.signupMode == "invite" then + menuEntry model + NewInvitePage + [ i [ class "ui key icon" ] [] + , text "New Invites" + ] + + else + span [] [] + , div [ class "divider" ] [] + , a + [ class "icon item" + , href "" + , onClick Logout + ] + [ i [ class "sign-out icon" ] [] + , text "Logout (" + , text acc.user + , text ")" + ] ] ] -indexView: Model -> Html Msg -indexView model = - div [class "main ui grid container"] - [ - div [class "sixteen wide column"] - [ - div [class "ui padded brown center aligned segment"] - [ - h1 [class "ui header"][text model.serverConfig.appName] - ,p [][text "Allows to easily share files with others! Click below to upload files and share the URL."] - ,a [class "ui big basic primary button", onClick (SetPage PL.newSharePage)] - [ - i [class "upload icon"][] - ,text "New Share …" - ] - ] - ] +menuEntry : Model -> Page -> List (Html Msg) -> Html Msg +menuEntry model page children = + a + [ classList + [ ( "icon item", True ) + , ( "active", model.page == page ) + ] + , Page.href page ] + children + -footer: Model -> Html msg +footer : Model -> Html Msg footer model = - Html.footer [class "ui center aligned sharry-footer container"] - [ - div [] - [ - text "You are using " - ,a [href "https://github.com/eikek/sharry"] - [ - i [class "disabled github icon"][] - ,text model.serverConfig.projectName - ] - ] + div [ class "ui footer" ] + [ a [ href "https://eikek.github.io/sharry" ] + [ i [ class "ui github icon" ] [] + ] + , span [] + [ text "Sharry " + , text model.version.version + , text " (#" + , String.left 8 model.version.gitCommit |> text + , text ")" + ] ] diff --git a/modules/webapp/src/main/elm/Comp/AccountForm.elm b/modules/webapp/src/main/elm/Comp/AccountForm.elm new file mode 100644 index 00000000..460d954b --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/AccountForm.elm @@ -0,0 +1,281 @@ +module Comp.AccountForm exposing + ( FormAction(..) + , Model + , Msg + , init + , initModify + , initNew + , update + , view + ) + +import Api.Model.AccountCreate exposing (AccountCreate) +import Api.Model.AccountDetail exposing (AccountDetail) +import Api.Model.AccountModify exposing (AccountModify) +import Comp.FixedDropdown +import Comp.PasswordInput +import Data.AccountState exposing (AccountState) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onCheck, onClick, onInput) +import Util.Maybe + + +type alias Model = + { existing : Maybe AccountDetail + , loginField : String + , emailField : Maybe String + , passwordModel : Comp.PasswordInput.Model + , passwordField : Maybe String + , stateModel : Comp.FixedDropdown.Model AccountState + , stateField : Comp.FixedDropdown.Item AccountState + , adminField : Bool + } + + +init : Maybe AccountDetail -> Model +init ma = + Maybe.map initModify ma + |> Maybe.withDefault initNew + + +mkStateItem : AccountState -> Comp.FixedDropdown.Item AccountState +mkStateItem state = + Comp.FixedDropdown.Item state (Data.AccountState.toString state) + + +initNew : Model +initNew = + { existing = Nothing + , loginField = "" + , emailField = Nothing + , passwordModel = Comp.PasswordInput.init + , passwordField = Nothing + , stateModel = Comp.FixedDropdown.initMap Data.AccountState.toString Data.AccountState.all + , stateField = mkStateItem Data.AccountState.Active + , adminField = False + } + + +initModify : AccountDetail -> Model +initModify acc = + { initNew + | existing = Just acc + , loginField = acc.login + , emailField = acc.email + , stateField = + Data.AccountState.fromStringOrActive acc.state + |> mkStateItem + , adminField = acc.admin + } + + +type Msg + = SetLogin String + | SetEmail String + | PasswordMsg Comp.PasswordInput.Msg + | StateMsg (Comp.FixedDropdown.Msg AccountState) + | ToggleAdmin + | Cancel + | Submit + + +type FormAction + = FormModified String AccountModify + | FormCreated AccountCreate + | FormCancelled + | FormNone + + +isCreate : Model -> Bool +isCreate model = + model.existing == Nothing + + +isModify : Model -> Bool +isModify model = + not (isCreate model) + + +isIntern : Model -> Bool +isIntern model = + Maybe.map .source model.existing + |> Maybe.map ((==) "intern") + |> Maybe.withDefault False + + +formInvalid : Model -> Bool +formInvalid model = + String.isEmpty model.loginField + || (isCreate model && model.passwordField == Nothing) + + +update : Msg -> Model -> ( Model, FormAction ) +update msg model = + case msg of + SetLogin str -> + ( { model | loginField = str }, FormNone ) + + SetEmail str -> + ( { model + | emailField = Util.Maybe.fromString str + } + , FormNone + ) + + PasswordMsg lmsg -> + let + ( m, pw ) = + Comp.PasswordInput.update lmsg model.passwordModel + in + ( { model + | passwordModel = m + , passwordField = pw + } + , FormNone + ) + + StateMsg lmsg -> + let + ( m, sel ) = + Comp.FixedDropdown.update lmsg model.stateModel + in + ( { model + | stateModel = m + , stateField = + Maybe.map mkStateItem sel + |> Maybe.withDefault model.stateField + } + , FormNone + ) + + ToggleAdmin -> + ( { model | adminField = not model.adminField } + , FormNone + ) + + Cancel -> + ( model, FormCancelled ) + + Submit -> + if formInvalid model then + ( model, FormNone ) + + else + case Maybe.map .id model.existing of + Just id -> + ( model + , FormModified id + { state = Data.AccountState.toString model.stateField.id + , admin = model.adminField + , email = model.emailField + , password = model.passwordField + } + ) + + Nothing -> + ( model + , FormCreated + { login = model.loginField + , state = Data.AccountState.toString model.stateField.id + , admin = model.adminField + , email = model.emailField + , password = Maybe.withDefault "" model.passwordField + } + ) + + +view : Model -> Html Msg +view model = + div [ class "ui segments" ] + [ Html.form [ class "ui form segment" ] + [ div + [ classList + [ ( "disabled field", True ) + , ( "invisible", isCreate model ) + ] + ] + [ label [] [ text "Id" ] + , input + [ type_ "text" + , Maybe.map .id model.existing + |> Maybe.withDefault "-" + |> value + ] + [] + ] + , div + [ classList + [ ( "required field", True ) + , ( "disabled", isModify model ) + , ( "error", String.isEmpty model.loginField ) + ] + ] + [ label [] [ text "Login" ] + , input + [ type_ "text" + , value model.loginField + , onInput SetLogin + ] + [] + ] + , div [ class "required field" ] + [ label [] [ text "State" ] + , Html.map StateMsg + (Comp.FixedDropdown.view + (Just model.stateField) + model.stateModel + ) + ] + , div [ class "inline required field" ] + [ div [ class "ui checkbox" ] + [ input + [ type_ "checkbox" + , onCheck (\_ -> ToggleAdmin) + , checked model.adminField + ] + [] + , label [] [ text "Admin" ] + ] + ] + , div [ class "field" ] + [ label [] [ text "E-Mail" ] + , input + [ type_ "text" + , Maybe.withDefault "" model.emailField |> value + , onInput SetEmail + ] + [] + ] + , div + [ classList + [ ( "field", True ) + , ( "error", isCreate model && model.passwordField == Nothing ) + , ( "required", isCreate model ) + , ( "disabled", not (isCreate model || isIntern model) ) + ] + ] + [ label [] [ text "Password" ] + , Html.map PasswordMsg + (Comp.PasswordInput.view model.passwordField + model.passwordModel + ) + ] + ] + , div [ class "ui secondary segment" ] + [ button + [ type_ "button" + , class "ui primary button" + , onClick Submit + ] + [ text "Submit" + ] + , button + [ class "ui button" + , type_ "button" + , onClick Cancel + ] + [ text "Back" + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/AccountTable.elm b/modules/webapp/src/main/elm/Comp/AccountTable.elm new file mode 100644 index 00000000..c8f568e8 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/AccountTable.elm @@ -0,0 +1,89 @@ +module Comp.AccountTable exposing + ( Model + , Msg + , init + , update + , view + ) + +import Api.Model.AccountDetail exposing (AccountDetail) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Util.Html +import Util.Time + + +type alias Model = + { selected : Maybe AccountDetail + } + + +type Msg + = Select AccountDetail + + +init : Model +init = + { selected = Nothing + } + + +update : Msg -> Model -> ( Model, Maybe AccountDetail ) +update msg model = + case msg of + Select acc -> + ( { model | selected = Just acc }, Just acc ) + + +view : List AccountDetail -> Model -> Html Msg +view accounts model = + table [ class "ui selectable padded table" ] + [ thead [] + [ tr [] + [ th [] [ text "Login" ] + , th [] [ text "Source" ] + , th [] [ text "State" ] + , th [] [ text "#Shares" ] + , th [] [ text "Admin" ] + , th [] [ text "#Logins" ] + , th [] [ text "Last Login" ] + , th [] [ text "Created" ] + ] + ] + , tbody [] + (List.map (viewTableLine model) accounts) + ] + + +isSelected : Model -> AccountDetail -> Bool +isSelected model acc = + Maybe.map .id model.selected + |> Maybe.map ((==) acc.id) + |> Maybe.withDefault False + + +viewTableLine : Model -> AccountDetail -> Html Msg +viewTableLine model acc = + tr + [ onClick (Select acc) + , classList [ ( "active", isSelected model acc ) ] + ] + [ td [] [ text acc.login ] + , td [] [ text acc.source ] + , td [] [ text acc.state ] + , td [] [ String.fromInt acc.shares |> text ] + , td [] + [ Util.Html.checkbox acc.admin + ] + , td [] [ String.fromInt acc.loginCount |> text ] + , td [] + [ Maybe.map Util.Time.formatIsoDateTime acc.lastLogin + |> Maybe.withDefault "" + |> text + ] + , td [] + [ Util.Time.formatIsoDateTime acc.created + |> text + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/AliasForm.elm b/modules/webapp/src/main/elm/Comp/AliasForm.elm new file mode 100644 index 00000000..c5ab4765 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/AliasForm.elm @@ -0,0 +1,272 @@ +module Comp.AliasForm exposing + ( FormAction(..) + , Model + , Msg + , init + , initModify + , initNew + , update + , view + ) + +import Api.Model.AliasChange exposing (AliasChange) +import Api.Model.AliasDetail exposing (AliasDetail) +import Comp.ValidityField +import Comp.YesNoDimmer +import Data.AccountState exposing (AccountState) +import Data.Flags exposing (Flags) +import Data.ValidityValue exposing (ValidityValue(..)) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onCheck, onClick, onInput) +import Util.Maybe + + +type alias Model = + { existing : Maybe AliasDetail + , nameField : String + , idField : Maybe String + , validityModel : Comp.ValidityField.Model + , validityField : ValidityValue + , enabledField : Bool + , yesNoModel : Comp.YesNoDimmer.Model + } + + +init : Flags -> Maybe AliasDetail -> Model +init flags ma = + Maybe.map (initModify flags) ma + |> Maybe.withDefault (initNew flags) + + +initNew : Flags -> Model +initNew flags = + { existing = Nothing + , idField = Nothing + , nameField = "" + , validityModel = Comp.ValidityField.init flags + , validityField = Data.ValidityValue.Days 2 + , enabledField = False + , yesNoModel = Comp.YesNoDimmer.emptyModel + } + + +initModify : Flags -> AliasDetail -> Model +initModify flags alias_ = + let + m = + initNew flags + in + { m + | existing = Just alias_ + , idField = Just alias_.id + , nameField = alias_.name + , validityField = Data.ValidityValue.Millis alias_.validity + , enabledField = alias_.enabled + } + + +type Msg + = SetName String + | SetId String + | ValidityMsg Comp.ValidityField.Msg + | ToggleEnabled + | Cancel + | Submit + | RequestDelete + | YesNoMsg Comp.YesNoDimmer.Msg + + +type FormAction + = FormModified String AliasChange + | FormCreated AliasChange + | FormCancelled + | FormDelete String + | FormNone + + +isCreate : Model -> Bool +isCreate model = + model.existing == Nothing + + +formInvalid : Model -> Bool +formInvalid model = + Util.Maybe.fromString model.nameField == Nothing + + +update : Msg -> Model -> ( Model, FormAction ) +update msg model = + case msg of + SetName str -> + ( { model | nameField = str }, FormNone ) + + SetId str -> + ( { model | idField = Util.Maybe.fromString str }, FormNone ) + + ValidityMsg lmsg -> + let + ( m, sel ) = + Comp.ValidityField.update lmsg model.validityModel + in + ( { model + | validityModel = m + , validityField = Maybe.withDefault model.validityField sel + } + , FormNone + ) + + ToggleEnabled -> + ( { model | enabledField = not model.enabledField } + , FormNone + ) + + YesNoMsg lmsg -> + let + ( m, confirmed ) = + Comp.YesNoDimmer.update lmsg model.yesNoModel + + id = + Maybe.map .id model.existing + in + ( { model | yesNoModel = m } + , if confirmed then + Maybe.map FormDelete id + |> Maybe.withDefault FormNone + + else + FormNone + ) + + RequestDelete -> + let + m = + Comp.YesNoDimmer.activate model.yesNoModel + in + ( { model | yesNoModel = m }, FormNone ) + + Cancel -> + ( model, FormCancelled ) + + Submit -> + if formInvalid model then + ( model, FormNone ) + + else + let + ac = + { id = + if isCreate model then + Nothing + + else + model.idField + , name = model.nameField + , validity = Data.ValidityValue.toMillis model.validityField + , enabled = model.enabledField + } + in + case Maybe.map .id model.existing of + Just id -> + ( model, FormModified id ac ) + + Nothing -> + ( model, FormCreated ac ) + + +view : Model -> Html Msg +view model = + div [] + [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.yesNoModel) + , Html.form [ class "ui top attached form segment" ] + [ div + [ classList + [ ( "field", True ) + , ( "invisible", isCreate model ) + ] + ] + [ label [] [ text "Id" ] + , input + [ type_ "text" + , Maybe.withDefault "" model.idField + |> value + , onInput SetId + ] + [] + , div + [ classList + [ ( "ui message", True ) + , ( "invisible hidden", isCreate model ) + ] + ] + [ div [ class "header" ] + [ text "Note to Ids" + ] + , p [] + [ text "This ID is part of the url where " + , em [] [ text "everyone" ] + , text " can upload files. It is recommended to use" + , text " something random. The id can be changed to " + , text "any value, but if it is left empty, a random " + , text "one will be generated." + ] + ] + ] + , div + [ classList + [ ( "required field", True ) + , ( "error", String.isEmpty model.nameField ) + ] + ] + [ label [] [ text "Name" ] + , input + [ type_ "text" + , value model.nameField + , onInput SetName + ] + [] + ] + , div [ class "required field" ] + [ label [] [ text "Validity" ] + , Html.map ValidityMsg + (Comp.ValidityField.view + model.validityField + model.validityModel + ) + ] + , div [ class "inline required field" ] + [ div [ class "ui checkbox" ] + [ input + [ type_ "checkbox" + , onCheck (\_ -> ToggleEnabled) + , checked model.enabledField + ] + [] + , label [] [ text "Enabled" ] + ] + ] + ] + , div [ class "ui secondary bottom attached segment" ] + [ button + [ type_ "button" + , class "ui primary button" + , onClick Submit + ] + [ text "Submit" + ] + , button + [ class "ui button" + , type_ "button" + , onClick Cancel + ] + [ text "Back" + ] + , button + [ class "ui right floated red button" + , type_ "button" + , onClick RequestDelete + ] + [ text "Delete" + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/AliasTable.elm b/modules/webapp/src/main/elm/Comp/AliasTable.elm new file mode 100644 index 00000000..54cdc651 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/AliasTable.elm @@ -0,0 +1,83 @@ +module Comp.AliasTable exposing + ( Model + , Msg + , init + , update + , view + ) + +import Api.Model.AliasDetail exposing (AliasDetail) +import Data.ValidityOptions exposing (findValidityItemMillis) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Util.Duration +import Util.Html +import Util.Time + + +type alias Model = + { selected : Maybe AliasDetail + } + + +type Msg + = Select AliasDetail + + +init : Model +init = + { selected = Nothing + } + + +update : Msg -> Model -> ( Model, Maybe AliasDetail ) +update msg model = + case msg of + Select alias_ -> + ( { model | selected = Just alias_ }, Just alias_ ) + + +view : List AliasDetail -> Model -> Html Msg +view aliases model = + table [ class "ui selectable padded table" ] + [ thead [] + [ tr [] + [ th [] [ text "Name" ] + , th [] [ text "Enabled" ] + , th [] [ text "Validity" ] + , th [] [ text "Created" ] + ] + ] + , tbody [] + (List.map (viewTableLine model) aliases) + ] + + +isSelected : Model -> AliasDetail -> Bool +isSelected model alias_ = + Maybe.map .id model.selected + |> Maybe.map ((==) alias_.id) + |> Maybe.withDefault False + + +viewTableLine : Model -> AliasDetail -> Html Msg +viewTableLine model alias_ = + tr + [ onClick (Select alias_) + , classList [ ( "active", isSelected model alias_ ) ] + ] + [ td [] [ text alias_.name ] + , td [] + [ Util.Html.checkbox alias_.enabled + ] + , td [] + [ findValidityItemMillis alias_.validity + |> Tuple.first + |> text + ] + , td [] + [ Util.Time.formatIsoDateTime alias_.created + |> text + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/Dropzone2.elm b/modules/webapp/src/main/elm/Comp/Dropzone2.elm new file mode 100644 index 00000000..3a898357 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/Dropzone2.elm @@ -0,0 +1,292 @@ +module Comp.Dropzone2 exposing + ( FileState(..) + , Model + , Msg + , SelectedFiles + , ViewSettings + , init + , mkViewSettings + , update + , view + ) + +import Data.UploadDict exposing (UploadDict) +import Data.UploadState +import Dict +import File exposing (File) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (..) +import Json.Decode as D +import Util.List +import Util.Size + + +type alias Model = + { hover : Bool + } + + +init : Model +init = + { hover = False + } + + +type Msg + = DragEnter + | DragLeave + | GotFiles (List ( D.Value, File )) + | DeleteFile Int + + +type alias SelectedFiles = + List ( D.Value, File ) + + +type FileState + = Done + | Failed + | Uploading + | Waiting + + +type alias ViewSettings = + { files : SelectedFiles + , active : Bool + , fileState : Int -> FileState + } + + +update : SelectedFiles -> Msg -> Model -> ( Model, Cmd Msg, SelectedFiles ) +update current msg model = + case msg of + DragEnter -> + ( { model | hover = True }, Cmd.none, current ) + + DragLeave -> + ( { model | hover = False }, Cmd.none, current ) + + GotFiles list -> + ( { model | hover = False }, Cmd.none, list ) + + DeleteFile index -> + ( model, Cmd.none, Util.List.remove index current ) + + +mkViewSettings : Bool -> UploadDict -> ViewSettings +mkViewSettings active uploads = + let + getState index = + Dict.get index uploads.uploads + |> Maybe.map .state + + fileState index = + case getState index of + Just Data.UploadState.Complete -> + Done + + Just (Data.UploadState.Progress _ _) -> + Uploading + + Just (Data.UploadState.Failed _) -> + Failed + + Nothing -> + Waiting + in + { files = uploads.selectedFiles + , active = active + , fileState = fileState + } + + +view : ViewSettings -> Model -> Html Msg +view sett model = + let + files = + List.unzip sett.files + |> Tuple.second + + allsize = + List.map File.size files + |> List.sum + |> toFloat + |> Util.Size.bytesReadable Util.Size.B + in + div [ class "dropzone" ] + [ div + [ classList + [ ( "ui top attached indicating progress", True ) + , ( "invisible", files == [] ) + ] + , id "all-progress" + ] + [ div [ class "bar" ] + [] + ] + , div + [ classList + [ ( "ui placeholder segment", True ) + , ( "on-drop", model.hover ) + , ( "attached", files /= [] ) + , ( "disabled", not sett.active ) + ] + , hijackOn "dragenter" (D.succeed DragEnter) + , hijackOn "dragover" (D.succeed DragEnter) + , hijackOn "dragleave" (D.succeed DragLeave) + , hijackOn "drop" dropDecoder + ] + [ div [ class "ui icon header" ] + [ i [ class "mouse pointer icon" ] [] + , div [ class "content" ] + [ text "Drop files here" + ] + ] + , case List.length files of + 0 -> + span [] [] + + n -> + div [ class "inline" ] + [ String.fromInt n |> text + , text " files selected (" + , text allsize + , text ")" + ] + , div [ class "ui horizontal divider" ] + [ text "Or" + ] + , div [ class "custom-upload" ] + [ label [ class "ui basic primary button" ] + [ i [ class "folder open icon" ] [] + , text "Select Files ..." + , input + [ type_ "file" + , multiple True + , disabled <| not sett.active + , onFiles GotFiles + ] + [] + ] + ] + ] + , table + [ classList + [ ( "ui bottom attached table", True ) + , ( "invisible", files == [] ) + ] + ] + [ tbody [] + (List.indexedMap (renderFile sett) files) + ] + ] + + +renderFile : ViewSettings -> Int -> File -> Html Msg +renderFile sett index file = + let + size = + File.size file + |> toFloat + |> Util.Size.bytesReadable Util.Size.B + + name = + File.name file + + fileState = + sett.fileState index + + icon = + case fileState of + Done -> + "ui green check icon" + + Waiting -> + "ui file outline icon" + + Uploading -> + "ui loading spinner icon" + + Failed -> + "ui red bolt icon" + in + tr + [ class ("file-" ++ String.fromInt index) + , attribute "data-index" (String.fromInt index) + ] + [ td [ class "collapsing" ] + [ i [ class icon ] [] + ] + , td [] + [ div + [ classList + [ ( "ui small indicating progress", True ) + , ( "invisible", fileState /= Uploading ) + ] + , id ("file-progress-" ++ String.fromInt index) + ] + [ div [ class "bar" ] [] + , div [ class "label" ] + [ text name + ] + ] + , span + [ classList + [ ( "invisible", fileState == Uploading ) + ] + ] + [ text name + ] + ] + , td [ class "collapsing" ] + [ text size + ] + , td [ class "collapsing" ] + [ a + [ classList + [ ( "ui primary mini icon button", True ) + , ( "disabled", not sett.active ) + ] + , href "#" + , onClick (DeleteFile index) + ] + [ i [ class "ui trash icon" ] [] + ] + ] + ] + + +dropDecoder : D.Decoder Msg +dropDecoder = + D.at [ "dataTransfer", "files" ] (D.list (attach File.decoder)) + |> D.map GotFiles + + +hijackOn : String -> D.Decoder msg -> Attribute msg +hijackOn event decoder = + preventDefaultOn event (D.map hijack decoder) + + +hijack : msg -> ( msg, Bool ) +hijack msg = + ( msg, True ) + + +onFiles : (List ( D.Value, File ) -> msg) -> Attribute msg +onFiles tomsg = + let + decmsg = + D.at [ "target", "files" ] (D.list (attach File.decoder)) + |> D.map tomsg + in + hijackOn "change" decmsg + + +attach : D.Decoder a -> D.Decoder ( D.Value, a ) +attach deca = + let + mkTuple v = + D.map (Tuple.pair v) deca + in + D.andThen mkTuple D.value diff --git a/modules/webapp/src/main/elm/Comp/FixedDropdown.elm b/modules/webapp/src/main/elm/Comp/FixedDropdown.elm new file mode 100644 index 00000000..586dff32 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/FixedDropdown.elm @@ -0,0 +1,108 @@ +module Comp.FixedDropdown exposing + ( Item + , Model + , Msg + , init + , initMap + , initString + , initTuple + , update + , view + ) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) + + +type alias Item a = + { id : a + , display : String + } + + +type alias Model a = + { options : List (Item a) + , menuOpen : Bool + } + + +type Msg a + = SelectItem (Item a) + | ToggleMenu + + +init : List (Item a) -> Model a +init options = + { options = options + , menuOpen = False + } + + +initString : List String -> Model String +initString strings = + init <| List.map (\s -> Item s s) strings + + +initMap : (a -> String) -> List a -> Model a +initMap elToString els = + init <| List.map (\a -> Item a (elToString a)) els + + +initTuple : List ( String, a ) -> Model a +initTuple tuples = + let + mkItem ( txt, id ) = + Item id txt + in + init <| List.map mkItem tuples + + +update : Msg a -> Model a -> ( Model a, Maybe a ) +update msg model = + case msg of + ToggleMenu -> + ( { model | menuOpen = not model.menuOpen }, Nothing ) + + SelectItem item -> + ( model, Just item.id ) + + +view : Maybe (Item a) -> Model a -> Html (Msg a) +view selected model = + div + [ classList + [ ( "ui selection dropdown", True ) + , ( "open", model.menuOpen ) + ] + , onClick ToggleMenu + ] + [ input [ type_ "hidden" ] [] + , i [ class "dropdown icon" ] [] + , div + [ classList + [ ( "default", selected == Nothing ) + , ( "text", True ) + ] + ] + [ Maybe.map .display selected + |> Maybe.withDefault "Select…" + |> text + ] + , div + [ classList + [ ( "menu transition", True ) + , ( "hidden", not model.menuOpen ) + , ( "visible", model.menuOpen ) + ] + ] + <| + List.map renderItems model.options + ] + + +renderItems : Item a -> Html (Msg a) +renderItems item = + div [ class "item", onClick (SelectItem item) ] + [ text item.display + ] diff --git a/modules/webapp/src/main/elm/Comp/IntField.elm b/modules/webapp/src/main/elm/Comp/IntField.elm new file mode 100644 index 00000000..8e519034 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/IntField.elm @@ -0,0 +1,108 @@ +module Comp.IntField exposing (Model, Msg, init, update, view) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onInput) + + +type alias Model = + { min : Maybe Int + , max : Maybe Int + , label : String + , error : Maybe String + , lastInput : String + } + + +type Msg + = SetValue String + + +init : Maybe Int -> Maybe Int -> String -> Model +init min max label = + { min = min + , max = max + , label = label + , error = Nothing + , lastInput = "" + } + + +tooLow : Model -> Int -> Bool +tooLow model n = + Maybe.map ((<) n) model.min + |> Maybe.withDefault False + + +tooHigh : Model -> Int -> Bool +tooHigh model n = + Maybe.map ((>) n) model.max + |> Maybe.withDefault False + + +update : Msg -> Model -> ( Model, Maybe Int ) +update msg model = + let + tooHighError = + Maybe.withDefault 0 model.max + |> String.fromInt + |> (++) "Number must be <= " + + tooLowError = + Maybe.withDefault 0 model.min + |> String.fromInt + |> (++) "Number must be >= " + in + case msg of + SetValue str -> + let + m = + { model | lastInput = str } + in + case String.toInt str of + Just n -> + if tooLow model n then + ( { m | error = Just tooLowError } + , Nothing + ) + + else if tooHigh model n then + ( { m | error = Just tooHighError } + , Nothing + ) + + else + ( { m | error = Nothing }, Just n ) + + Nothing -> + ( { m | error = Just ("'" ++ str ++ "' is not a valid number!") } + , Nothing + ) + + +view : Maybe Int -> Model -> Html Msg +view nval model = + div + [ classList + [ ( "field", True ) + , ( "error", model.error /= Nothing ) + ] + ] + [ label [] [ text model.label ] + , input + [ type_ "text" + , Maybe.map String.fromInt nval + |> Maybe.withDefault model.lastInput + |> value + , onInput SetValue + ] + [] + , div + [ classList + [ ( "ui pointing red basic label", True ) + , ( "hidden", model.error == Nothing ) + ] + ] + [ Maybe.withDefault "" model.error |> text + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/IntInput.elm b/modules/webapp/src/main/elm/Comp/IntInput.elm new file mode 100644 index 00000000..2d276ef8 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/IntInput.elm @@ -0,0 +1,75 @@ +module Comp.IntInput exposing (Model, Msg, init, update, view) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onInput) + + +type alias Model = + { min : Maybe Int + , max : Maybe Int + , lastInput : String + , isError : Bool + } + + +type Msg + = SetValue String + + +init : Maybe Int -> Maybe Int -> Model +init min max = + { min = min + , max = max + , lastInput = "" + , isError = False + } + + +tooLow : Model -> Int -> Bool +tooLow model n = + Maybe.map ((<) n) model.min + |> Maybe.withDefault False + + +tooHigh : Model -> Int -> Bool +tooHigh model n = + Maybe.map ((>) n) model.max + |> Maybe.withDefault False + + +update : Msg -> Model -> ( Model, Maybe Int ) +update msg model = + case msg of + SetValue str -> + let + m = + { model | lastInput = str } + in + case String.toInt str of + Just n -> + if tooLow model n then + ( { m | isError = True }, Nothing ) + + else if tooHigh model n then + ( { m | isError = True }, Nothing ) + + else + ( { m | isError = False }, Just n ) + + Nothing -> + ( { m | isError = True } + , Nothing + ) + + +view : Maybe Int -> Model -> Html Msg +view nval model = + input + [ type_ "text" + , Maybe.map String.fromInt nval + |> Maybe.withDefault model.lastInput + |> value + , onInput SetValue + ] + [] diff --git a/modules/webapp/src/main/elm/Comp/MailForm.elm b/modules/webapp/src/main/elm/Comp/MailForm.elm new file mode 100644 index 00000000..447f91ac --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/MailForm.elm @@ -0,0 +1,125 @@ +module Comp.MailForm exposing + ( FormAction(..) + , Model + , Msg + , init + , initWith + , update + , view + ) + +import Api.Model.MailTemplate exposing (MailTemplate) +import Api.Model.SimpleMail exposing (SimpleMail) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) + + +type alias Model = + { subject : String + , body : String + , receiver : String + } + + +init : Model +init = + { subject = "" + , body = "" + , receiver = "" + } + + +initWith : MailTemplate -> Model +initWith tpl = + { subject = tpl.subject + , body = tpl.body + , receiver = "" + } + + +type Msg + = SetSubject String + | SetBody String + | SetReceiver String + | Cancel + | Send + + +type FormAction + = FormSend SimpleMail + | FormCancel + | FormNone + + +update : Msg -> Model -> ( Model, FormAction ) +update msg model = + case msg of + SetSubject str -> + ( { model | subject = str }, FormNone ) + + SetBody str -> + ( { model | body = str }, FormNone ) + + SetReceiver str -> + ( { model | receiver = str }, FormNone ) + + Cancel -> + ( model, FormCancel ) + + Send -> + let + rec = + String.split "," model.receiver + + sm = + SimpleMail rec model.subject model.body + in + ( model, FormSend sm ) + + +view : Model -> Html Msg +view model = + div [ class "ui form" ] + [ div [ class "field" ] + [ label [] + [ text "Receiver(s)" + , span [ class "muted" ] + [ text "Separate multiple recipients by comma" ] + ] + , input + [ type_ "text" + , onInput SetReceiver + , value model.receiver + ] + [] + ] + , div [ class "field" ] + [ label [] [ text "Subject" ] + , input + [ type_ "text" + , onInput SetSubject + , value model.subject + ] + [] + ] + , div [ class "field" ] + [ label [] [ text "Body" ] + , textarea [] [ text model.body ] + ] + , button + [ classList + [ ( "ui primary button", True ) + , ( "disabled", model.receiver == "" ) + ] + , onClick Send + ] + [ text "Send" + ] + , button + [ class "ui secondary button" + , onClick Cancel + ] + [ text "Cancel" + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/MailSend.elm b/modules/webapp/src/main/elm/Comp/MailSend.elm new file mode 100644 index 00000000..d5c6a66b --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/MailSend.elm @@ -0,0 +1,175 @@ +module Comp.MailSend exposing + ( Action(..) + , Model + , Msg + , emptyModel + , init + , update + , view + ) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.MailTemplate exposing (MailTemplate) +import Comp.MailForm exposing (FormAction(..)) +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Http +import Util.Http + + +type alias Model = + { mailForm : Comp.MailForm.Model + , result : Maybe BasicResult + , loader : Loader + } + + +type alias Loader = + { active : Bool + , message : String + } + + +sendingLoader : Loader +sendingLoader = + { active = True + , message = "Sending mail ..." + } + + +templateLoader : Loader +templateLoader = + { active = True + , message = "Loading template ..." + } + + +noLoader : Loader +noLoader = + { active = False + , message = "" + } + + +emptyModel : Model +emptyModel = + { mailForm = Comp.MailForm.init + , result = Nothing + , loader = noLoader + } + + +init : + ((Result Http.Error MailTemplate -> Msg) + -> Cmd Msg + ) + -> ( Model, Cmd Msg ) +init getTpl = + ( { emptyModel | loader = templateLoader }, getTpl MailTplResp ) + + +type Msg + = MailFormMsg Comp.MailForm.Msg + | MailTplResp (Result Http.Error MailTemplate) + | MailSendResp (Result Http.Error BasicResult) + + +type Action + = Run (Cmd Msg) + | Cancelled + | Sent + + +update : Flags -> Msg -> Model -> ( Model, Action ) +update flags msg model = + case msg of + MailFormMsg lmsg -> + let + ( mm, act ) = + Comp.MailForm.update lmsg model.mailForm + in + case act of + Comp.MailForm.FormNone -> + ( { model | mailForm = mm }, Run Cmd.none ) + + Comp.MailForm.FormCancel -> + ( { model | result = Nothing } + , Cancelled + ) + + Comp.MailForm.FormSend mail -> + ( { model | mailForm = mm, loader = sendingLoader } + , Run (Api.sendMail flags mail MailSendResp) + ) + + MailTplResp (Ok templ) -> + ( { model | mailForm = Comp.MailForm.initWith templ, loader = noLoader } + , Run Cmd.none + ) + + MailTplResp (Err err) -> + ( { model + | result = Just (BasicResult False (Util.Http.errorToString err)) + , loader = noLoader + } + , Run Cmd.none + ) + + MailSendResp (Ok br) -> + ( { model + | result = + if br.success then + Nothing + + else + Just br + , loader = noLoader + } + , if br.success then + Sent + + else + Run Cmd.none + ) + + MailSendResp (Err err) -> + ( { model + | result = Just (BasicResult False (Util.Http.errorToString err)) + , loader = noLoader + } + , Run Cmd.none + ) + + +view : List ( String, Bool ) -> Model -> Html Msg +view classes model = + div [ classList classes ] + [ div + [ classList + [ ( "ui dimmer", True ) + , ( "active", model.loader.active ) + ] + ] + [ div [ class "ui text loader" ] + [ text model.loader.message + ] + ] + , div + [ classList + [ ( "ui message", True ) + , ( "hidden invisible", model.result == Nothing ) + , ( "error" + , Maybe.map .success model.result + |> Maybe.map not + |> Maybe.withDefault False + ) + ] + ] + [ Maybe.map .message model.result + |> Maybe.withDefault "" + |> text + ] + , Html.map MailFormMsg (Comp.MailForm.view model.mailForm) + ] diff --git a/modules/webapp/src/main/elm/Comp/MarkdownInput.elm b/modules/webapp/src/main/elm/Comp/MarkdownInput.elm new file mode 100644 index 00000000..9a6fff06 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/MarkdownInput.elm @@ -0,0 +1,131 @@ +module Comp.MarkdownInput exposing + ( Model + , Msg + , init + , update + , view + ) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Markdown + + +type Display + = Edit + | Preview + | Split + + +type alias Model = + { display : Display + , cheatSheetUrl : String + } + + +init : Model +init = + { display = Edit + , cheatSheetUrl = "https://www.markdownguide.org/cheat-sheet" + } + + +type Msg + = SetText String + | SetDisplay Display + + +update : String -> Msg -> Model -> ( Model, String ) +update txt msg model = + case msg of + SetText str -> + ( model, str ) + + SetDisplay dsp -> + ( { model | display = dsp }, txt ) + + +view : String -> Model -> Html Msg +view txt model = + div [] + [ div [ class "ui top attached tabular mini menu" ] + [ a + [ classList + [ ( "ui link item", True ) + , ( "active", model.display == Edit ) + ] + , onClick (SetDisplay Edit) + , href "#" + ] + [ text "Edit" + ] + , a + [ classList + [ ( "ui link item", True ) + , ( "active", model.display == Preview ) + ] + , onClick (SetDisplay Preview) + , href "#" + ] + [ text "Preview" + ] + , a + [ classList + [ ( "ui link item", True ) + , ( "active", model.display == Split ) + ] + , onClick (SetDisplay Split) + , href "#" + ] + [ text "Split" + ] + , a + [ class "ui right floated help-link link item" + , target "_new" + , href model.cheatSheetUrl + ] + [ i [ class "ui help icon" ] [] + , text "Supports Markdown" + ] + ] + , div [ class "ui bottom attached segment" ] + [ case model.display of + Edit -> + editDisplay txt + + Preview -> + previewDisplay txt + + Split -> + splitDisplay txt + ] + ] + + +editDisplay : String -> Html Msg +editDisplay txt = + textarea + [ class "markdown-editor" + , onInput SetText + ] + [ text txt ] + + +previewDisplay : String -> Html Msg +previewDisplay txt = + Markdown.toHtml [ class "markdown-preview" ] txt + + +splitDisplay : String -> Html Msg +splitDisplay txt = + div [ class "ui grid" ] + [ div [ class "row" ] + [ div [ class "eight wide column markdown-split" ] + [ editDisplay txt + ] + , div [ class "eight wide column markdown-split" ] + [ previewDisplay txt + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/PasswordInput.elm b/modules/webapp/src/main/elm/Comp/PasswordInput.elm new file mode 100644 index 00000000..06f8fc94 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/PasswordInput.elm @@ -0,0 +1,74 @@ +module Comp.PasswordInput exposing + ( Model + , Msg + , init + , update + , view + ) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Util.Maybe + + +type alias Model = + { show : Bool + } + + +init : Model +init = + { show = False + } + + +type Msg + = ToggleShow (Maybe String) + | SetPassword String + + +update : Msg -> Model -> ( Model, Maybe String ) +update msg model = + case msg of + ToggleShow pw -> + ( { model | show = not model.show } + , pw + ) + + SetPassword str -> + let + pw = + Util.Maybe.fromString str + in + ( model, pw ) + + +view : Maybe String -> Model -> Html Msg +view pw model = + div [ class "ui left action input" ] + [ button + [ class "ui icon button" + , type_ "button" + , onClick (ToggleShow pw) + ] + [ i + [ classList + [ ( "ui eye icon", True ) + , ( "slash", model.show ) + ] + ] + [] + ] + , input + [ type_ <| + if model.show then + "text" + + else + "password" + , onInput SetPassword + , Maybe.withDefault "" pw |> value + ] + [] + ] diff --git a/modules/webapp/src/main/elm/Comp/ShareFileList.elm b/modules/webapp/src/main/elm/Comp/ShareFileList.elm new file mode 100644 index 00000000..b2f98fcb --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/ShareFileList.elm @@ -0,0 +1,368 @@ +module Comp.ShareFileList exposing + ( FileAction(..) + , Model + , Msg(..) + , Settings + , ViewMode(..) + , init + , previewPossible + , reset + , update + , view + ) + +import Api.Model.ShareFile exposing (ShareFile) +import Comp.YesNoDimmer +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Set exposing (Set) +import Util.Size + + +type alias Model = + { embedOn : Set String + , requestDelete : Maybe ShareFile + , yesNoModel : Comp.YesNoDimmer.Model + } + + +type Msg + = Select ShareFile + | EmbedFile ShareFile + | ReqDelete ShareFile + | YesNoMsg Comp.YesNoDimmer.Msg + + +type FileAction + = FileNone + | FileClick ShareFile + | FileDelete ShareFile + + +type ViewMode + = ViewList + | ViewCard + + +init : Model +init = + { embedOn = Set.empty + , requestDelete = Nothing + , yesNoModel = Comp.YesNoDimmer.emptyModel + } + + +dimmerSettings : Comp.YesNoDimmer.Settings +dimmerSettings = + Comp.YesNoDimmer.defaultSettings + + +reset : Model -> Model +reset model = + { model | embedOn = Set.empty } + + +type alias Settings = + { baseUrl : String + , viewMode : ViewMode + , delete : Bool + } + + +update : Msg -> Model -> ( Model, FileAction ) +update msg model = + case msg of + Select sf -> + ( model + , if previewPossible sf.mimetype then + FileClick sf + + else + FileNone + ) + + EmbedFile sf -> + ( { model | embedOn = Set.insert sf.id model.embedOn } + , FileNone + ) + + ReqDelete sf -> + ( { model + | requestDelete = Just sf + , yesNoModel = Comp.YesNoDimmer.activate model.yesNoModel + } + , FileNone + ) + + YesNoMsg lmsg -> + let + ( ym, flag ) = + Comp.YesNoDimmer.update lmsg model.yesNoModel + + action = + case model.requestDelete of + Just sf -> + if flag then + FileDelete sf + + else + FileNone + + Nothing -> + FileNone + in + ( { model | yesNoModel = ym }, action ) + + +view : Settings -> List ShareFile -> Model -> Html Msg +view settings files model = + case settings.viewMode of + ViewList -> + fileTable settings model files + + ViewCard -> + fileCards settings model files + + +fileCards : Settings -> Model -> List ShareFile -> Html Msg +fileCards settings model files = + div [ class "ui centered cards" ] <| + List.map (fileCard settings model) files + + +fileCard : Settings -> Model -> ShareFile -> Html Msg +fileCard settings model file = + div [ class "ui card", id file.id ] + [ Html.map YesNoMsg + (Comp.YesNoDimmer.view2 + (model.requestDelete == Just file) + dimmerSettings + model.yesNoModel + ) + , div [ class "image" ] + [ fileEmbed settings model file + ] + , div [ class "content" ] + [ text file.filename + , text " (" + , toFloat file.size |> Util.Size.bytesReadable Util.Size.B |> text + , text ")" + ] + , div [ class "extra content" ] + [ a + [ class "ui basic icon button" + , title "Download to disk" + , download file.filename + , href (settings.baseUrl ++ file.id) + ] + [ i [ class "download icon" ] [] + ] + , a + [ classList + [ ( "ui basic icon button", True ) + , ( "invisible", not <| previewPossible file.mimetype ) + ] + , title "View in browser" + , href "#" + , onClick (Select file) + ] + [ i [ class "eye icon" ] [] + ] + , incompleteLabel file + , a + [ classList + [ ( "ui right floated basic red icon button", True ) + , ( "invisible", not settings.delete ) + ] + , title "Delete the file." + , href "#" + , onClick (ReqDelete file) + ] + [ i [ class "trash icon" ] [] + ] + ] + ] + + +incompleteLabel : ShareFile -> Html msg +incompleteLabel file = + let + perc = + (toFloat file.storedSize / toFloat file.size * 100) |> round + in + div + [ classList + [ ( "ui red basic icon label", True ) + , ( "invisible", file.size == file.storedSize ) + ] + ] + [ i [ class "red bolt icon" ] [] + , text "The file is incomplete (" + , String.fromInt perc |> text + , text "%). Try uploading again." + ] + + +previewDeferred : List String +previewDeferred = + [ "video/", "audio/" ] + + +previewDirect : List String +previewDirect = + [ "text/", "application/pdf" ] + + +previewFor : List String -> String -> Bool +previewFor mimeList mime = + List.any (\x -> String.startsWith x mime) mimeList + + +previewPossible : String -> Bool +previewPossible mime = + previewFor (previewDeferred ++ previewDirect ++ [ "image/" ]) mime + + +fileEmbed : Settings -> Model -> ShareFile -> Html Msg +fileEmbed settings model file = + let + mime = + file.mimetype + in + if previewFor previewDirect mime || Set.member file.id model.embedOn then + embed + [ src (settings.baseUrl ++ file.id) + ] + [] + + else if previewFor previewDeferred mime then + div [ class "ui embed" ] + [ button + [ type_ "button" + , class "ui large secondary icon button" + , onClick (EmbedFile file) + ] + [ i [ class "large play circle outline icon" ] [] + ] + ] + + else if String.startsWith "image/" mime then + img + [ src (settings.baseUrl ++ file.id) + , class "preview-image" + ] + [] + + else + div [ class "ui placeholder segment preview-image" ] + [ div [ class "ui icon header" ] + [ i [ class (fileIcon file) ] [] + , text "Preview not supported" + ] + ] + + +fileTable : Settings -> Model -> List ShareFile -> Html Msg +fileTable settings model files = + let + yesNo = + case model.requestDelete of + Just sf -> + Html.map YesNoMsg + (Comp.YesNoDimmer.view2 + True + dimmerSettings + model.yesNoModel + ) + + Nothing -> + span [] [] + in + div [] + [ yesNo + , table [ class "ui very basic table" ] + [ tbody [] <| + List.map (fileRow settings model) files + ] + ] + + +fileRow : Settings -> Model -> ShareFile -> Html Msg +fileRow { baseUrl, delete } model file = + tr [ id file.id ] + [ td [ class "collapsing" ] + [ i [ class ("large " ++ fileIcon file) ] [] + ] + , td [] + [ text file.filename + , text " (" + , toFloat file.size |> Util.Size.bytesReadable Util.Size.B |> text + , text ") " + , incompleteLabel file + ] + , td [] + [ a + [ class "ui mini right floated basic icon button" + , title "Download to disk" + , href "#" + , download file.filename + , href (baseUrl ++ file.id) + ] + [ i [ class "download icon" ] [] + ] + , a + [ classList + [ ( "ui mini right floated basic icon button", True ) + , ( "invisible", not <| previewPossible file.mimetype ) + ] + , title "View in browser" + , href "#" + , onClick (Select file) + ] + [ i [ class "eye icon" ] [] + ] + , a + [ classList + [ ( "ui mini red right floated basic icon button", True ) + , ( "invisible", not delete ) + ] + , title "Delete file" + , href "#" + , onClick (ReqDelete file) + ] + [ i [ class "trash icon" ] [] + ] + ] + ] + + +fileIcon : ShareFile -> String +fileIcon file = + let + mime = + file.mimetype + in + if file.size /= file.storedSize then + "red bolt icon" + + else if mime == "application/pdf" then + "file pdf outline icon" + + else if mime == "application/zip" then + "file archive outline icon" + + else if String.startsWith "image/" mime then + "file image outline icon" + + else if String.startsWith "video/" mime then + "file video outline icon" + + else if String.startsWith "audio/" mime then + "file audio outline icon" + + else if String.startsWith "text/" mime then + "file alternate outline icon" + + else + "file outline icon" diff --git a/modules/webapp/src/main/elm/Comp/ShareTable.elm b/modules/webapp/src/main/elm/Comp/ShareTable.elm new file mode 100644 index 00000000..33d54844 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/ShareTable.elm @@ -0,0 +1,105 @@ +module Comp.ShareTable exposing + ( Model + , Msg + , init + , update + , view + ) + +import Api.Model.ShareListItem exposing (ShareListItem) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Util.Html +import Util.Size +import Util.String +import Util.Time + + +type alias Model = + { selected : Maybe ShareListItem + } + + +type Msg + = Select ShareListItem + + +init : Model +init = + { selected = Nothing + } + + +update : Msg -> Model -> ( Model, Maybe ShareListItem ) +update msg model = + case msg of + Select acc -> + ( { model | selected = Just acc }, Just acc ) + + +view : List ShareListItem -> Model -> Html Msg +view accounts model = + table [ class "ui selectable table" ] + [ thead [] + [ tr [] + [ th [] [ text "Name/Id" ] + , th [] [ text "Alias" ] + , th [ class "collapsing" ] [ text "Max Views" ] + , th [ class "collapsing" ] [ text "Published" ] + , th [ class "collapsing" ] [ text "#Files" ] + , th [ class "collapsing" ] [ text "Size" ] + , th [ class "collapsing" ] [ text "Created" ] + ] + ] + , tbody [] + (List.map (viewTableLine model) accounts) + ] + + +isSelected : Model -> ShareListItem -> Bool +isSelected model item = + Maybe.map .id model.selected + |> Maybe.map ((==) item.id) + |> Maybe.withDefault False + + +viewTableLine : Model -> ShareListItem -> Html Msg +viewTableLine model item = + tr + [ onClick (Select item) + , classList [ ( "active", isSelected model item ) ] + ] + [ td [] [ Maybe.withDefault (Util.String.shorten 12 item.id) item.name |> text ] + , td [] [ Maybe.withDefault "-" item.aliasName |> text ] + , td [ class "collapsing" ] [ String.fromInt item.maxViews |> text ] + , td [ class "collapsing" ] + [ publishedState item + ] + , td [ class "collapsing" ] + [ String.fromInt item.files |> text + ] + , td [ class "collapsing" ] + [ toFloat item.size + |> Util.Size.bytesReadable Util.Size.B + |> text + ] + , td [ class "collapsing" ] + [ Util.Time.formatDateTime item.created + |> text + ] + ] + + +publishedState : ShareListItem -> Html Msg +publishedState item = + case item.published of + Just flag -> + if flag then + Util.Html.checkbox flag + + else + i [ class "ui bolt icon" ] [] + + Nothing -> + Util.Html.checkboxUnchecked diff --git a/modules/webapp/src/main/elm/Comp/ValidityField.elm b/modules/webapp/src/main/elm/Comp/ValidityField.elm new file mode 100644 index 00000000..dc1eaf76 --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/ValidityField.elm @@ -0,0 +1,57 @@ +module Comp.ValidityField exposing + ( Model + , Msg + , init + , update + , view + ) + +import Comp.FixedDropdown +import Data.Flags exposing (Flags) +import Data.ValidityOptions + exposing + ( findValidityItem + , validityOptions + ) +import Data.ValidityValue exposing (ValidityValue) +import Html exposing (..) + + +type alias Model = + Comp.FixedDropdown.Model ValidityValue + + +init : Flags -> Model +init flags = + Comp.FixedDropdown.initTuple (validityOptions flags) + + +type Msg + = ValidityMsg (Comp.FixedDropdown.Msg ValidityValue) + + +update : Msg -> Model -> ( Model, Maybe ValidityValue ) +update msg model = + case msg of + ValidityMsg lmsg -> + let + ( m, sel ) = + Comp.FixedDropdown.update lmsg model + in + ( m, sel ) + + +mkValidityItem : ( String, ValidityValue ) -> Comp.FixedDropdown.Item ValidityValue +mkValidityItem ( text, id ) = + Comp.FixedDropdown.Item id text + + +view : ValidityValue -> Model -> Html Msg +view validity model = + let + value = + findValidityItem validity + |> mkValidityItem + in + Html.map ValidityMsg + (Comp.FixedDropdown.view (Just value) model) diff --git a/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm b/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm new file mode 100644 index 00000000..ac102d2b --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/YesNoDimmer.elm @@ -0,0 +1,117 @@ +module Comp.YesNoDimmer exposing + ( Model + , Msg + , Settings + , activate + , defaultSettings + , disable + , emptyModel + , update + , view + , view2 + ) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) + + +type alias Model = + { active : Bool + } + + +emptyModel : Model +emptyModel = + { active = False + } + + +type Msg + = Activate + | Disable + | ConfirmDelete + + +type alias Settings = + { message : String + , headerIcon : String + , headerClass : String + , confirmButton : String + , cancelButton : String + , invertedDimmer : Bool + } + + +defaultSettings : Settings +defaultSettings = + { message = "Delete this item permanently?" + , headerIcon = "exclamation icon" + , headerClass = "ui inverted icon header" + , confirmButton = "Yes, do it!" + , cancelButton = "No" + , invertedDimmer = False + } + + +activate : Model -> Model +activate model = + update Activate model + |> Tuple.first + + +disable : Model -> Model +disable model = + update Disable model + |> Tuple.first + + +update : Msg -> Model -> ( Model, Bool ) +update msg model = + case msg of + Activate -> + ( { model | active = True }, False ) + + Disable -> + ( { model | active = False }, False ) + + ConfirmDelete -> + ( { model | active = False }, True ) + + +view : Model -> Html Msg +view model = + view2 True defaultSettings model + + +view2 : Bool -> Settings -> Model -> Html Msg +view2 active settings model = + div + [ classList + [ ( "ui dimmer", True ) + , ( "inverted", settings.invertedDimmer ) + , ( "active", active && model.active ) + ] + ] + [ div [ class "content" ] + [ h3 [ class settings.headerClass ] + [ if settings.headerIcon == "" then + span [] [] + + else + i [ class settings.headerIcon ] [] + , text settings.message + ] + ] + , div [ class "content" ] + [ div [ class "ui buttons" ] + [ a [ class "ui primary button", onClick ConfirmDelete, href "" ] + [ text settings.confirmButton + ] + , div [ class "or" ] [] + , a [ class "ui secondary button", onClick Disable, href "" ] + [ text settings.cancelButton + ] + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Comp/Zoom.elm b/modules/webapp/src/main/elm/Comp/Zoom.elm new file mode 100644 index 00000000..dd39a95c --- /dev/null +++ b/modules/webapp/src/main/elm/Comp/Zoom.elm @@ -0,0 +1,112 @@ +module Comp.Zoom exposing (FileUrl, view) + +import Api +import Api.Model.ShareDetail exposing (ShareDetail) +import Api.Model.ShareFile exposing (ShareFile) +import Comp.ShareFileList exposing (ViewMode(..), previewPossible) +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Util.List +import Util.Size + + +type alias FileUrl = + String -> String + + +view : + FileUrl + -> { m | share : ShareDetail, zoom : Maybe ShareFile } + -> (ShareFile -> msg) + -> msg + -> Html msg +view fileUrl model onSelect onQuit = + div + [ classList + [ ( "ui dimmer", True ) + , ( "active", model.zoom /= Nothing ) + ] + ] + [ case model.zoom of + Just file -> + let + files = + List.filter (\f -> previewPossible f.mimetype) model.share.files + + prev = + Util.List.findPrev (\e -> e.id == file.id) files + + next = + Util.List.findNext (\e -> e.id == file.id) files + in + div [ class "ui container full-height" ] + [ div [ class "ui top attached centered mini menu" ] + [ button + [ type_ "button" + , class "ui button" + , onClick onQuit + ] + [ text "Back" + ] + , div [ class "text item" ] + [ text file.filename + , text " (" + , toFloat file.size |> Util.Size.bytesReadable Util.Size.B |> text + , text ")" + ] + , div [ class "right menu" ] + [ div [ class "ui buttons" ] + [ button + [ type_ "button" + , classList + [ ( "ui icon button", True ) + , ( "disabled", prev == Nothing ) + ] + , onClick (onSelect (Maybe.withDefault file prev)) + ] + [ i [ class "arrow left icon" ] [] + ] + , button + [ type_ "button" + , classList + [ ( "ui icon button", True ) + , ( "disabled", next == Nothing ) + ] + , onClick (onSelect (Maybe.withDefault file next)) + ] + [ i [ class "arrow right icon" ] [] + ] + ] + ] + ] + , filePreview fileUrl model file + ] + + Nothing -> + span [] [] + ] + + +filePreview : FileUrl -> { m | share : ShareDetail, zoom : Maybe ShareFile } -> ShareFile -> Html msg +filePreview fileUrl model file = + let + url = + fileUrl file.id + in + if String.startsWith "image/" file.mimetype then + img + [ src url + , class "full-width" + ] + [] + + else + iframe + [ src url + , class "full-embed" + , attribute "width" "100%" + , attribute "height" "100%" + ] + [] diff --git a/modules/webapp/src/main/elm/Data.elm b/modules/webapp/src/main/elm/Data.elm deleted file mode 100644 index d215112a..00000000 --- a/modules/webapp/src/main/elm/Data.elm +++ /dev/null @@ -1,439 +0,0 @@ -module Data exposing (..) - -import Date -import Html exposing (Html) -import Http -import Json.Decode as Decode exposing(field, at) -import Json.Decode.Pipeline as JP -import Json.Encode as Encode -import List -import Markdown - --- Account type - -type alias Account = - { login: String - , password: Maybe String - , email: Maybe String - , enabled: Bool - , admin: Bool - , extern: Bool - } - -emptyAccount: Account -emptyAccount = - Account "" Nothing Nothing True False False - -fromLogin: String -> Account -fromLogin login = - {emptyAccount | login = login} - -accountEncoder: Account -> Encode.Value -accountEncoder acc = - Encode.object - [ ("login", Encode.string acc.login) - , ("password", Encode.string (Maybe.withDefault "" acc.password)) - , ("email", Encode.string (Maybe.withDefault "" acc.email)) - , ("enabled", Encode.bool acc.enabled) - , ("admin", Encode.bool acc.admin) - , ("extern", Encode.bool acc.extern) - ] - -accountDecoder: Decode.Decoder Account -accountDecoder = - Decode.map6 Account - (field "login" Decode.string) - (field "password" (Decode.maybe Decode.string)) - (field "email" (Decode.maybe Decode.string)) - (field "enabled" Decode.bool) - (field "admin" Decode.bool) - (field "extern" Decode.bool) - --- Alias types - -type alias Alias = - {id: String - ,login: String - ,name: String - ,validity: String - ,created: String - ,enable: Bool - } - -decodeAlias: Decode.Decoder Alias -decodeAlias = - Decode.map6 Alias - (field "id" Decode.string) - (field "login" Decode.string) - (field "name" Decode.string) - (field "validity" Decode.string) - (field "created" Decode.string) - (field "enable" Decode.bool) - -encodeAlias: Alias -> Encode.Value -encodeAlias alia = - Encode.object - [("id", Encode.string alia.id) - ,("login", Encode.string alia.login) - ,("name", Encode.string alia.name) - ,("validity", Encode.string alia.validity) - ,("created", Encode.string alia.created) - ,("enable", Encode.bool alia.enable) - ] - --- Upload types - -{-| An upload can be identified by an public id (pid) and its standard id (uid). --} -type UploadId - = Uid String - | Pid String - -type alias File = - {id: String - ,timestamp: String - ,mimetype: String - ,length: Int - ,chunks: Int - ,chunksize: Int - ,filename: String - } - -type alias Upload = - {id: String - ,login: String - ,alia: Maybe String - ,aliasName: Maybe String - ,validity: String - ,maxDownloads: Int - ,requiresPassword: Bool - ,validated: List String - ,description: Maybe String - ,created: String - ,downloads: Int - ,lastDownload: Maybe String - ,publishId: Maybe String - ,publishDate: Maybe String - ,validUntil: Maybe String - ,name: Maybe String - } - -isValidUpload: Upload -> Bool -isValidUpload upload = - List.isEmpty upload.validated - -isPublishedUpload: Upload -> Bool -isPublishedUpload upload = - isPresent upload.publishId - - -type alias UploadInfo = - {upload: Upload - ,files: List File - } - -decodeFile: Decode.Decoder File -decodeFile = - Decode.map7 File - (at ["meta","id"] Decode.string) - (at ["meta","timestamp"] Decode.string) - (at ["meta","mimetype"] Decode.string) - (at ["meta","length"] Decode.int) - (at ["meta","chunks"] Decode.int) - (at ["meta","chunksize"] Decode.int) - (at ["filename"] Decode.string) - -decodeUpload: Decode.Decoder Upload -decodeUpload = - JP.decode Upload - |> JP.required "id" Decode.string - |> JP.required "login" Decode.string - |> JP.required "alias" (Decode.maybe Decode.string) - |> JP.required "aliasName" (Decode.maybe Decode.string) - |> JP.required "validity" Decode.string - |> JP.required "maxDownloads" Decode.int - |> JP.required "requiresPassword" Decode.bool - |> JP.required "validated" (Decode.list Decode.string) - |> JP.required "description" (Decode.maybe Decode.string) - |> JP.required "created" Decode.string - |> JP.required "downloads" Decode.int - |> JP.required "lastDownload" (Decode.maybe Decode.string) - |> JP.required "publishId" (Decode.maybe Decode.string) - |> JP.required "publishDate" (Decode.maybe Decode.string) - |> JP.required "validUntil" (Decode.maybe Decode.string) - |> JP.required "name" (Decode.maybe Decode.string) - -decodeUploadInfo: Decode.Decoder UploadInfo -decodeUploadInfo = - Decode.map2 UploadInfo - (field "upload" decodeUpload) - (field "files" (Decode.list decodeFile)) - - - --- Outcome type -type alias Outcome a = - { state: String - , result: a - } - -outcomeDecoder: Decode.Decoder a -> Decode.Decoder (Outcome a) -outcomeDecoder adec = - Decode.map2 Outcome - (field "state" Decode.string) - (field "result" adec) - --- Flag types - -type alias RemoteUrls = - {baseUrl: String - ,authLogin: String - ,authCookie: String - ,logout: String - ,accounts: String - ,uploads: String - ,uploadData: String - ,uploadPublish: String - ,uploadUnpublish: String - ,download: String - ,downloadPublished: String - ,profileEmail: String - ,profilePassword: String - ,checkPassword: String - ,aliases: String - ,mailDownloadTemplate: String - ,mailAliasTemplate: String - ,mailSend: String - ,uploadNotify: String - ,manual: String - } - -type alias RemoteConfig = - { authEnabled: Bool - , appName: String - , cookieAge: Float - , chunkSize: Int - , simultaneousUploads: Int - , maxFiles: Int - , maxFileSize: Int - , maxValidity: String - , urls: RemoteUrls - , projectName: String - , aliasHeaderName: String - , mailEnabled: Bool - , welcomeMessage: String - } - - --- utility stuff - -httpPut: String -> Http.Body -> Decode.Decoder a -> (Http.Request a) -httpPut url body dec = - Http.request - { method = "PUT" - , headers = [] - , url = url - , body = body - , expect = Http.expectJson dec - , timeout = Nothing - , withCredentials = False - } - -httpDelete: String -> Http.Body -> Decode.Decoder a -> (Http.Request a) -httpDelete url body dec = - Http.request - { method = "DELETE" - , headers = [] - , url = url - , body = body - , expect = Http.expectJson dec - , timeout = Nothing - , withCredentials = False - } - - -errorMessage: Http.Error -> String -errorMessage err = - case err of - Http.Timeout -> - "There was a network timeout!" - Http.NetworkError -> - "There was a network error!" - Http.BadStatus resp -> - (decodeError resp) - Http.BadPayload msg resp -> - msg ++ "; Response: " ++ (decodeError resp) - Http.BadUrl msg -> - "Internal error: invalid url for request." - -isStatusCode: Int -> Http.Error -> Bool -isStatusCode status err = - case err of - Http.BadStatus resp -> - resp.status.code == status - _ -> - False - -isUnauthorized: Http.Error -> Bool -isUnauthorized = isStatusCode 401 - -isNotFound: Http.Error -> Bool -isNotFound = isStatusCode 404 - -decodeError: Http.Response String -> String -decodeError resp = - let - msg = - Decode.decodeString (field "message" Decode.string) resp.body - text = - case msg of - Ok msg -> msg - _ -> resp.body - in - if ((String.length text) > 0) then text - else if (resp.status.code == 404) then "The object was not found." - else "Some error occured at the server without giving specific error message: " ++ (toString resp.status) - - - -nonEmpty: List a -> Bool -nonEmpty list = - not (List.isEmpty list) - - -type SizeUnit = G|M|K|B - -prettyNumber: Float -> String -prettyNumber n = - let - parts = String.split "." (toString n) - in - case parts of - n :: d :: [] -> n ++ "." ++ (String.left 2 d) - _ -> String.join "." parts - -bytesReadable: SizeUnit -> Float -> String -bytesReadable unit n = - let - k = n / 1024 - num = prettyNumber n - in - case unit of - G -> num ++ "G" - M -> if k > 1 then (bytesReadable G k) else num ++ "M" - K -> if k > 1 then (bytesReadable M k) else num ++ "K" - B -> if k > 1 then (bytesReadable K k) else num ++ "B" - -defer: Cmd m -> (a,b) -> (a, b, Cmd m) -defer c (a,b) = - (a, b, c) - -htmlList: List (Bool, Html msg) -> List (Html msg) -htmlList tupleList = - List.filterMap (\(a, b) -> if a then Just b else Nothing) tupleList - - -maybeOrElse: Maybe a -> Maybe a -> Maybe a -maybeOrElse a b = - case a of - Just _ -> a - Nothing -> b - -nonEmptyStr: String -> Maybe String -nonEmptyStr str = - if str == "" then Nothing else Just str - -parseMime: String -> (String, String) -parseMime mime = - let - unknown = ("application", "octet-stream") - in - case String.split ";" mime of - x :: [] -> - case String.split "/" x of - media :: sub :: [] -> - (media, sub) - _ -> unknown - _ -> unknown - -isPresent: Maybe a -> Bool -isPresent mb = - Maybe.map (\_ -> True) mb - |> Maybe.withDefault False - -parseDuration: String -> Maybe (Int, String) -parseDuration str = - let - lower = String.toLower str - in - if String.startsWith "pt" lower then - case String.toInt (String.dropLeft 2 lower |> String.dropRight 1) of - Ok n -> - (n, String.right 1 lower) |> Just - _ -> - Nothing - else - Nothing - -formatDuration: String -> String -formatDuration str = - case parseDuration str of - Just (n, "h") -> - if rem n 24 == 0 then - (toString (n // 24)) ++ "d" - else - (toString n) ++ "h" - Just (n, unit) -> - (toString n) ++ unit - Nothing -> - str - -messagesToHtml: List String -> Html msg -messagesToHtml messages = - case messages of - [] -> Html.span[][] - m :: [] -> Html.span[][Html.text m] - _ -> - let - f m = Html.li [][Html.text m] - in - Html.ul [] (List.map f messages) - -formatInt2: Int -> String -formatInt2 n = - if n < 10 then "0" ++ (toString n) - else toString n - -formatDate: String -> String -formatDate str = - case (Date.fromString str) of - Ok d -> - let - year = Date.year d |> toString - month = Date.month d |> toString - dow = Date.dayOfWeek d |> toString - day = Date.day d |> formatInt2 - hour = Date.hour d |> formatInt2 - min = Date.minute d |> formatInt2 - in - dow ++ ", " ++ day ++ ". " ++ month ++ " " ++ year ++ ", " ++ hour ++ ":" ++ min - _ -> - str - -markdownHtml: String -> Html msg -markdownHtml str = - let - defaultOpts = Markdown.defaultOptions - markedOptions = {defaultOpts | sanitize = True, smartypants = True, githubFlavored = Just { tables = True, breaks = False}} - in - Markdown.toHtmlWith markedOptions [] str - -type alias UploadUpdate = - { name: String - } - -uploadUpdateEncoder: UploadUpdate -> Encode.Value -uploadUpdateEncoder up = - Encode.object - [ ("name", Encode.string up.name) - ] diff --git a/modules/webapp/src/main/elm/Data/AccountState.elm b/modules/webapp/src/main/elm/Data/AccountState.elm new file mode 100644 index 00000000..8d9e13c0 --- /dev/null +++ b/modules/webapp/src/main/elm/Data/AccountState.elm @@ -0,0 +1,52 @@ +module Data.AccountState exposing + ( AccountState(..) + , all + , fromString + , fromStringDefault + , fromStringOrActive + , toString + ) + + +type AccountState + = Active + | Disabled + + +fromString : String -> Maybe AccountState +fromString str = + case String.toLower str of + "active" -> + Just Active + + "disabled" -> + Just Disabled + + _ -> + Nothing + + +fromStringDefault : AccountState -> String -> AccountState +fromStringDefault default str = + fromString str + |> Maybe.withDefault default + + +fromStringOrActive : String -> AccountState +fromStringOrActive str = + fromStringDefault Active str + + +toString : AccountState -> String +toString state = + case state of + Active -> + "Active" + + Disabled -> + "Disabled" + + +all : List AccountState +all = + [ Active, Disabled ] diff --git a/modules/webapp/src/main/elm/Data/Flags.elm b/modules/webapp/src/main/elm/Data/Flags.elm new file mode 100644 index 00000000..88ec852a --- /dev/null +++ b/modules/webapp/src/main/elm/Data/Flags.elm @@ -0,0 +1,40 @@ +module Data.Flags exposing (..) + +import Api.Model.AppConfig exposing (AppConfig) +import Api.Model.AuthResult exposing (AuthResult) +import Html exposing (..) +import Html.Attributes exposing (..) +import Util.Size + + +type alias Flags = + { account : Maybe AuthResult + , config : AppConfig + } + + +getToken : Flags -> Maybe String +getToken flags = + flags.account + |> Maybe.andThen (\a -> a.token) + + +withAccount : Flags -> AuthResult -> Flags +withAccount flags acc = + { flags | account = Just acc } + + +withoutAccount : Flags -> Flags +withoutAccount flags = + { flags | account = Nothing } + + +limitsMessage : Flags -> List (Html.Attribute msg) -> Html msg +limitsMessage flags attr = + div attr + [ text "Uploads are possible up to " + , toFloat flags.config.maxSize + |> Util.Size.bytesReadable Util.Size.B + |> text + , text "." + ] diff --git a/modules/webapp/src/main/elm/Data/UploadData.elm b/modules/webapp/src/main/elm/Data/UploadData.elm new file mode 100644 index 00000000..8ce84055 --- /dev/null +++ b/modules/webapp/src/main/elm/Data/UploadData.elm @@ -0,0 +1,28 @@ +module Data.UploadData exposing (UploadData, encode) + +import Json.Decode as D +import Json.Encode as E + + +{-| Values of this type are send via ports to JS to run chunked +uploads via tus-js-client library. +-} +type alias UploadData = + { url : String + , id : String + , files : List D.Value + , aliasId : Maybe String + } + + +encode : UploadData -> D.Value +encode data = + E.object + [ ( "url", E.string data.url ) + , ( "id", E.string data.id ) + , ( "files", E.list identity data.files ) + , ( "aliasId" + , Maybe.map E.string data.aliasId + |> Maybe.withDefault E.null + ) + ] diff --git a/modules/webapp/src/main/elm/Data/UploadDict.elm b/modules/webapp/src/main/elm/Data/UploadDict.elm new file mode 100644 index 00000000..b60f160e --- /dev/null +++ b/modules/webapp/src/main/elm/Data/UploadDict.elm @@ -0,0 +1,142 @@ +module Data.UploadDict exposing + ( UploadDict + , UploadProgress(..) + , allDone + , countDone + , empty + , size + , trackUpload + , updateFiles + ) + +import Data.UploadState exposing (UploadState) +import Dict exposing (Dict) +import File exposing (File) +import Json.Decode as D + + +type alias UploadDict = + { selectedFiles : List ( D.Value, File ) + , uploads : Dict Int UploadState + } + + +empty : UploadDict +empty = + { selectedFiles = [] + , uploads = Dict.empty + } + + +updateFiles : UploadDict -> List ( D.Value, File ) -> UploadDict +updateFiles model files = + { model | selectedFiles = files } + + +type UploadProgress + = FileProgress Int Int + | AllProgress Int + + +size : UploadDict -> Int +size up = + List.map Tuple.second up.selectedFiles + |> List.map File.size + |> List.sum + + +allDone : UploadDict -> Bool +allDone up = + let + ( succ, err ) = + countDone up + in + succ + err == List.length up.selectedFiles + + +countDone : UploadDict -> ( Int, Int ) +countDone { selectedFiles, uploads } = + let + tupleAdd t1 t2 = + ( Tuple.first t1 + Tuple.first t2 + , Tuple.second t1 + Tuple.second t2 + ) + + count index file = + Dict.get index uploads + |> Maybe.map .state + |> Maybe.map + (\s -> + case s of + Data.UploadState.Complete -> + ( 1, 0 ) + + Data.UploadState.Progress _ _ -> + ( 0, 0 ) + + Data.UploadState.Failed _ -> + ( 0, 1 ) + ) + |> Maybe.withDefault ( 0, 0 ) + in + List.indexedMap count selectedFiles + |> List.foldl tupleAdd ( 0, 0 ) + + +trackUpload : UploadDict -> UploadState -> ( UploadDict, List UploadProgress ) +trackUpload model state = + let + next = + Dict.insert state.file state model.uploads + + sizeOf index file = + Dict.get index next + |> Maybe.map .state + |> Maybe.map + (\s -> + case s of + Data.UploadState.Complete -> + File.size file + + Data.UploadState.Progress n _ -> + n + + Data.UploadState.Failed _ -> + File.size file + ) + |> Maybe.withDefault 0 + + allsize = + List.unzip model.selectedFiles + |> Tuple.second + |> List.map File.size + |> List.sum + + currsize = + List.unzip model.selectedFiles + |> Tuple.second + |> List.indexedMap sizeOf + |> List.sum + + mkPercent : Int -> Int -> Int + mkPercent c t = + (toFloat c / toFloat t) * 100 |> round + + filePerc = + case state.state of + Data.UploadState.Progress cur total -> + [ FileProgress state.file (mkPercent cur total) + ] + + _ -> + [] + + allPerc = + [ AllProgress (mkPercent currsize allsize) + ] + in + ( { model + | uploads = next + } + , filePerc ++ allPerc + ) diff --git a/modules/webapp/src/main/elm/Data/UploadState.elm b/modules/webapp/src/main/elm/Data/UploadState.elm new file mode 100644 index 00000000..0dd0db4c --- /dev/null +++ b/modules/webapp/src/main/elm/Data/UploadState.elm @@ -0,0 +1,72 @@ +module Data.UploadState exposing + ( FileProgress(..) + , UploadState + , decode + ) + +import Json.Decode as D + + +{-| Values of this type are received from the JS side to inform about +upload state. +-} +type alias UploadState = + { id : String + , file : Int + , state : FileProgress + } + + +type FileProgress + = Complete + | Progress Int Int + | Failed String + + +decode : D.Value -> Result String UploadState +decode json = + D.decodeValue decoder json + |> Result.mapError D.errorToString + + +decoder : D.Decoder UploadState +decoder = + D.map3 UploadState + (D.field "id" D.string) + (D.field "file" D.int) + (D.field "progress" progressDecoder) + + +progressDecoder : D.Decoder FileProgress +progressDecoder = + let + complete = + D.map (\_ -> Complete) + (D.field "state" (constant "complete")) + + failed = + D.map2 (\e -> \_ -> Failed e) + (D.field "error" D.string) + (D.field "state" (constant "failed")) + + progress = + D.map3 (\a -> \b -> \_ -> Progress a b) + (D.field "uploaded" D.int) + (D.field "total" D.int) + (D.field "state" (constant "progress")) + in + D.oneOf [ complete, failed, progress ] + + +constant : String -> D.Decoder () +constant str = + let + check s = + if String.toLower str == s then + D.succeed () + + else + D.fail ("Expected " ++ str ++ " but got: " ++ s) + in + D.map String.toLower D.string + |> D.andThen check diff --git a/modules/webapp/src/main/elm/Data/ValidityOptions.elm b/modules/webapp/src/main/elm/Data/ValidityOptions.elm new file mode 100644 index 00000000..43f20f69 --- /dev/null +++ b/modules/webapp/src/main/elm/Data/ValidityOptions.elm @@ -0,0 +1,90 @@ +module Data.ValidityOptions exposing + ( findValidityItem + , findValidityItemMillis + , validityOptions + ) + +import Data.Flags exposing (Flags) +import Data.ValidityValue exposing (ValidityValue(..)) + + +allValidityOptions : List ( String, ValidityValue ) +allValidityOptions = + [ ( "1/2 hour", Minutes 30 ) + , ( "1 hour", Hours 1 ) + , ( "2 hours", Hours 2 ) + , ( "4 hours", Hours 4 ) + , ( "8 hours", Hours 8 ) + , ( "16 hours", Hours 16 ) + , ( "1 day", Days 1 ) + , ( "2 days", Days 2 ) + , ( "4 days", Days 4 ) + , ( "1 week", Days 7 ) + , ( "2 weeks", Days 14 ) + , ( "1 month", Days 30 ) + , ( "2 months", Days 60 ) + , ( "4 months", Days <| 4 * 30 ) + , ( "8 months", Days <| 8 * 30 ) + , ( "12 months", Days 365 ) + ] + + +validityOptions : Flags -> List ( String, ValidityValue ) +validityOptions flags = + let + fun ( _, v ) = + Data.ValidityValue.toMillis v <= flags.config.maxValidity + in + List.filter fun allValidityOptions + + +defaultValidity : ( String, ValidityValue ) +defaultValidity = + ( "2 days", Days 2 ) + + +findValidityItemMillis : Int -> ( String, ValidityValue ) +findValidityItemMillis millis = + findValidityItem (Millis millis) + + +{-| Finds the item from the list of options that best matches the +given validity value. +-} +findValidityItem : ValidityValue -> ( String, ValidityValue ) +findValidityItem vv = + let + ld = + List.repeat (List.length allValidityOptions) vv + + diff t a = + ( Data.ValidityValue.sub (Tuple.second t) a |> abs, t ) + in + List.map2 diff allValidityOptions ld + |> findMinimum + |> Maybe.map Tuple.second + |> Maybe.withDefault defaultValidity + + +findMinimum : + List ( Int, ( String, ValidityValue ) ) + -> Maybe ( Int, ( String, ValidityValue ) ) +findMinimum list = + case list of + [] -> + Nothing + + x :: xs -> + let + getmin : + ( Int, ( String, ValidityValue ) ) + -> ( Int, ( String, ValidityValue ) ) + -> ( Int, ( String, ValidityValue ) ) + getmin a b = + if Tuple.first a < Tuple.first b then + a + + else + b + in + Just (List.foldl getmin x xs) diff --git a/modules/webapp/src/main/elm/Data/ValidityValue.elm b/modules/webapp/src/main/elm/Data/ValidityValue.elm new file mode 100644 index 00000000..8a0b0d81 --- /dev/null +++ b/modules/webapp/src/main/elm/Data/ValidityValue.elm @@ -0,0 +1,60 @@ +module Data.ValidityValue exposing + ( ValidityValue(..) + , gte + , lte + , sub + , toMillis + ) + + +type ValidityValue + = Millis Int + | Minutes Int + | Hours Int + | Days Int + + +toMillis : ValidityValue -> Int +toMillis v = + case v of + Millis n -> + n + + Minutes n -> + n * minutesToMillis + + Hours n -> + n * hourToMillis + + Days n -> + n * dayToMillis + + +sub : ValidityValue -> ValidityValue -> Int +sub v1 v2 = + toMillis v1 - toMillis v2 + + +lte : ValidityValue -> ValidityValue -> Bool +lte v1 v2 = + toMillis v1 <= toMillis v2 + + +gte : ValidityValue -> ValidityValue -> Bool +gte v1 v2 = + lte v2 v1 + + +minutesToMillis : Int +minutesToMillis = + 60 * 1000 + + +hourToMillis : Int +hourToMillis = + 60 * 60 * 1000 + + +dayToMillis : Int +dayToMillis = + 24 * hourToMillis diff --git a/modules/webapp/src/main/elm/Main.elm b/modules/webapp/src/main/elm/Main.elm index d7c1acec..757951f2 100644 --- a/modules/webapp/src/main/elm/Main.elm +++ b/modules/webapp/src/main/elm/Main.elm @@ -1,88 +1,109 @@ module Main exposing (..) -import AnimationFrame -import Time exposing (Time, millisecond) -import App.Model exposing (..) -import App.Update -import App.View -import Data exposing (Account, RemoteConfig) -import Pages.Login.Model as LoginModel -import Pages.Login.Commands as LoginCmd -import Pages.Upload.Model as UploadModel -import Resumable +import Api +import App.Data exposing (..) +import App.Update exposing (..) +import App.View exposing (..) +import Browser exposing (Document) +import Browser.Navigation exposing (Key) +import Data.Flags exposing (Flags) +import Data.UploadState exposing (UploadState) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (..) +import Page exposing (Page(..)) import Ports -import Navigation +import Url exposing (Url) + + + +-- MAIN + + +main : Program Flags Model Msg +main = + Browser.application + { init = init + , view = viewDoc + , update = update + , subscriptions = subscriptions + , onUrlRequest = NavRequest + , onUrlChange = NavChange + } + -type alias Flags = - { account: Maybe Account - , remoteConfig: RemoteConfig - } -init: Flags -> Navigation.Location -> (Model, Cmd Msg) -init flags location = +-- MODEL + + +init : Flags -> Url -> Key -> ( Model, Cmd Msg ) +init flags url key = let - hasAccount = Maybe.map (\a -> True) flags.account |> Maybe.withDefault False - model = initModel flags.remoteConfig flags.account location - (model_, cmd_) = App.Update.update (UrlChange location) model - cmd = Cmd.batch - [ - if flags.remoteConfig.authEnabled || hasAccount then - Cmd.none - else - Cmd.map LoginMsg (LoginCmd.authenticate (LoginModel.sharryModel flags.remoteConfig.urls flags.remoteConfig.welcomeMessage)) - ,cmd_ - ] + im = + App.Data.init key url flags + + page = + checkPage flags im.page + + ( m, cmd ) = + if im.page == page then + App.Update.initPage im page + + else + ( im, Page.goto page ) + + sessionCheck = + case m.flags.account of + Just _ -> + Api.loginSession flags SessionCheckResp + + Nothing -> + Cmd.none in - (model_, cmd) + ( m, Cmd.batch [ cmd, Api.versionInfo flags VersionResp, sessionCheck ] ) + + +viewDoc : Model -> Document Msg +viewDoc model = + { title = model.flags.config.appName + , body = [ view model ] + } -fileAddedMsg: (String, Resumable.File) -> Msg -fileAddedMsg (page, f) = - ResumableMsg page (Resumable.FileAdded f) -fileProgressMsg: (String, Float) -> Msg -fileProgressMsg (page, percent) = - ResumableMsg page (Resumable.Progress percent) +-- SUBSCRIPTIONS -fileErrorMsg: (String, String, Resumable.File) -> Msg -fileErrorMsg (page, msg, file) = - ResumableMsg page (Resumable.FileError file msg) -fileSuccessMsg: (String, Resumable.File) -> Msg -fileSuccessMsg (page, file) = - ResumableMsg page (Resumable.FileSuccess file) +uploadStateSub : Sub Msg +uploadStateSub = + Ports.uploadState (Data.UploadState.decode >> UploadStateMsg) -fileMaxSizeError: (String, Resumable.File) -> Msg -fileMaxSizeError (page, file) = - ResumableMsg page (Resumable.FileError file "The maximum size limit is exceeded!") -fileMaxCountError: (String, Resumable.File) -> Msg -fileMaxCountError (page, file) = - ResumableMsg page (Resumable.FileError file "The maximum file count limit is exceeded!") +uploadStopped : Sub Msg +uploadStopped = + Ports.uploadStopped UploadStoppedMsg -subscriptions: Model -> Sub Msg + +subscriptions : Model -> Sub Msg subscriptions model = - Sub.batch - [ Time.every (model.serverConfig.cookieAge * millisecond * 0.9) LoginRefresh - , if model.deferred == [] then Sub.none else AnimationFrame.times DeferredTick - , Ports.randomString RandomString - , Ports.resumableHandle (\(page, h) -> ResumableMsg page (Resumable.SetHandle h)) - , Ports.resumableFileAdded fileAddedMsg - , Ports.resumableProgress fileProgressMsg - , Ports.resumableError fileErrorMsg - , Ports.resumableFileSuccess fileSuccessMsg - , Ports.resumableComplete (\h -> ResumableMsg h Resumable.UploadComplete) - , Ports.resumableStarted (\h -> ResumableMsg h Resumable.UploadStarted) - , Ports.resumablePaused (\h -> ResumableMsg h Resumable.UploadPaused) - , Ports.resumableMaxFilesError fileMaxCountError - , Ports.resumableMaxFileSizeError fileMaxSizeError - ] + case model.page of + SharePage -> + Sub.batch + [ uploadStateSub + , uploadStopped + ] + OpenSharePage _ -> + Sub.batch + [ uploadStateSub + , uploadStopped + ] -main = - Navigation.programWithFlags UrlChange - { init = init - , view = App.View.view - , update = App.Update.update - , subscriptions = subscriptions - } + DetailPage _ -> + Sub.batch + [ uploadStateSub + , uploadStopped + ] + + _ -> + Sub.none diff --git a/modules/webapp/src/main/elm/Page.elm b/modules/webapp/src/main/elm/Page.elm new file mode 100644 index 00000000..65ec2c58 --- /dev/null +++ b/modules/webapp/src/main/elm/Page.elm @@ -0,0 +1,252 @@ +module Page exposing + ( Page(..) + , fromUrl + , goto + , href + , isAdmin + , isOpen + , isSecured + , loginPage + , loginPageReferrer + , pageFromString + , pageToString + , set + ) + +import Browser.Navigation as Nav +import Html exposing (Attribute) +import Html.Attributes as Attr +import Url exposing (Url) +import Url.Parser as Parser exposing ((), (), Parser, oneOf, s, string) +import Url.Parser.Query as Query +import Util.Maybe + + +type Page + = HomePage + | LoginPage ( Maybe String, Bool ) + | RegisterPage + | NewInvitePage + | InfoPage Int + | AccountPage (Maybe String) + | AliasPage (Maybe String) + | UploadPage + | SharePage + | OpenSharePage String + | SettingsPage + | DetailPage String + | OpenDetailPage String + + +isSecured : Page -> Bool +isSecured page = + case page of + HomePage -> + True + + LoginPage _ -> + False + + RegisterPage -> + False + + NewInvitePage -> + True + + InfoPage _ -> + False + + AccountPage _ -> + True + + AliasPage _ -> + True + + UploadPage -> + True + + SharePage -> + True + + OpenSharePage _ -> + False + + SettingsPage -> + True + + DetailPage _ -> + True + + OpenDetailPage _ -> + False + + +isAdmin : Page -> Bool +isAdmin page = + case page of + NewInvitePage -> + True + + AccountPage _ -> + True + + _ -> + False + + +isOpen : Page -> Bool +isOpen page = + not (isSecured page || isAdmin page) + + +loginPageReferrer : Page -> ( Maybe Page, Bool ) +loginPageReferrer page = + case page of + LoginPage ( r, flag ) -> + ( Maybe.andThen pageFromString r, flag ) + + _ -> + ( Nothing, False ) + + +loginPage : Page -> Page +loginPage p = + case p of + LoginPage _ -> + LoginPage ( Nothing, False ) + + _ -> + LoginPage ( Just (pageToString p), False ) + + +pageToString : Page -> String +pageToString page = + case page of + HomePage -> + "/app/home" + + LoginPage ( referer, oauth ) -> + Maybe.map (\p -> "?r=" ++ p) referer + |> Maybe.withDefault "" + |> (++) "/app/login" + + RegisterPage -> + "/app/register" + + NewInvitePage -> + "/app/newinvite" + + InfoPage n -> + "/app/info/" ++ String.fromInt n + + AccountPage mid -> + let + path = + "/app/account" + in + Maybe.map (\id -> path ++ "/" ++ id) mid + |> Maybe.withDefault path + + AliasPage mid -> + let + path = + "/app/alias" + in + Maybe.map (\id -> path ++ "/" ++ id) mid + |> Maybe.withDefault path + + UploadPage -> + "/app/uploads" + + SharePage -> + "/app/share" + + OpenSharePage id -> + "/app/share/" ++ id + + SettingsPage -> + "/app/settings" + + DetailPage id -> + "/app/upload/" ++ id + + OpenDetailPage id -> + "/app/open/" ++ id + + +pageFromString : String -> Maybe Page +pageFromString str = + let + urlNormed = + if String.startsWith str "http" then + str + + else + "http://somehost" ++ str + + url = + Url.fromString urlNormed + in + Maybe.andThen (Parser.parse parser) url + + +href : Page -> Attribute msg +href page = + Attr.href (pageToString page) + + +goto : Page -> Cmd msg +goto page = + Nav.load (pageToString page) + + +set : Nav.Key -> Page -> Cmd msg +set key page = + Nav.pushUrl key (pageToString page) + + +pathPrefix : String +pathPrefix = + "app" + + +parser : Parser (Page -> a) a +parser = + oneOf + [ Parser.map HomePage Parser.top + , Parser.map HomePage (s pathPrefix s "home") + , Parser.map LoginPage (s pathPrefix s "login" loginPageParser) + , Parser.map RegisterPage (s pathPrefix s "register") + , Parser.map NewInvitePage (s pathPrefix s "newinvite") + , Parser.map InfoPage (s pathPrefix s "info" Parser.int) + , Parser.map (\s -> AccountPage (Just s)) (s pathPrefix s "account" string) + , Parser.map (AccountPage Nothing) (s pathPrefix s "account") + , Parser.map (\s -> AliasPage (Just s)) (s pathPrefix s "alias" string) + , Parser.map (AliasPage Nothing) (s pathPrefix s "alias") + , Parser.map UploadPage (s pathPrefix s "uploads") + , Parser.map DetailPage (s pathPrefix s "upload" string) + , Parser.map OpenSharePage (s pathPrefix s "share" string) + , Parser.map SharePage (s pathPrefix s "share") + , Parser.map SettingsPage (s pathPrefix s "settings") + , Parser.map OpenDetailPage (s pathPrefix s "open" string) + ] + + +fromUrl : Url -> Maybe Page +fromUrl url = + Parser.parse parser url + + +loginPageOAuthQuery : Query.Parser Bool +loginPageOAuthQuery = + Query.map Util.Maybe.nonEmpty (Query.string "oauth") + + +loginPageReferrerQuery : Query.Parser (Maybe String) +loginPageReferrerQuery = + Query.string "r" + + +loginPageParser : Query.Parser ( Maybe String, Bool ) +loginPageParser = + Query.map2 Tuple.pair loginPageReferrerQuery loginPageOAuthQuery diff --git a/modules/webapp/src/main/elm/Page/Account/Data.elm b/modules/webapp/src/main/elm/Page/Account/Data.elm new file mode 100644 index 00000000..86338532 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Account/Data.elm @@ -0,0 +1,43 @@ +module Page.Account.Data exposing + ( Model + , Msg(..) + , emptyModel + ) + +import Api.Model.AccountDetail exposing (AccountDetail) +import Api.Model.AccountList exposing (AccountList) +import Api.Model.BasicResult exposing (BasicResult) +import Comp.AccountForm +import Comp.AccountTable +import Http + + +type alias Model = + { selected : Maybe AccountDetail + , searchResult : List AccountDetail + , query : String + , tableModel : Comp.AccountTable.Model + , formModel : Comp.AccountForm.Model + , saveResult : Maybe BasicResult + } + + +emptyModel : Model +emptyModel = + { selected = Nothing + , searchResult = [] + , query = "" + , saveResult = Nothing + , tableModel = Comp.AccountTable.init + , formModel = Comp.AccountForm.initNew + } + + +type Msg + = Init (Maybe String) + | SearchResp (Result Http.Error AccountList) + | LoadResp (Result Http.Error AccountDetail) + | SetQuery String + | AccountTableMsg Comp.AccountTable.Msg + | AccountFormMsg Comp.AccountForm.Msg + | SaveResp (Result Http.Error BasicResult) diff --git a/modules/webapp/src/main/elm/Page/Account/Update.elm b/modules/webapp/src/main/elm/Page/Account/Update.elm new file mode 100644 index 00000000..725c6de6 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Account/Update.elm @@ -0,0 +1,120 @@ +module Page.Account.Update exposing (update) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Browser.Navigation as Nav +import Comp.AccountForm exposing (FormAction(..)) +import Comp.AccountTable +import Data.Flags exposing (Flags) +import Page exposing (Page(..)) +import Page.Account.Data exposing (Model, Msg(..)) +import Util.Http + + +update : Nav.Key -> Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update key flags msg model = + case msg of + Init (Just id) -> + let + current = + Maybe.map .id model.selected + |> Maybe.map ((==) id) + |> Maybe.withDefault False + in + if id == "new" then + ( { model + | selected = Nothing + , formModel = Comp.AccountForm.initNew + } + , Cmd.none + ) + + else if current then + ( model, Cmd.none ) + + else + ( model, Api.loadAccount flags id LoadResp ) + + Init Nothing -> + ( { model + | selected = Nothing + , formModel = Comp.AccountForm.initNew + } + , Api.listAccounts flags model.query SearchResp + ) + + SearchResp (Ok list) -> + ( { model | searchResult = list.items }, Cmd.none ) + + SearchResp (Err err) -> + ( model, Cmd.none ) + + LoadResp (Ok acc) -> + ( { model + | selected = Just acc + , formModel = Comp.AccountForm.initModify acc + } + , Cmd.none + ) + + LoadResp (Err err) -> + ( model, Cmd.none ) + + SetQuery str -> + ( { model | query = str } + , Api.listAccounts flags str SearchResp + ) + + AccountTableMsg lmsg -> + let + ( m, sel ) = + Comp.AccountTable.update lmsg model.tableModel + + cmd = + Page.set key (AccountPage (Maybe.map .id sel)) + in + ( { model + | tableModel = m + , selected = sel + , formModel = Comp.AccountForm.init sel + } + , cmd + ) + + AccountFormMsg lmsg -> + let + ( m, action ) = + Comp.AccountForm.update lmsg model.formModel + + cmd = + case action of + FormCreated ac -> + Api.createAccount flags ac SaveResp + + FormModified id am -> + Api.modifyAccount flags id am SaveResp + + FormCancelled -> + Page.set key (AccountPage Nothing) + + FormNone -> + Cmd.none + in + ( { model + | formModel = m + , saveResult = Nothing + } + , cmd + ) + + SaveResp (Ok r) -> + ( { model | saveResult = Just r }, Cmd.none ) + + SaveResp (Err err) -> + let + errmsg = + Util.Http.errorToString err + in + ( { model | saveResult = Just <| BasicResult False errmsg } + , Cmd.none + ) diff --git a/modules/webapp/src/main/elm/Page/Account/View.elm b/modules/webapp/src/main/elm/Page/Account/View.elm new file mode 100644 index 00000000..fa242002 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Account/View.elm @@ -0,0 +1,102 @@ +module Page.Account.View exposing (view) + +import Api.Model.AccountDetail exposing (AccountDetail) +import Api.Model.BasicResult exposing (BasicResult) +import Comp.AccountForm +import Comp.AccountTable +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onInput) +import Page exposing (Page(..)) +import Page.Account.Data exposing (Model, Msg(..)) +import Util.Html + + +view : Maybe String -> Model -> Html Msg +view id model = + div + [ classList + [ ( "ui container account-page", True ) + , ( "text", id /= Nothing ) + ] + ] + <| + case model.selected of + Just acc -> + viewModify model acc + + Nothing -> + if id == Just "new" then + viewCreate model + + else + viewList model + + +viewCreate : Model -> List (Html Msg) +viewCreate model = + [ h1 [ class "ui dividing header" ] + [ i [ class "ui user circle outline icon" ] [] + , text "Create a new internal account" + ] + , div [ class "" ] + [ Html.map AccountFormMsg (Comp.AccountForm.view model.formModel) + ] + , Maybe.map Util.Html.resultMsg model.saveResult + |> Maybe.withDefault Util.Html.noElement + ] + + +viewModify : Model -> AccountDetail -> List (Html Msg) +viewModify model acc = + [ h1 [ class "ui dividing header" ] + [ i [ class "ui user circle icon" ] [] + , text acc.login + ] + , div [ class "" ] + [ Html.map AccountFormMsg (Comp.AccountForm.view model.formModel) + ] + , Maybe.map Util.Html.resultMsg model.saveResult + |> Maybe.withDefault Util.Html.noElement + ] + + +viewList : Model -> List (Html Msg) +viewList model = + [ h1 [ class "ui dividing header" ] + [ i [ class "ui users icon" ] [] + , text "Accounts" + ] + , searchArea model + , Html.map AccountTableMsg (Comp.AccountTable.view model.searchResult model.tableModel) + ] + + +searchArea : Model -> Html Msg +searchArea model = + div [ class "ui secondary menu" ] + [ div [ class "ui container" ] + [ div [ class "fitted-item" ] + [ div [ class "ui icon input" ] + [ input + [ type_ "text" + , onInput SetQuery + , placeholder "Search…" + ] + [] + , i [ class "ui search icon" ] + [] + ] + ] + , div [ class "right menu" ] + [ div [ class "fitted-item" ] + [ a + [ class "ui primary button" + , Page.href (AccountPage (Just "new")) + ] + [ text "New Account" + ] + ] + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Page/Alias/Data.elm b/modules/webapp/src/main/elm/Page/Alias/Data.elm new file mode 100644 index 00000000..136f3419 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Alias/Data.elm @@ -0,0 +1,48 @@ +module Page.Alias.Data exposing (Model, Msg(..), emptyModel) + +import Api.Model.AliasDetail exposing (AliasDetail) +import Api.Model.AliasList exposing (AliasList) +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.IdResult exposing (IdResult) +import Api.Model.MailTemplate exposing (MailTemplate) +import Comp.AliasForm +import Comp.AliasTable +import Comp.MailSend +import Data.Flags exposing (Flags) +import Http + + +type alias Model = + { selected : Maybe AliasDetail + , searchResult : List AliasDetail + , query : String + , tableModel : Comp.AliasTable.Model + , formModel : Comp.AliasForm.Model + , saveResult : Maybe BasicResult + , mailForm : Maybe Comp.MailSend.Model + } + + +emptyModel : Flags -> Model +emptyModel flags = + { selected = Nothing + , searchResult = [] + , query = "" + , tableModel = Comp.AliasTable.init + , formModel = Comp.AliasForm.initNew flags + , saveResult = Nothing + , mailForm = Nothing + } + + +type Msg + = Init (Maybe String) + | SearchResp (Result Http.Error AliasList) + | LoadResp (Result Http.Error AliasDetail) + | SetQuery String + | AliasTableMsg Comp.AliasTable.Msg + | AliasFormMsg Comp.AliasForm.Msg + | SaveResp (Result Http.Error IdResult) + | DeleteResp (Result Http.Error BasicResult) + | MailFormMsg Comp.MailSend.Msg + | InitMail diff --git a/modules/webapp/src/main/elm/Page/Alias/Update.elm b/modules/webapp/src/main/elm/Page/Alias/Update.elm new file mode 100644 index 00000000..b6d49ef7 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Alias/Update.elm @@ -0,0 +1,190 @@ +module Page.Alias.Update exposing (update) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Browser.Navigation as Nav +import Comp.AliasForm exposing (FormAction(..)) +import Comp.AliasTable +import Comp.MailSend +import Data.Flags exposing (Flags) +import Page exposing (Page(..)) +import Page.Alias.Data exposing (Model, Msg(..)) +import Util.Http + + +update : Nav.Key -> Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update key flags msg model = + case msg of + Init (Just id) -> + let + current = + Maybe.map .id model.selected + |> Maybe.map ((==) id) + |> Maybe.withDefault False + in + if id == "new" then + ( { model + | selected = Nothing + , formModel = Comp.AliasForm.initNew flags + } + , Cmd.none + ) + + else if current then + ( model, Cmd.none ) + + else + ( model, Api.getAlias flags id LoadResp ) + + Init Nothing -> + ( { model + | selected = Nothing + , formModel = Comp.AliasForm.initNew flags + } + , Api.listAlias flags model.query SearchResp + ) + + SearchResp (Ok list) -> + ( { model | searchResult = list.items }, Cmd.none ) + + SearchResp (Err err) -> + ( { model | saveResult = Just <| BasicResult False (Util.Http.errorToString err) } + , Cmd.none + ) + + LoadResp (Ok alias_) -> + ( { model + | selected = Just alias_ + , formModel = Comp.AliasForm.initModify flags alias_ + } + , Cmd.none + ) + + LoadResp (Err err) -> + ( model, Cmd.none ) + + SetQuery str -> + ( { model | query = str } + , Api.listAlias flags str SearchResp + ) + + AliasTableMsg lmsg -> + let + ( m, sel ) = + Comp.AliasTable.update lmsg model.tableModel + + cmd = + Page.set key (AliasPage (Maybe.map .id sel)) + in + ( { model + | tableModel = m + , selected = sel + , formModel = Comp.AliasForm.init flags sel + } + , cmd + ) + + AliasFormMsg lmsg -> + let + ( m, action ) = + Comp.AliasForm.update lmsg model.formModel + + cmd = + case action of + FormCreated ac -> + Api.createAlias flags ac SaveResp + + FormModified id am -> + Api.modifyAlias flags id am SaveResp + + FormCancelled -> + Page.set key (AliasPage Nothing) + + FormDelete id -> + Api.deleteAlias flags id DeleteResp + + FormNone -> + Cmd.none + in + ( { model + | formModel = m + , saveResult = Nothing + } + , cmd + ) + + SaveResp (Ok r) -> + ( { model | saveResult = Just <| BasicResult r.success r.message } + , if Maybe.map .id model.selected /= Just r.id && r.success then + Page.goto (AliasPage (Just r.id)) + + else + Cmd.none + ) + + SaveResp (Err err) -> + let + errmsg = + Util.Http.errorToString err + in + ( { model | saveResult = Just <| BasicResult False errmsg } + , Cmd.none + ) + + DeleteResp (Ok r) -> + ( { model | saveResult = Just r } + , if r.success then + Page.goto (AliasPage Nothing) + + else + Cmd.none + ) + + DeleteResp (Err err) -> + let + errmsg = + Util.Http.errorToString err + in + ( { model | saveResult = Just <| BasicResult False errmsg } + , Cmd.none + ) + + MailFormMsg lmsg -> + case model.mailForm of + Nothing -> + ( model, Cmd.none ) + + Just msm -> + let + ( mm, act ) = + Comp.MailSend.update flags lmsg msm + in + case act of + Comp.MailSend.Run c -> + ( { model | mailForm = Just mm }, Cmd.map MailFormMsg c ) + + Comp.MailSend.Cancelled -> + ( { model | mailForm = Nothing } + , Cmd.none + ) + + Comp.MailSend.Sent -> + ( { model | mailForm = Nothing } + , Cmd.none + ) + + InitMail -> + let + aliasId = + Maybe.map .id model.selected + |> Maybe.withDefault "" + + getTpl = + Api.getAliasTemplate flags aliasId + + ( mm, mc ) = + Comp.MailSend.init getTpl + in + ( { model | mailForm = Just mm } + , Cmd.map MailFormMsg mc + ) diff --git a/modules/webapp/src/main/elm/Page/Alias/View.elm b/modules/webapp/src/main/elm/Page/Alias/View.elm new file mode 100644 index 00000000..4c3d17c0 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Alias/View.elm @@ -0,0 +1,173 @@ +module Page.Alias.View exposing (view) + +import Api.Model.AliasDetail exposing (AliasDetail) +import Comp.AliasForm +import Comp.AliasTable +import Comp.MailSend +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Page exposing (Page(..)) +import Page.Alias.Data exposing (Model, Msg(..)) +import QRCode +import Util.Html + + +view : Flags -> Maybe String -> Model -> Html Msg +view flags id model = + div + [ classList + [ ( "ui container alias-page", True ) + , ( "text", id /= Nothing ) + , ( "one column grid", model.selected /= Nothing ) + ] + ] + <| + case model.selected of + Just alias_ -> + viewModify flags model alias_ + + Nothing -> + if id == Just "new" then + viewCreate model + + else + viewList model + + +viewCreate : Model -> List (Html Msg) +viewCreate model = + [ h1 [ class "ui dividing header" ] + [ i [ class "ui upload icon" ] [] + , text "Create New Alias Page" + ] + , Html.map AliasFormMsg (Comp.AliasForm.view model.formModel) + , Maybe.map Util.Html.resultMsg model.saveResult + |> Maybe.withDefault Util.Html.noElement + ] + + +viewModify : Flags -> Model -> AliasDetail -> List (Html Msg) +viewModify flags model alias_ = + [ div [ class "row" ] + [ div [ class "column" ] + [ h1 [ class "ui dividing header" ] + [ i [ class "ui upload icon" ] [] + , text "Alias Page: " + , text alias_.name + ] + , Html.map AliasFormMsg (Comp.AliasForm.view model.formModel) + , Maybe.map Util.Html.resultMsg model.saveResult + |> Maybe.withDefault Util.Html.noElement + ] + ] + , div [ class "row" ] + [ div [ class "column" ] + [ shareText flags model alias_ + ] + ] + ] + + +viewList : Model -> List (Html Msg) +viewList model = + [ h1 [ class "ui dividing header" ] + [ i [ class "ui users icon" ] [] + , text "Alias Pages" + ] + , searchArea model + , Html.map AliasTableMsg (Comp.AliasTable.view model.searchResult model.tableModel) + ] + + +searchArea : Model -> Html Msg +searchArea model = + div [ class "ui secondary menu" ] + [ div [ class "ui container" ] + [ div [ class "fitted-item" ] + [ div [ class "ui icon input" ] + [ input + [ type_ "text" + , onInput SetQuery + , placeholder "Search…" + ] + [] + , i [ class "ui search icon" ] + [] + ] + ] + , div [ class "right menu" ] + [ div [ class "fitted-item" ] + [ a + [ class "ui primary button" + , Page.href (AliasPage (Just "new")) + ] + [ text "New Alias Page" + ] + ] + ] + ] + ] + + +qrCodeView : String -> Html msg +qrCodeView message = + QRCode.encode message + |> Result.map QRCode.toSvg + |> Result.withDefault + (Html.text "Error while encoding to QRCode.") + + +shareText : Flags -> Model -> AliasDetail -> Html Msg +shareText flags model alias_ = + let + url = + flags.config.baseUrl ++ Page.pageToString (OpenSharePage alias_.id) + in + div [ class "segments" ] + [ div [ class "ui top attached header segment" ] + [ text "Share this link" + ] + , div [ class "ui attached message segment" ] + [ text "The alias page is now at: " + , pre [ class "url" ] + [ code [] + [ text url + ] + ] + , text "You can share this URL with others to receive files from them." + ] + , case model.mailForm of + Just msm -> + Html.map MailFormMsg (Comp.MailSend.view [ ( "ui bottom attached segment", True ) ] msm) + + Nothing -> + shareInfo flags model url + ] + + +shareInfo : Flags -> Model -> String -> Html Msg +shareInfo flags model url = + div [ class "ui bottom attached segment" ] + [ div [ class "ui two column stackable center aligned grid" ] + [ div [ class "ui vertical divider" ] [ text "Or" ] + , div [ class "middle aligned row" ] + [ div [ class "column" ] + [ qrCodeView url + ] + , div [ class "column" ] + [ a + [ classList + [ ( "ui primary button", True ) + , ( "disabled", not flags.config.mailEnabled ) + ] + , onClick InitMail + , href "#" + ] + [ text "Send E-Mail" + ] + ] + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Page/Detail/Data.elm b/modules/webapp/src/main/elm/Page/Detail/Data.elm new file mode 100644 index 00000000..8da6f4e0 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Detail/Data.elm @@ -0,0 +1,222 @@ +module Page.Detail.Data exposing + ( EditField(..) + , LoaderModel + , Model + , Msg(..) + , Property(..) + , PublishState(..) + , TopMenuState(..) + , deleteLoader + , emptyModel + , getLoader + , isEdit + , isPublished + , mkEditField + , noLoader + ) + +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.ShareDetail exposing (ShareDetail) +import Api.Model.ShareFile exposing (ShareFile) +import Comp.Dropzone2 +import Comp.IntInput +import Comp.MailSend +import Comp.MarkdownInput +import Comp.PasswordInput +import Comp.ShareFileList +import Comp.ValidityField +import Comp.YesNoDimmer +import Data.Flags exposing (Flags) +import Data.UploadDict exposing (UploadDict) +import Data.UploadState exposing (UploadState) +import Data.ValidityValue exposing (ValidityValue) +import Http + + +type alias Model = + { share : ShareDetail + , topMenu : TopMenuState + , fileListModel : Comp.ShareFileList.Model + , message : Maybe BasicResult + , fileView : Comp.ShareFileList.ViewMode + , zoom : Maybe ShareFile + , yesNoModel : Comp.YesNoDimmer.Model + , descEdit : Maybe ( Comp.MarkdownInput.Model, String ) + , editField : Maybe ( Property, EditField ) + , dropzone : Comp.Dropzone2.Model + , uploads : UploadDict + , addFilesOpen : Bool + , uploading : Bool + , uploadPaused : Bool + , uploadFormState : BasicResult + , loader : LoaderModel + , mailForm : Maybe Comp.MailSend.Model + } + + +type TopMenuState + = TopClosed + | TopDetail + | TopShare + + +type PublishState + = Unpublished + | PublishOk + | PublishExpired + | MaxViewsExceeded + + +type Property + = Name + | MaxViews + | Validity + | Password + + +type alias LoaderModel = + { active : Bool + , message : String + } + + +type EditField + = EditName (Maybe String) + | EditMaxViews ( Comp.IntInput.Model, Maybe Int ) + | EditValidity ( Comp.ValidityField.Model, ValidityValue ) + | EditPassword ( Comp.PasswordInput.Model, Maybe String ) + + +emptyModel : Model +emptyModel = + { share = Api.Model.ShareDetail.empty + , topMenu = TopClosed + , fileListModel = Comp.ShareFileList.init + , message = Nothing + , fileView = Comp.ShareFileList.ViewList + , zoom = Nothing + , yesNoModel = Comp.YesNoDimmer.emptyModel + , descEdit = Nothing + , editField = Nothing + , dropzone = Comp.Dropzone2.init + , uploads = Data.UploadDict.empty + , addFilesOpen = False + , uploading = False + , uploadPaused = True + , uploadFormState = BasicResult True "" + , loader = noLoader + , mailForm = Nothing + } + + +deleteLoader : LoaderModel +deleteLoader = + { active = True + , message = "Deleting share. Please wait." + } + + +getLoader : LoaderModel +getLoader = + { active = True + , message = "Loading data..." + } + + +noLoader : LoaderModel +noLoader = + { active = False + , message = "" + } + + +mkEditField : Flags -> Model -> Property -> EditField +mkEditField flags model prop = + case prop of + Name -> + EditName model.share.name + + MaxViews -> + EditMaxViews + ( Comp.IntInput.init (Just 1) Nothing + , Just model.share.maxViews + ) + + Validity -> + EditValidity + ( Comp.ValidityField.init flags + , Data.ValidityValue.Millis model.share.validity + ) + + Password -> + EditPassword + ( Comp.PasswordInput.init + , Nothing + ) + + +isEdit : Model -> Property -> Maybe EditField +isEdit model prop = + Maybe.andThen + (\t -> + if Tuple.first t == prop then + Just (Tuple.second t) + + else + Nothing + ) + model.editField + + +type Msg + = Init String + | DetailResp (Result Http.Error ShareDetail) + | SetTopMenu TopMenuState + | PublishShare Bool + | BasicResp (Result Http.Error BasicResult) + | FileListMsg Comp.ShareFileList.Msg + | SetFileView Comp.ShareFileList.ViewMode + | QuitZoom + | SetZoom ShareFile + | RequestDelete + | YesNoMsg Comp.YesNoDimmer.Msg + | DeleteResp (Result Http.Error BasicResult) + | ToggleEditDesc + | DescEditMsg Comp.MarkdownInput.Msg + | SaveDescription + | ReqEdit Property + | SetName String + | MaxViewMsg Comp.IntInput.Msg + | ValidityEditMsg Comp.ValidityField.Msg + | PasswordEditMsg Comp.PasswordInput.Msg + | SaveEdit + | CancelEdit + | ToggleFilesMenu + | DropzoneMsg Comp.Dropzone2.Msg + | ResetFileForm + | SubmitFiles + | Uploading UploadState + | UploadStopped (Maybe String) + | StartStopUpload + | MailFormMsg Comp.MailSend.Msg + | InitMail + + +isPublished : ShareDetail -> PublishState +isPublished share = + case share.publishInfo of + Nothing -> + Unpublished + + Just info -> + if not info.enabled then + Unpublished + + else if info.expired then + PublishExpired + + else if info.views >= share.maxViews then + MaxViewsExceeded + + else + PublishOk diff --git a/modules/webapp/src/main/elm/Page/Detail/Update.elm b/modules/webapp/src/main/elm/Page/Detail/Update.elm new file mode 100644 index 00000000..2784e298 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Detail/Update.elm @@ -0,0 +1,508 @@ +module Page.Detail.Update exposing (update) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.PublishData exposing (PublishData) +import Comp.Dropzone2 +import Comp.IntInput +import Comp.MailSend +import Comp.MarkdownInput +import Comp.PasswordInput +import Comp.ShareFileList +import Comp.ValidityField +import Comp.YesNoDimmer +import Data.Flags exposing (Flags) +import Data.UploadData exposing (UploadData) +import Data.UploadDict +import Data.UploadState exposing (UploadState) +import Data.ValidityValue +import Page exposing (Page(..)) +import Page.Detail.Data + exposing + ( EditField(..) + , LoaderModel + , Model + , Msg(..) + , PublishState(..) + , TopMenuState(..) + , deleteLoader + , getLoader + , isEdit + , isPublished + , mkEditField + , noLoader + ) +import Ports +import Util.Http +import Util.Maybe +import Util.Share + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + case msg of + Init id -> + ( { model | loader = getLoader }, Api.getShare flags id DetailResp ) + + DetailResp (Ok details) -> + ( { model + | share = details + , message = Nothing + , descEdit = Nothing + , loader = noLoader + } + , Cmd.none + ) + + DetailResp (Err err) -> + let + m = + Util.Http.errorToString err + in + ( { model + | message = Just (BasicResult False m) + , loader = noLoader + } + , Cmd.none + ) + + SetTopMenu state -> + let + newState = + if model.topMenu == state then + TopClosed + + else + state + in + ( { model + | topMenu = newState + , descEdit = Nothing + , message = Nothing + } + , Cmd.none + ) + + PublishShare flag -> + let + cmd = + case isPublished model.share of + Unpublished -> + Api.publishShare flags model.share.id (PublishData flag) BasicResp + + _ -> + Api.unpublishShare flags model.share.id BasicResp + in + ( model, cmd ) + + BasicResp (Ok res) -> + if res.success then + update flags (Init model.share.id) model + + else + ( { model | message = Just res }, Cmd.none ) + + BasicResp (Err err) -> + let + m = + Util.Http.errorToString err + in + ( { model | message = Just (BasicResult False m) } + , Cmd.none + ) + + FileListMsg lmsg -> + let + ( m, action ) = + Comp.ShareFileList.update lmsg model.fileListModel + in + case action of + Comp.ShareFileList.FileClick sf -> + ( { model | fileListModel = m, zoom = Just sf } + , Ports.scrollTop () + ) + + Comp.ShareFileList.FileDelete sf -> + ( { model | fileListModel = m, zoom = Nothing } + , Api.deleteFile flags model.share.id sf.id BasicResp + ) + + Comp.ShareFileList.FileNone -> + ( { model | fileListModel = m }, Cmd.none ) + + SetFileView mode -> + ( { model + | fileView = mode + , fileListModel = Comp.ShareFileList.reset model.fileListModel + } + , Cmd.none + ) + + QuitZoom -> + case model.zoom of + Just file -> + ( { model | zoom = Nothing }, Ports.scrollToElem file.id ) + + Nothing -> + ( { model | zoom = Nothing }, Cmd.none ) + + SetZoom sf -> + ( { model | zoom = Just sf }, Cmd.none ) + + RequestDelete -> + ( { model + | yesNoModel = Comp.YesNoDimmer.activate model.yesNoModel + } + , Cmd.none + ) + + YesNoMsg lmsg -> + let + ( m, flag ) = + Comp.YesNoDimmer.update lmsg model.yesNoModel + + cmd = + if flag then + Api.deleteShare flags model.share.id DeleteResp + + else + Cmd.none + + loading = + if flag then + deleteLoader + + else + noLoader + in + ( { model | yesNoModel = m, loader = loading }, cmd ) + + DeleteResp (Ok res) -> + if res.success then + ( { model | loader = noLoader }, Page.goto UploadPage ) + + else + ( { model | message = Just res, loader = noLoader }, Cmd.none ) + + DeleteResp (Err err) -> + let + m = + Util.Http.errorToString err + in + ( { model | message = Just (BasicResult False m), loader = noLoader } + , Cmd.none + ) + + ToggleEditDesc -> + case model.descEdit of + Just _ -> + ( { model | descEdit = Nothing }, Cmd.none ) + + Nothing -> + ( { model + | descEdit = + Just + ( Comp.MarkdownInput.init + , Maybe.withDefault "" model.share.descriptionRaw + ) + , topMenu = TopClosed + } + , Cmd.none + ) + + DescEditMsg lmsg -> + case model.descEdit of + Just ( dm, _ ) -> + let + txt = + Maybe.withDefault "" model.share.descriptionRaw + + ( m, str ) = + Comp.MarkdownInput.update txt lmsg dm + in + ( { model | descEdit = Just ( m, str ) } + , Cmd.none + ) + + Nothing -> + ( model, Cmd.none ) + + SaveDescription -> + case model.descEdit of + Just ( dm, str ) -> + ( model, Api.setDescription flags model.share.id str BasicResp ) + + Nothing -> + ( model, Cmd.none ) + + ReqEdit prop -> + let + next = + if isEdit model prop /= Nothing then + Nothing + + else + Just ( prop, mkEditField flags model prop ) + in + ( { model | editField = next }, Cmd.none ) + + SetName str -> + case model.editField of + Just ( p, EditName _ ) -> + ( { model | editField = Just ( p, EditName (Util.Maybe.fromString str) ) } + , Cmd.none + ) + + _ -> + ( model, Cmd.none ) + + MaxViewMsg lmsg -> + case model.editField of + Just ( p, EditMaxViews ( im, c ) ) -> + let + ( m, mi ) = + Comp.IntInput.update lmsg im + in + ( { model | editField = Just ( p, EditMaxViews ( m, mi ) ) } + , Cmd.none + ) + + _ -> + ( model, Cmd.none ) + + ValidityEditMsg lmsg -> + case model.editField of + Just ( p, EditValidity ( m, v ) ) -> + let + ( nm, nv ) = + Comp.ValidityField.update lmsg m + + dv = + Maybe.withDefault v nv + in + ( { model | editField = Just ( p, EditValidity ( nm, dv ) ) } + , Cmd.none + ) + + _ -> + ( model, Cmd.none ) + + PasswordEditMsg lmsg -> + case model.editField of + Just ( p, EditPassword ( m, _ ) ) -> + let + ( nm, nv ) = + Comp.PasswordInput.update lmsg m + in + ( { model | editField = Just ( p, EditPassword ( nm, nv ) ) } + , Cmd.none + ) + + _ -> + ( model, Cmd.none ) + + CancelEdit -> + ( { model | editField = Nothing }, Cmd.none ) + + SaveEdit -> + let + nm = + { model | editField = Nothing } + in + case model.editField of + Just ( p, EditName name ) -> + ( nm, Api.setName flags model.share.id name BasicResp ) + + Just ( p, EditMaxViews ( _, Just value ) ) -> + ( nm, Api.setMaxViews flags model.share.id value BasicResp ) + + Just ( p, EditMaxViews ( _, Nothing ) ) -> + ( nm, Cmd.none ) + + Just ( p, EditValidity ( _, value ) ) -> + ( nm + , Api.setValidity flags + model.share.id + (Data.ValidityValue.toMillis value) + BasicResp + ) + + Just ( p, EditPassword ( _, pw ) ) -> + ( nm, Api.setPassword flags model.share.id pw BasicResp ) + + Nothing -> + ( nm, Cmd.none ) + + ToggleFilesMenu -> + ( { model | addFilesOpen = not model.addFilesOpen } + , Cmd.none + ) + + DropzoneMsg lmsg -> + let + ( m, c, fs ) = + Comp.Dropzone2.update model.uploads.selectedFiles lmsg model.dropzone + in + ( { model + | dropzone = m + , uploads = Data.UploadDict.updateFiles model.uploads fs + , uploadFormState = BasicResult True "" + } + , Cmd.batch [ Cmd.map DropzoneMsg c ] + ) + + ResetFileForm -> + ( { model + | dropzone = Comp.Dropzone2.init + , uploads = Data.UploadDict.empty + , uploading = False + , uploadFormState = BasicResult True "" + } + , Cmd.none + ) + + SubmitFiles -> + let + ( native, _ ) = + List.unzip model.uploads.selectedFiles + + uploadUrl = + flags.config.baseUrl ++ "/api/v2/sec/upload/" ++ model.share.id ++ "/files/tus" + + submit = + if native == [] then + Cmd.none + + else + UploadData uploadUrl model.share.id native Nothing + |> Data.UploadData.encode + |> Ports.submitFiles + + valid = + Util.Share.validate flags + (Just model.share) + { descField = "", uploads = model.uploads } + in + if native == [] then + ( model, Cmd.none ) + + else if valid.success then + ( { model | uploading = True, uploadFormState = BasicResult True "" }, submit ) + + else + ( { model | uploadFormState = valid }, Cmd.none ) + + Uploading state -> + if state.id == model.share.id then + let + ( nm, nc ) = + trackUpload model state + + ( _, err ) = + Data.UploadDict.countDone nm.uploads + + rm = + { nm + | dropzone = Comp.Dropzone2.init + , uploads = Data.UploadDict.empty + , uploading = False + } + + ( im, ic ) = + update flags (Init model.share.id) rm + in + if Data.UploadDict.allDone nm.uploads then + if err == 0 then + ( im, Cmd.batch [ nc, ic ] ) + + else + ( rm, nc ) + + else + ( nm, nc ) + + else + ( model, Cmd.none ) + + UploadStopped err -> + ( { model | uploadPaused = err == Nothing }, Cmd.none ) + + StartStopUpload -> + ( model + , if model.uploadPaused then + Ports.startUpload model.share.id + + else + Ports.stopUpload model.share.id + ) + + MailFormMsg lmsg -> + case model.mailForm of + Nothing -> + ( model, Cmd.none ) + + Just msm -> + let + ( mm, act ) = + Comp.MailSend.update flags lmsg msm + in + case act of + Comp.MailSend.Run c -> + ( { model | mailForm = Just mm }, Cmd.map MailFormMsg c ) + + Comp.MailSend.Cancelled -> + ( { model | mailForm = Nothing } + , Cmd.none + ) + + Comp.MailSend.Sent -> + ( { model | mailForm = Nothing } + , Cmd.none + ) + + InitMail -> + let + getTpl = + Api.getShareTemplate flags model.share.id + + ( mm, mc ) = + Comp.MailSend.init getTpl + in + ( { model | mailForm = Just mm } + , Cmd.map MailFormMsg mc + ) + + +trackUpload : Model -> UploadState -> ( Model, Cmd Msg ) +trackUpload model state = + let + ( next, progress ) = + Data.UploadDict.trackUpload model.uploads state + + progressCmd p = + case p of + Data.UploadDict.FileProgress index perc -> + [ ( "file-progress-" ++ String.fromInt index + , perc + ) + ] + + Data.UploadDict.AllProgress perc -> + [ ( "all-progress", perc ) + ] + + infoMsg = + case state.state of + Data.UploadState.Failed em -> + BasicResult False em + + _ -> + model.uploadFormState + in + ( { model + | uploads = next + , uploadPaused = False + , uploadFormState = infoMsg + } + , Ports.setProgress (List.concatMap progressCmd progress) + ) diff --git a/modules/webapp/src/main/elm/Page/Detail/View.elm b/modules/webapp/src/main/elm/Page/Detail/View.elm new file mode 100644 index 00000000..800695cd --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Detail/View.elm @@ -0,0 +1,731 @@ +module Page.Detail.View exposing (view) + +import Api +import Api.Model.ShareDetail exposing (ShareDetail) +import Comp.Dropzone2 +import Comp.IntInput +import Comp.MailSend +import Comp.MarkdownInput +import Comp.PasswordInput +import Comp.ShareFileList exposing (ViewMode(..)) +import Comp.ValidityField +import Comp.YesNoDimmer +import Comp.Zoom +import Data.Flags exposing (Flags) +import Data.ValidityOptions +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Markdown +import Page exposing (Page(..)) +import Page.Detail.Data + exposing + ( EditField(..) + , Model + , Msg(..) + , Property(..) + , PublishState(..) + , TopMenuState(..) + , isEdit + , isPublished + ) +import QRCode +import Util.Html +import Util.Share +import Util.Size +import Util.Time + + +view : Flags -> Model -> Html Msg +view flags model = + let + ( head, desc ) = + Util.Share.splitDescription model.share + in + div [ class "ui grid container detail-page" ] + [ Comp.Zoom.view (Api.fileSecUrl flags model.share.id) model SetZoom QuitZoom + , deleteLoader model + , div [ class "row" ] + [ div [ class "sixteen wide column" ] + ([ Markdown.toHtml [] head + , topMenu model + ] + ++ shareProps model + ++ shareLink flags model + ++ [ messageDiv model + , descriptionView model desc + , middleMenu model + , dropzone flags model + , fileList flags model + ] + ) + ] + ] + + +descriptionView : Model -> String -> Html Msg +descriptionView model desc = + case model.descEdit of + Just ( dm, str ) -> + div [ class "ui form" ] + [ Html.map DescEditMsg + (Comp.MarkdownInput.view str dm) + , div [ class "ui secondary menu" ] + [ a + [ class "link item" + , onClick SaveDescription + , href "#" + ] + [ i [ class "disk icon" ] [] + , text "Save" + ] + ] + ] + + Nothing -> + Markdown.toHtml [ class "share-description ui basic segment" ] desc + + +fileList : Flags -> Model -> Html Msg +fileList flags model = + let + sett = + Comp.ShareFileList.Settings + (Api.fileSecUrl flags model.share.id "") + model.fileView + True + + sorted = + List.sortBy .filename model.share.files + in + Html.map FileListMsg <| + Comp.ShareFileList.view sett sorted model.fileListModel + + +shareLink : Flags -> Model -> List (Html Msg) +shareLink flags model = + case isPublished model.share of + Unpublished -> + shareLinkNotPublished model + + PublishOk -> + shareLinkPublished flags model + + PublishExpired -> + shareLinkExpired model + + MaxViewsExceeded -> + shareLinkMaxViewsExeeded model + + +shareLinkMaxViewsExeeded : Model -> List (Html Msg) +shareLinkMaxViewsExeeded model = + [ div + [ classList + [ ( "invisible", model.topMenu /= TopShare ) + , ( "ui attached warning message segment", True ) + ] + ] + [ text "The share has been published, but its max-views has been reached. You can " + , text "increase this property if you want to have this published for another while." + ] + ] + + +shareLinkNotPublished : Model -> List (Html Msg) +shareLinkNotPublished model = + [ div + [ classList + [ ( "invisible", model.topMenu /= TopShare ) + , ( "ui attached info message segment", True ) + ] + ] + [ text "In order to share this with others, you need to publish " + , text "this share. Then everyone you'll send the generated link " + , text "can access this data." + ] + ] + + +shareLinkExpired : Model -> List (Html Msg) +shareLinkExpired model = + [ div + [ classList + [ ( "invisible", model.topMenu /= TopShare ) + , ( "ui attached warning message segment", True ) + ] + ] + [ text "The share has been published, but it is now expired. You can " + , text "first unpublish and then publish it again." + ] + ] + + +shareLinkPublished : Flags -> Model -> List (Html Msg) +shareLinkPublished flags model = + let + share = + model.share + + pid = + Maybe.map .id share.publishInfo + |> Maybe.withDefault "" + + url = + flags.config.baseUrl ++ Page.pageToString (OpenDetailPage pid) + + qrCodeView : String -> Html msg + qrCodeView message = + QRCode.encode message + |> Result.map QRCode.toSvg + |> Result.withDefault + (Html.text "Error while encoding to QRCode.") + in + [ div + [ classList + [ ( "invisible", model.topMenu /= TopShare ) + , ( "ui attached segment", True ) + ] + ] + [ text "The share is publicly available at" + , pre [ class "url" ] + [ code [] + [ text url + ] + ] + , text "You can share this link to all you'd like to access this data." + ] + , case model.mailForm of + Just mf -> + Html.map MailFormMsg + (Comp.MailSend.view + [ ( "invisible", model.topMenu /= TopShare ) + , ( "ui bottom attached segment", True ) + ] + mf + ) + + Nothing -> + div + [ classList + [ ( "invisible", model.topMenu /= TopShare ) + , ( "ui bottom attached segment", True ) + ] + ] + [ div [ class "ui two column stackable center aligned grid" ] + [ div [ class "ui vertical divider" ] [ text "Or" ] + , div [ class "middle aligned row" ] + [ div [ class "column" ] + [ qrCodeView url + ] + , div [ class "column" ] + [ a + [ classList + [ ( "ui primary button", True ) + , ( "disabled", not flags.config.mailEnabled ) + ] + , href "#" + , onClick InitMail + ] + [ text "Send E-Mail" + ] + ] + ] + ] + ] + ] + + +messageDiv : Model -> Html Msg +messageDiv model = + Util.Html.resultMsgMaybe model.message + + +shareProps : Model -> List (Html Msg) +shareProps model = + let + share = + model.share + + propertyDisplay : String -> String -> List (Html Msg) + propertyDisplay icon content = + [ i [ class icon ] [] + , text content + ] + in + [ div + [ classList + [ ( "invisible", model.topMenu /= TopDetail ) + , ( "ui attached segment", True ) + ] + ] + [ Html.map YesNoMsg (Comp.YesNoDimmer.view model.yesNoModel) + , div [ class "ui stackable two column grid" ] + [ div [ class "column" ] + [ div [ class "ui items" ] + [ property + { label = "Name" + , content = + isEdit model Name + |> Maybe.map propertyEdit + |> Maybe.withDefault + (propertyDisplay "comment outline icon" + (Maybe.withDefault "" share.name) + ) + , editAction = Just (ReqEdit Name) + } + , property + { label = "Validity Time" + , content = + isEdit model Validity + |> Maybe.map propertyEdit + |> Maybe.withDefault + (propertyDisplay "hourglass half icon" + (Data.ValidityOptions.findValidityItemMillis share.validity + |> Tuple.first + ) + ) + , editAction = Just (ReqEdit Validity) + } + , property + { label = "Max. Views" + , content = + isEdit model MaxViews + |> Maybe.map propertyEdit + |> Maybe.withDefault + (propertyDisplay "eye icon" (String.fromInt share.maxViews)) + , editAction = Just (ReqEdit MaxViews) + } + , property + { label = "Password" + , content = + isEdit model Password + |> Maybe.map propertyEdit + |> Maybe.withDefault + (propertyDisplay + (if share.password then + "lock icon" + + else + "unlock icon" + ) + (if share.password then + "Password Protected" + + else + "None" + ) + ) + , editAction = Just (ReqEdit Password) + } + , property + { label = "#/Size" + , content = + propertyDisplay "file icon" + (String.fromInt (List.length model.share.files) + ++ "/" + ++ (List.map .size model.share.files + |> List.sum + |> toFloat + |> Util.Size.bytesReadable Util.Size.B + ) + ) + , editAction = Nothing + } + , property + { label = "Created" + , content = + propertyDisplay "calendar icon" + (Util.Time.formatDateTime share.created) + , editAction = Nothing + } + ] + ] + , div [ class "column" ] + [ div [ class "ui items" ] + [ property + { label = "Alias" + , content = + propertyDisplay "dot circle outline icon" (Maybe.withDefault "-" share.aliasName) + , editAction = Nothing + } + , property + { label = "Published on" + , content = + propertyDisplay (Tuple.first <| publishIconLabel share) + (Maybe.map .publishDate share.publishInfo + |> Maybe.map Util.Time.formatDateTime + |> Maybe.withDefault "-" + ) + , editAction = Nothing + } + , property + { label = "Published until" + , content = + propertyDisplay "hourglass icon" + (Maybe.map .publishUntil share.publishInfo + |> Maybe.map Util.Time.formatDateTime + |> Maybe.withDefault "-" + ) + , editAction = Nothing + } + , property + { label = "Last Access" + , content = + propertyDisplay "calendar outline icon" + (Maybe.andThen .lastAccess share.publishInfo + |> Maybe.map Util.Time.formatDateTime + |> Maybe.withDefault "-" + ) + , editAction = Nothing + } + , property + { label = "Views" + , content = + propertyDisplay "eye icon" + (Maybe.map .views share.publishInfo + |> Maybe.map String.fromInt + |> Maybe.withDefault "-" + ) + , editAction = Nothing + } + ] + ] + ] + ] + , div + [ classList + [ ( "invisible", model.topMenu /= TopDetail ) + , ( "ui bottom attached secondary segment", True ) + ] + ] + [ div [ class "item" ] + [ button + [ type_ "button" + , classList + [ ( "ui secondary button", True ) + , ( "invisible", isPublished share /= Unpublished ) + ] + , onClick (PublishShare False) + ] + [ text "Publish with new Link" + ] + , button + [ type_ "button" + , class "ui red button" + , onClick RequestDelete + ] + [ i [ class "trash icon" ] [] + , text "Delete" + ] + ] + ] + ] + + +property : + { label : String + , content : List (Html Msg) + , editAction : Maybe Msg + } + -> Html Msg +property rec = + div [ class "item" ] + [ div [ class "content" ] + [ div [ class "header" ] <| + rec.content + , div [ class "meta" ] + [ case rec.editAction of + Just msg -> + a + [ class "ui link" + , href "#" + , title "Edit" + , onClick msg + ] + [ i [ class "edit icon" ] [] + , text " " + ] + + Nothing -> + text "" + , text rec.label + ] + ] + ] + + +propertyEdit : EditField -> List (Html Msg) +propertyEdit ef = + let + saveButton = + a + [ class "ui primary icon button" + , href "#" + , onClick SaveEdit + ] + [ i [ class "check icon" ] [] + ] + + cancelButton = + a + [ class "ui secondary icon button" + , href "#" + , onClick CancelEdit + ] + [ i [ class "delete icon" ] [] + ] + in + case ef of + EditName v -> + [ div [ class "ui mini action input" ] + [ input + [ type_ "text" + , placeholder "Name" + , onInput SetName + , Maybe.withDefault "" v |> value + ] + [] + , saveButton + , cancelButton + ] + ] + + EditMaxViews ( im, n ) -> + [ div + [ classList + [ ( "ui mini action input", True ) + , ( "error", n == Nothing ) + ] + ] + [ Html.map MaxViewMsg (Comp.IntInput.view n im) + , saveButton + , cancelButton + ] + ] + + EditValidity ( vm, v ) -> + [ div [ class "ui mini action input" ] + [ Html.map ValidityEditMsg (Comp.ValidityField.view v vm) + , saveButton + , cancelButton + ] + ] + + EditPassword ( pm, p ) -> + [ div [ class "ui mini action input" ] + [ Html.map PasswordEditMsg (Comp.PasswordInput.view p pm) + , saveButton + , cancelButton + ] + ] + + +topMenu : Model -> Html Msg +topMenu model = + let + share = + model.share + + ( publishIcon, label ) = + publishIconLabel share + in + div + [ classList + [ ( "ui pointing menu", True ) + , ( "top attached", model.topMenu /= TopClosed ) + ] + ] + [ topMenuLink model TopDetail "Details" + , topMenuLink model TopShare "Share Link" + , div [ class "right menu" ] + [ a + [ classList + [ ( "icon link item", True ) + , ( "active", model.descEdit /= Nothing ) + ] + , href "#" + , title "Edit description" + , onClick ToggleEditDesc + ] + [ i [ class "ui edit icon" ] [] + ] + , a + [ class "link item" + , href "#" + , onClick (PublishShare True) + ] + [ i [ class publishIcon ] [] + , text label + ] + ] + ] + + +publishIconLabel : ShareDetail -> ( String, String ) +publishIconLabel share = + case isPublished share of + Unpublished -> + ( "circle outline icon", "Publish" ) + + PublishExpired -> + ( "red bolt icon", "Unpublish" ) + + MaxViewsExceeded -> + ( "red bolt icon", "Unpublish" ) + + PublishOk -> + ( "green circle icon", "Unpublish" ) + + +topMenuLink : Model -> TopMenuState -> String -> Html Msg +topMenuLink model state label = + a + [ classList + [ ( "active", model.topMenu == state ) + , ( "link item", True ) + ] + , href "#" + , onClick (SetTopMenu state) + ] + [ text label + ] + + +middleMenu : Model -> Html Msg +middleMenu model = + div + [ classList + [ ( "ui menu", True ) + , ( "attached", model.addFilesOpen ) + ] + ] + [ a + [ classList + [ ( "icon link item", True ) + , ( "active", model.fileView == ViewList ) + ] + , href "#" + , onClick (SetFileView ViewList) + , title "List View" + ] + [ i [ class "ui list icon" ] [] + ] + , a + [ classList + [ ( "icon link item", True ) + , ( "active", model.fileView == ViewCard ) + ] + , href "#" + , onClick (SetFileView ViewCard) + , title "Card View" + ] + [ i [ class "th icon" ] [] + ] + , div [ class "right menu" ] + [ a + [ classList + [ ( "icon link item", True ) + , ( "active", model.addFilesOpen ) + ] + , href "#" + , onClick ToggleFilesMenu + ] + [ i [ class "icons" ] + [ i [ class "file outline icon" ] [] + , i [ class "corner add icon" ] [] + ] + ] + ] + ] + + +dropzone : Flags -> Model -> Html Msg +dropzone flags model = + let + viewSettings = + Comp.Dropzone2.mkViewSettings (not model.uploading) model.uploads + in + div + [ classList + [ ( "ui bottom attached segment", True ) + , ( "hidden invisible", not model.addFilesOpen ) + ] + ] + [ div [ class "ui secondary menu" ] + [ a + [ class "primary item" + , href "#" + , onClick SubmitFiles + ] + [ i [ class "upload icon" ] [] + , text "Submit" + ] + , a + [ class "item" + , href "#" + , onClick ResetFileForm + ] + [ i [ class "undo icon" ] [] + , text "Clear" + ] + , div [ class "right floated menu" ] + [ a + [ classList + [ ( "item", True ) + , ( "disabled", not model.uploading ) + ] + , href "#" + , onClick StartStopUpload + ] + [ i + [ class + (if model.uploadPaused then + "play icon" + + else + "pause icon" + ) + ] + [] + , text + (if model.uploadPaused then + "Resume" + + else + "Pause" + ) + ] + ] + ] + , p [] + [ text "All uploads must not be greater than " + , toFloat flags.config.maxSize + |> Util.Size.bytesReadable Util.Size.B + |> text + , text "." + ] + , div + [ classList + [ ( "ui error message", True ) + , ( "invisible hidden", model.uploadFormState.success ) + ] + ] + [ text model.uploadFormState.message + ] + , Html.map DropzoneMsg (Comp.Dropzone2.view viewSettings model.dropzone) + ] + + +deleteLoader : Model -> Html Msg +deleteLoader model = + div + [ classList + [ ( "ui dimmer", True ) + , ( "active", model.loader.active ) + ] + ] + [ div [ class "ui indeterminate text loader" ] + [ text model.loader.message + ] + ] diff --git a/modules/webapp/src/main/elm/Page/Home/Data.elm b/modules/webapp/src/main/elm/Page/Home/Data.elm new file mode 100644 index 00000000..65b4fce1 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Home/Data.elm @@ -0,0 +1,14 @@ +module Page.Home.Data exposing (..) + + +type alias Model = + {} + + +emptyModel : Model +emptyModel = + {} + + +type Msg + = Dummy diff --git a/modules/webapp/src/main/elm/Page/Home/Update.elm b/modules/webapp/src/main/elm/Page/Home/Update.elm new file mode 100644 index 00000000..30f2c025 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Home/Update.elm @@ -0,0 +1,9 @@ +module Page.Home.Update exposing (update) + +import Data.Flags exposing (Flags) +import Page.Home.Data exposing (..) + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + ( model, Cmd.none ) diff --git a/modules/webapp/src/main/elm/Page/Home/View.elm b/modules/webapp/src/main/elm/Page/Home/View.elm new file mode 100644 index 00000000..facc37f1 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Home/View.elm @@ -0,0 +1,33 @@ +module Page.Home.View exposing (view) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Page exposing (Page(..)) +import Page.Home.Data exposing (Model) + + +view : Model -> Html msg +view model = + div [ class "ui container home-page" ] + [ div [ class "ui red raised placeholder segment" ] + [ h1 [ class "ui icon header" ] + [ i [ class "ui share alternate square icon" ] [] + , text "Share files with others" + ] + , div [ class "inline" ] + [ a + [ class "ui large primary button" + , Page.href SharePage + ] + [ text "Create Share" + ] + , a + [ class "ui large secondary button" + , Page.href UploadPage + ] + [ text "View Shares" + ] + ] + ] + ] diff --git a/modules/webapp/src/main/elm/Page/Info/Data.elm b/modules/webapp/src/main/elm/Page/Info/Data.elm new file mode 100644 index 00000000..2c1eeecc --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Info/Data.elm @@ -0,0 +1,28 @@ +module Page.Info.Data exposing (..) + + +type alias Mesg = + { head : String + , text : String + } + + +type alias Model = + List Mesg + + +emptyModel : Model +emptyModel = + [ { head = "Forbidden" + , text = """ +You don't have enough permission to access this site. +""" + } + , { head = "Expired" + , text = "This resource is expired or doesn't exist." + } + ] + + +type Msg + = Dummy diff --git a/modules/webapp/src/main/elm/Page/Info/Update.elm b/modules/webapp/src/main/elm/Page/Info/Update.elm new file mode 100644 index 00000000..d713e559 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Info/Update.elm @@ -0,0 +1,9 @@ +module Page.Info.Update exposing (update) + +import Data.Flags exposing (Flags) +import Page.Info.Data exposing (Model, Msg(..)) + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + ( model, Cmd.none ) diff --git a/modules/webapp/src/main/elm/Page/Info/View.elm b/modules/webapp/src/main/elm/Page/Info/View.elm new file mode 100644 index 00000000..de9f9789 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Info/View.elm @@ -0,0 +1,32 @@ +module Page.Info.View exposing (view) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Page.Info.Data exposing (Model, Msg(..)) +import Util.List + + +view : Int -> Model -> Html Msg +view msg model = + case Util.List.get model msg of + Just m -> + div [ class "info-page" ] + [ div [ class "ui centered grid" ] + [ div [ class "row" ] + [ div [ class "eight wide column basic ui segment" ] + [ h1 [ class "ui header" ] + [ i [ class "ui info icon" ] [] + , div [ class "content" ] + [ text m.head + ] + ] + , p [] + [ text m.text + ] + ] + ] + ] + ] + + Nothing -> + div [] [] diff --git a/modules/webapp/src/main/elm/Page/Login/Data.elm b/modules/webapp/src/main/elm/Page/Login/Data.elm new file mode 100644 index 00000000..577570da --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Login/Data.elm @@ -0,0 +1,27 @@ +module Page.Login.Data exposing (..) + +import Api.Model.AuthResult exposing (AuthResult) +import Http + + +type alias Model = + { username : String + , password : String + , result : Maybe AuthResult + } + + +empty : Model +empty = + { username = "" + , password = "" + , result = Nothing + } + + +type Msg + = SetUsername String + | SetPassword String + | Authenticate + | AuthResp (Result Http.Error AuthResult) + | Init diff --git a/modules/webapp/src/main/elm/Page/Login/Update.elm b/modules/webapp/src/main/elm/Page/Login/Update.elm new file mode 100644 index 00000000..17954229 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Login/Update.elm @@ -0,0 +1,78 @@ +module Page.Login.Update exposing (update) + +import Api +import Api.Model.AuthResult exposing (AuthResult) +import Api.Model.UserPass exposing (UserPass) +import Data.Flags exposing (Flags) +import Page exposing (Page(..)) +import Page.Login.Data exposing (..) +import Ports +import Util.Http +import Util.List + + +update : ( Maybe Page, Bool ) -> Flags -> Msg -> Model -> ( Model, Cmd Msg, Maybe AuthResult ) +update ( referrer, oauth ) flags msg model = + case msg of + -- after logging in via some provider, a cookie has been sent + -- with a redirection to the login page. So then there must be + -- another call to get the account data. + Init -> + if oauth && Util.List.nonEmpty flags.config.oauthConfig then + ( model, Api.loginSession flags AuthResp, Nothing ) + + else + ( model, Cmd.none, Nothing ) + + SetUsername str -> + ( { model | username = str }, Cmd.none, Nothing ) + + SetPassword str -> + ( { model | password = str }, Cmd.none, Nothing ) + + Authenticate -> + ( model, Api.login flags (UserPass model.username model.password) AuthResp, Nothing ) + + AuthResp (Ok lr) -> + if lr.success then + loginSuccess referrer lr model + + else + ( { model | result = Just lr, password = "" } + , Ports.removeAccount () + , Just lr + ) + + AuthResp (Err err) -> + let + empty = + Api.Model.AuthResult.empty + + lr = + { empty | message = Util.Http.errorToString err } + in + ( { model | password = "", result = Just lr }, Ports.removeAccount (), Just empty ) + + +loginSuccess : Maybe Page -> AuthResult -> Model -> ( Model, Cmd Msg, Maybe AuthResult ) +loginSuccess referrer res model = + let + ar = + Just res + + gotoRef = + Maybe.withDefault HomePage referrer |> Page.goto + in + ( { model | result = ar, password = "" } + , Cmd.batch [ setAccount res, gotoRef ] + , ar + ) + + +setAccount : AuthResult -> Cmd msg +setAccount result = + if result.success then + Ports.setAccount result + + else + Ports.removeAccount () diff --git a/modules/webapp/src/main/elm/Page/Login/View.elm b/modules/webapp/src/main/elm/Page/Login/View.elm new file mode 100644 index 00000000..26743271 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Login/View.elm @@ -0,0 +1,129 @@ +module Page.Login.View exposing (view) + +import Api +import Api.Model.OAuthItem exposing (OAuthItem) +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput, onSubmit) +import Page exposing (Page(..)) +import Page.Login.Data exposing (..) + + +view : Flags -> Model -> Html Msg +view flags model = + div [ class "login-page" ] + [ div [ class "ui centered grid" ] + [ div [ class "row" ] + [ div [ class "six wide column ui segment login-view" ] + [ h1 [ class "ui center aligned icon header" ] + [ img + [ class "ui logo image" + , src (flags.config.assetsPath ++ "/img/logo.png") + ] + [] + ] + , Html.form + [ class "ui large error raised form segment" + , onSubmit Authenticate + , autocomplete False + ] + [ div [ class "field" ] + [ label [] [ text "Username" ] + , div [ class "ui left icon input" ] + [ input + [ type_ "text" + , autocomplete False + , onInput SetUsername + , value model.username + , placeholder "Login" + , autofocus True + ] + [] + , i [ class "user icon" ] [] + ] + ] + , div [ class "field" ] + [ label [] [ text "Password" ] + , div [ class "ui left icon input" ] + [ input + [ type_ "password" + , autocomplete False + , onInput SetPassword + , value model.password + , placeholder "Password" + ] + [] + , i [ class "lock icon" ] [] + ] + ] + , button + [ class "ui primary fluid button" + , type_ "submit" + ] + [ text "Login" + ] + ] + , if List.isEmpty flags.config.oauthConfig then + div [] [] + + else + renderOAuthButtons flags model + , resultMessage model + , div [ class "ui very basic right aligned segment" ] + [ text "No account? " + , a [ class "ui icon link", Page.href RegisterPage ] + [ i [ class "edit icon" ] [] + , text "Sign up!" + ] + ] + ] + ] + ] + ] + + +renderOAuthButtons : Flags -> Model -> Html Msg +renderOAuthButtons flags model = + div [] + [ div [ class "ui horizontal divider" ] [ text "Or" ] + , div [ class "ui buttons" ] + (List.map (renderOAuthButton flags) flags.config.oauthConfig) + ] + + +renderOAuthButton : Flags -> OAuthItem -> Html Msg +renderOAuthButton flags item = + let + icon = + "ui icon " ++ Maybe.withDefault "user outline" item.icon + + url = + Api.oauthUrl flags item + in + a + [ class "ui basic primary button" + , href url + ] + [ i [ class icon ] [] + , text "via " + , text item.name + ] + + +resultMessage : Model -> Html Msg +resultMessage model = + case model.result of + Just r -> + if r.success then + div [ class "ui success message" ] + [ text "Login successful." + ] + + else + div [ class "ui error message" ] + [ text r.message + ] + + Nothing -> + span [] [] diff --git a/modules/webapp/src/main/elm/Page/NewInvite/Data.elm b/modules/webapp/src/main/elm/Page/NewInvite/Data.elm new file mode 100644 index 00000000..722a73e1 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/NewInvite/Data.elm @@ -0,0 +1,50 @@ +module Page.NewInvite.Data exposing (..) + +import Api.Model.InviteResult exposing (InviteResult) +import Http + + +type alias Model = + { password : String + , result : State + } + + +type State + = Empty + | Failed String + | Success InviteResult + + +isFailed : State -> Bool +isFailed state = + case state of + Failed _ -> + True + + _ -> + False + + +isSuccess : State -> Bool +isSuccess state = + case state of + Success _ -> + True + + _ -> + False + + +emptyModel : Model +emptyModel = + { password = "" + , result = Empty + } + + +type Msg + = SetPassword String + | GenerateInvite + | Reset + | InviteResp (Result Http.Error InviteResult) diff --git a/modules/webapp/src/main/elm/Page/NewInvite/Update.elm b/modules/webapp/src/main/elm/Page/NewInvite/Update.elm new file mode 100644 index 00000000..40d9a479 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/NewInvite/Update.elm @@ -0,0 +1,30 @@ +module Page.NewInvite.Update exposing (update) + +import Api +import Api.Model.GenInvite exposing (GenInvite) +import Data.Flags exposing (Flags) +import Page.NewInvite.Data exposing (..) +import Util.Http + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + case msg of + SetPassword str -> + ( { model | password = str }, Cmd.none ) + + Reset -> + ( emptyModel, Cmd.none ) + + GenerateInvite -> + ( model, Api.newInvite flags (GenInvite model.password) InviteResp ) + + InviteResp (Ok res) -> + if res.success then + ( { model | result = Success res }, Cmd.none ) + + else + ( { model | result = Failed res.message }, Cmd.none ) + + InviteResp (Err err) -> + ( { model | result = Failed (Util.Http.errorToString err) }, Cmd.none ) diff --git a/modules/webapp/src/main/elm/Page/NewInvite/View.elm b/modules/webapp/src/main/elm/Page/NewInvite/View.elm new file mode 100644 index 00000000..95063923 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/NewInvite/View.elm @@ -0,0 +1,113 @@ +module Page.NewInvite.View exposing (view) + +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput, onSubmit) +import Page.NewInvite.Data exposing (..) + + +view : Flags -> Model -> Html Msg +view flags model = + div [ class "newinvite-page" ] + [ div [ class "ui text container" ] + [ h1 [ class "ui cener aligned header" ] + [ i [ class "pencil alternate icon" ] [] + , div [ class "content" ] + [ text "Create new invitations" + ] + ] + , inviteMessage flags + , Html.form + [ classList + [ ( "ui large form raised segment", True ) + , ( "error", isFailed model.result ) + , ( "success", isSuccess model.result ) + ] + , onSubmit GenerateInvite + ] + [ div [ class "required field" ] + [ label [] [ text "New Invitation Password" ] + , div [ class "ui left icon input" ] + [ input + [ type_ "password" + , onInput SetPassword + , value model.password + , autofocus True + ] + [] + , i [ class "key icon" ] [] + ] + ] + , button + [ class "ui primary button" + , type_ "submit" + ] + [ text "Submit" + ] + , a [ class "ui right floated button", href "", onClick Reset ] + [ text "Reset" + ] + , resultMessage model + ] + ] + ] + + +resultMessage : Model -> Html Msg +resultMessage model = + div + [ classList + [ ( "ui message", True ) + , ( "error", isFailed model.result ) + , ( "success", isSuccess model.result ) + , ( "hidden", model.result == Empty ) + ] + ] + [ case model.result of + Failed m -> + div [ class "content" ] + [ div [ class "header" ] [ text "Error" ] + , p [] [ text m ] + ] + + Success r -> + div [ class "content" ] + [ div [ class "header" ] [ text "Success" ] + , p [] [ text r.message ] + , p [] [ text "Invitation Key:" ] + , pre [] + [ Maybe.withDefault "" r.key |> text + ] + ] + + Empty -> + span [] [] + ] + + +inviteMessage : Flags -> Html Msg +inviteMessage flags = + div + [ classList + [ ( "ui message", True ) + , ( "hidden", flags.config.signupMode /= "invite" ) + ] + ] + [ p [] + [ text + """Sharry requires an invite when signing up. You can + create these invites here and send them to friends so + they can signup with Sharry.""" + ] + , p [] + [ text + """Each invite can only be used once. You'll need to + create one key for each person you want to invite.""" + ] + , p [] + [ text + """Creating an invite requires providing the password + from the configuration.""" + ] + ] diff --git a/modules/webapp/src/main/elm/Page/OpenDetail/Data.elm b/modules/webapp/src/main/elm/Page/OpenDetail/Data.elm new file mode 100644 index 00000000..4d2e9a9c --- /dev/null +++ b/modules/webapp/src/main/elm/Page/OpenDetail/Data.elm @@ -0,0 +1,62 @@ +module Page.OpenDetail.Data exposing + ( Model + , Msg(..) + , emptyModel + , emptyPassModel + ) + +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.ShareDetail exposing (ShareDetail) +import Api.Model.ShareFile exposing (ShareFile) +import Comp.PasswordInput +import Comp.ShareFileList +import Http + + +type alias Model = + { share : ShareDetail + , fileListModel : Comp.ShareFileList.Model + , message : Maybe BasicResult + , fileView : Comp.ShareFileList.ViewMode + , zoom : Maybe ShareFile + , password : PassModel + } + + +type alias PassModel = + { model : Comp.PasswordInput.Model + , field : Maybe String + , enabled : Bool + , badPassword : Bool + } + + +emptyPassModel : PassModel +emptyPassModel = + { model = Comp.PasswordInput.init + , field = Nothing + , enabled = False + , badPassword = False + } + + +emptyModel : Model +emptyModel = + { share = Api.Model.ShareDetail.empty + , fileListModel = Comp.ShareFileList.init + , message = Nothing + , fileView = Comp.ShareFileList.ViewList + , zoom = Nothing + , password = emptyPassModel + } + + +type Msg + = Init String + | DetailResp (Result Http.Error ShareDetail) + | FileListMsg Comp.ShareFileList.Msg + | SetFileView Comp.ShareFileList.ViewMode + | QuitZoom + | SetZoom ShareFile + | PasswordMsg Comp.PasswordInput.Msg + | SubmitPassword diff --git a/modules/webapp/src/main/elm/Page/OpenDetail/Update.elm b/modules/webapp/src/main/elm/Page/OpenDetail/Update.elm new file mode 100644 index 00000000..aba1126c --- /dev/null +++ b/modules/webapp/src/main/elm/Page/OpenDetail/Update.elm @@ -0,0 +1,118 @@ +module Page.OpenDetail.Update exposing (update) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Comp.PasswordInput +import Comp.ShareFileList +import Data.Flags exposing (Flags) +import Http +import Page.OpenDetail.Data exposing (Model, Msg(..), emptyPassModel) +import Ports +import Util.Http + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + case msg of + Init id -> + let + share = + model.share + + withId = + { share | id = id } + in + ( { model | share = withId } + , Api.getOpenShare flags id model.password.field DetailResp + ) + + DetailResp (Ok details) -> + ( { model + | share = details + , message = Nothing + , password = emptyPassModel + } + , Cmd.none + ) + + DetailResp (Err err) -> + let + pwm = + model.password + + m = + Util.Http.errorToString err + in + case err of + Http.BadStatus 401 -> + ( { model + | password = { pwm | enabled = True, badPassword = False } + } + , Cmd.none + ) + + Http.BadStatus 403 -> + ( { model + | password = { pwm | enabled = True, badPassword = True } + } + , Cmd.none + ) + + _ -> + ( { model | message = Just (BasicResult False m) } + , Cmd.none + ) + + FileListMsg lmsg -> + let + ( m, action ) = + Comp.ShareFileList.update lmsg model.fileListModel + in + case action of + Comp.ShareFileList.FileClick sf -> + ( { model | fileListModel = m, zoom = Just sf } + , Ports.scrollTop () + ) + + Comp.ShareFileList.FileDelete sf -> + ( model + , Cmd.none + ) + + Comp.ShareFileList.FileNone -> + ( { model | fileListModel = m }, Cmd.none ) + + SetFileView mode -> + ( { model + | fileView = mode + , fileListModel = Comp.ShareFileList.reset model.fileListModel + } + , Cmd.none + ) + + QuitZoom -> + case model.zoom of + Just file -> + ( { model | zoom = Nothing }, Ports.scrollToElem file.id ) + + Nothing -> + ( { model | zoom = Nothing }, Cmd.none ) + + SetZoom sf -> + ( { model | zoom = Just sf }, Cmd.none ) + + PasswordMsg lmsg -> + let + current = + model.password + + ( pm, pw ) = + Comp.PasswordInput.update lmsg current.model + + next = + { current | model = pm, field = pw } + in + ( { model | password = next }, Cmd.none ) + + SubmitPassword -> + update flags (Init model.share.id) model diff --git a/modules/webapp/src/main/elm/Page/OpenDetail/View.elm b/modules/webapp/src/main/elm/Page/OpenDetail/View.elm new file mode 100644 index 00000000..b88727a3 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/OpenDetail/View.elm @@ -0,0 +1,142 @@ +module Page.OpenDetail.View exposing (view) + +import Api +import Comp.PasswordInput +import Comp.ShareFileList exposing (ViewMode(..)) +import Comp.Zoom +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Markdown +import Page.OpenDetail.Data exposing (Model, Msg(..)) +import Util.Html +import Util.Share + + +view : Flags -> Model -> Html Msg +view flags model = + div [ class "ui grid container detail-page" ] + [ zoomView flags model + , passwordDialog model + , div [ class "row" ] + [ div [ class "sixteen wide column" ] + [ descriptionView model + , messageDiv model + , middleMenu model + , fileList flags model + ] + ] + ] + + +zoomView : Flags -> Model -> Html Msg +zoomView flags model = + Comp.Zoom.view (Api.fileOpenUrl flags (shareId model)) model SetZoom QuitZoom + + +passwordDialog : Model -> Html Msg +passwordDialog model = + div + [ classList + [ ( "ui dimmer", True ) + , ( "active", model.password.enabled ) + ] + ] + [ div [ class "inline content" ] + [ h2 [ class "ui inverted icon header" ] + [ i [ class "lock icon" ] [] + , text "Password required" + ] + , div [ class "ui basic segment" ] + [ div [ class "ui action input" ] + [ Html.map PasswordMsg + (Comp.PasswordInput.view + model.password.field + model.password.model + ) + , a + [ class "ui primary button" + , href "#" + , onClick SubmitPassword + ] + [ text "Submit" + ] + ] + , div + [ classList + [ ( "ui error message", True ) + , ( "invisible hidden", not model.password.badPassword ) + ] + ] + [ text "Password invalid" + ] + ] + ] + ] + + +messageDiv : Model -> Html Msg +messageDiv model = + Util.Html.resultMsgMaybe model.message + + +descriptionView : Model -> Html Msg +descriptionView model = + let + ( title, desc ) = + Util.Share.splitDescription model.share + in + div [ class "ui container share-description" ] + [ Markdown.toHtml [] title + , Markdown.toHtml [] desc + ] + + +middleMenu : Model -> Html Msg +middleMenu model = + div + [ class "ui menu" + ] + [ a + [ classList + [ ( "icon link item", True ) + , ( "active", model.fileView == ViewList ) + ] + , href "#" + , onClick (SetFileView ViewList) + , title "List View" + ] + [ i [ class "ui list icon" ] [] + ] + , a + [ classList + [ ( "icon link item", True ) + , ( "active", model.fileView == ViewCard ) + ] + , href "#" + , onClick (SetFileView ViewCard) + , title "Card View" + ] + [ i [ class "th icon" ] [] + ] + ] + + +fileList : Flags -> Model -> Html Msg +fileList flags model = + let + sett = + Comp.ShareFileList.Settings + (Api.fileOpenUrl flags (shareId model) "") + model.fileView + False + in + Html.map FileListMsg <| + Comp.ShareFileList.view sett model.share.files model.fileListModel + + +shareId : Model -> String +shareId model = + Maybe.map .id model.share.publishInfo + |> Maybe.withDefault "" diff --git a/modules/webapp/src/main/elm/Page/OpenShare/Data.elm b/modules/webapp/src/main/elm/Page/OpenShare/Data.elm new file mode 100644 index 00000000..bc5918ab --- /dev/null +++ b/modules/webapp/src/main/elm/Page/OpenShare/Data.elm @@ -0,0 +1,50 @@ +module Page.OpenShare.Data exposing (Model, Msg(..), emptyModel) + +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.IdResult exposing (IdResult) +import Comp.Dropzone2 +import Comp.MarkdownInput +import Data.UploadDict exposing (UploadDict) +import Data.UploadState exposing (UploadState) +import Dict exposing (Dict) +import File exposing (File) +import Http +import Json.Decode as D + + +type alias Model = + { dropzoneModel : Comp.Dropzone2.Model + , uploads : UploadDict + , descModel : Comp.MarkdownInput.Model + , descField : String + , formState : BasicResult + , uploading : Bool + , shareId : Maybe String + , uploadPaused : Bool + } + + +emptyModel : Model +emptyModel = + { dropzoneModel = Comp.Dropzone2.init + , uploads = Data.UploadDict.empty + , descModel = Comp.MarkdownInput.init + , descField = "" + , formState = BasicResult True "" + , uploading = False + , shareId = Nothing + , uploadPaused = False + } + + +type Msg + = DropzoneMsg Comp.Dropzone2.Msg + | DescMsg Comp.MarkdownInput.Msg + | ClearFiles + | Submit + | CreateShareResp (Result Http.Error IdResult) + | Uploading UploadState + | StartStopUpload + | UploadStopped (Maybe String) + | ResetForm + | NotifyResp (Result Http.Error BasicResult) diff --git a/modules/webapp/src/main/elm/Page/OpenShare/Update.elm b/modules/webapp/src/main/elm/Page/OpenShare/Update.elm new file mode 100644 index 00000000..dc88f52a --- /dev/null +++ b/modules/webapp/src/main/elm/Page/OpenShare/Update.elm @@ -0,0 +1,188 @@ +module Page.OpenShare.Update exposing (update) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.ShareProperties exposing (ShareProperties) +import Comp.Dropzone2 +import Comp.MarkdownInput +import Data.Flags exposing (Flags) +import Data.UploadData exposing (UploadData) +import Data.UploadDict +import Data.UploadState exposing (UploadState) +import Http +import Page exposing (Page(..)) +import Page.OpenShare.Data exposing (Model, Msg(..)) +import Ports +import Util.Http +import Util.Share + + +update : String -> Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update aliasId flags msg model = + case msg of + DropzoneMsg lmsg -> + let + ( m, c, fs ) = + Comp.Dropzone2.update model.uploads.selectedFiles lmsg model.dropzoneModel + in + ( { model + | dropzoneModel = m + , uploads = Data.UploadDict.updateFiles model.uploads fs + , formState = BasicResult True "" + } + , Cmd.batch [ Cmd.map DropzoneMsg c ] + ) + + DescMsg lmsg -> + let + ( m, txt ) = + Comp.MarkdownInput.update model.descField lmsg model.descModel + in + ( { model + | descModel = m + , descField = txt + , formState = BasicResult True "" + } + , Cmd.none + ) + + ClearFiles -> + ( { model | uploads = Data.UploadDict.updateFiles model.uploads [] }, Cmd.none ) + + Submit -> + let + valid = + Util.Share.validate flags Nothing model + in + if valid.success then + ( { model | uploading = True } + , Api.createEmptyShareAlias flags aliasId (makeProps model) CreateShareResp + ) + + else + ( { model | formState = valid } + , Cmd.none + ) + + CreateShareResp (Ok idres) -> + let + ( native, files ) = + List.unzip model.uploads.selectedFiles + + uploadUrl = + flags.config.baseUrl ++ "/api/v2/alias/upload/" ++ idres.id ++ "/files/tus" + + submit = + if native == [] then + Cmd.none + + else + UploadData uploadUrl idres.id native (Just aliasId) + |> Data.UploadData.encode + |> Ports.submitFiles + in + if idres.success then + ( { model | shareId = Just idres.id }, submit ) + + else + ( { model | formState = BasicResult False idres.message } + , Cmd.none + ) + + CreateShareResp (Err err) -> + case err of + Http.BadStatus 403 -> + ( model, Page.goto (InfoPage 1) ) + + _ -> + ( { model + | formState = BasicResult False (Util.Http.errorToString err) + , uploading = False + } + , Cmd.none + ) + + Uploading state -> + if Just state.id == model.shareId then + trackUpload flags aliasId model state + + else + ( model, Cmd.none ) + + StartStopUpload -> + case model.shareId of + Just id -> + ( model + , if model.uploadPaused then + Ports.startUpload id + + else + Ports.stopUpload id + ) + + Nothing -> + ( model, Cmd.none ) + + UploadStopped err -> + ( { model | uploadPaused = err == Nothing }, Cmd.none ) + + ResetForm -> + ( Page.OpenShare.Data.emptyModel, Cmd.none ) + + NotifyResp _ -> + ( model, Cmd.none ) + + +trackUpload : Flags -> String -> Model -> UploadState -> ( Model, Cmd Msg ) +trackUpload flags aliasId model state = + let + ( next, progress ) = + Data.UploadDict.trackUpload model.uploads state + + progressCmd p = + case p of + Data.UploadDict.FileProgress index perc -> + [ ( "file-progress-" ++ String.fromInt index + , perc + ) + ] + + Data.UploadDict.AllProgress perc -> + [ ( "all-progress", perc ) + ] + + infoMsg = + case state.state of + Data.UploadState.Failed em -> + BasicResult False em + + _ -> + model.formState + + notifyCmd = + if Data.UploadDict.allDone next then + Api.notifyAliasUpload flags + aliasId + (Maybe.withDefault "" model.shareId) + NotifyResp + + else + Cmd.none + in + ( { model + | uploads = next + , uploadPaused = False + , formState = infoMsg + } + , Cmd.batch [ Ports.setProgress (List.concatMap progressCmd progress), notifyCmd ] + ) + + +makeProps : Model -> ShareProperties +makeProps model = + { name = Nothing + , validity = 0 + , description = Just model.descField + , maxViews = 10 + , password = Nothing + } diff --git a/modules/webapp/src/main/elm/Page/OpenShare/View.elm b/modules/webapp/src/main/elm/Page/OpenShare/View.elm new file mode 100644 index 00000000..f5eeac6a --- /dev/null +++ b/modules/webapp/src/main/elm/Page/OpenShare/View.elm @@ -0,0 +1,163 @@ +module Page.OpenShare.View exposing (view) + +import Comp.Dropzone2 +import Comp.MarkdownInput +import Data.Flags exposing (Flags) +import Data.UploadDict exposing (countDone) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick) +import Page exposing (Page(..)) +import Page.OpenShare.Data exposing (Model, Msg(..)) + + +view : Flags -> String -> Model -> Html Msg +view flags id model = + let + counts = + countDone model.uploads + + allDone = + model.shareId + /= Nothing + && Tuple.first counts + + Tuple.second counts + == List.length model.uploads.selectedFiles + in + div [] + [ div [ class "ui container" ] + [ h1 [ class "ui dividing header" ] + [ i [ class "ui upload icon" ] [] + , text "Send files" + ] + ] + , div [ class "ui container" ] + [ p [] [] + , div + [ classList + [ ( "ui small form", True ) + , ( "error", not model.formState.success || Tuple.second counts > 0 ) + , ( "success", Tuple.second counts == 0 ) + ] + ] + [ if allDone then + doneMessageBox counts model + + else + controls model + , Data.Flags.limitsMessage flags + [ class "ui info message" ] + , div [ class "ui error message" ] + [ text model.formState.message + ] + , div [ class "field" ] + [ label [] [ text "Description" ] + , Html.map DescMsg + (Comp.MarkdownInput.view + model.descField + model.descModel + ) + ] + , Html.map DropzoneMsg + (Comp.Dropzone2.view + (mkViewSettings model) + model.dropzoneModel + ) + ] + ] + ] + + +doneMessageBox : ( Int, Int ) -> Model -> Html Msg +doneMessageBox ( succ, err ) model = + let + buttons = + div [ class "" ] + [ a + [ class "ui primary button" + , href "#" + , onClick ResetForm + ] + [ text "Send more files" + ] + ] + + success = + div [ class "ui success icon message" ] + [ i [ class "ui check icon" ] [] + , div [ class "content" ] + [ div [ class "ui header" ] + [ text "All files uploaded" + ] + , div [ class "ui divider" ] [] + , buttons + ] + ] + + error = + div [ class "ui error icon message" ] + [ i [ class "ui meh icon" ] [] + , div [ class "content" ] + [ div [ class "header" ] + [ text "Some files failed" + ] + , p [] + [ text "Some files failed to upload…. You can try uploading them again." + ] + , div [ class "ui divider" ] [] + , buttons + ] + ] + in + if err > 0 then + error + + else + success + + +controls : Model -> Html Msg +controls model = + div + [ class "field" + ] + [ button + [ type_ "button" + , classList + [ ( "ui primary button", True ) + , ( "disabled", model.uploading ) + ] + , onClick Submit + ] + [ text "Submit" + ] + , button + [ type_ "button" + , onClick ClearFiles + , classList + [ ( "ui button", True ) + , ( "disabled", model.uploading ) + ] + ] + [ text "Clear Files" + ] + , button + [ type_ "button" + , classList + [ ( "ui right floated button", True ) + , ( "disabled", not model.uploading ) + ] + , onClick StartStopUpload + ] + [ if model.uploadPaused then + text "Resume" + + else + text "Pause" + ] + ] + + +mkViewSettings : Model -> Comp.Dropzone2.ViewSettings +mkViewSettings model = + Comp.Dropzone2.mkViewSettings (not model.uploading) model.uploads diff --git a/modules/webapp/src/main/elm/Page/Register/Data.elm b/modules/webapp/src/main/elm/Page/Register/Data.elm new file mode 100644 index 00000000..c613782f --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Register/Data.elm @@ -0,0 +1,44 @@ +module Page.Register.Data exposing (..) + +import Api.Model.BasicResult exposing (BasicResult) +import Http + + +type alias Model = + { result : Maybe BasicResult + , login : String + , pass1 : String + , pass2 : String + , showPass1 : Bool + , showPass2 : Bool + , errorMsg : List String + , loading : Bool + , successMsg : String + , invite : Maybe String + } + + +emptyModel : Model +emptyModel = + { result = Nothing + , login = "" + , pass1 = "" + , pass2 = "" + , showPass1 = False + , showPass2 = False + , errorMsg = [] + , successMsg = "" + , loading = False + , invite = Nothing + } + + +type Msg + = SetLogin String + | SetPass1 String + | SetPass2 String + | SetInvite String + | RegisterSubmit + | ToggleShowPass1 + | ToggleShowPass2 + | SubmitResp (Result Http.Error BasicResult) diff --git a/modules/webapp/src/main/elm/Page/Register/Update.elm b/modules/webapp/src/main/elm/Page/Register/Update.elm new file mode 100644 index 00000000..b662beeb --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Register/Update.elm @@ -0,0 +1,119 @@ +module Page.Register.Update exposing (update) + +import Api +import Api.Model.Registration exposing (Registration) +import Data.Flags exposing (Flags) +import Page exposing (Page(..)) +import Page.Register.Data exposing (..) + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + case msg of + RegisterSubmit -> + case model.errorMsg of + [] -> + let + reg = + { login = model.login + , password = model.pass1 + , invite = model.invite + } + in + ( model, Api.register flags reg SubmitResp ) + + _ -> + ( model, Cmd.none ) + + SetLogin str -> + let + m = + { model | login = str } + + err = + validateForm m + in + ( { m | errorMsg = err }, Cmd.none ) + + SetPass1 str -> + let + m = + { model | pass1 = str } + + err = + validateForm m + in + ( { m | errorMsg = err }, Cmd.none ) + + SetPass2 str -> + let + m = + { model | pass2 = str } + + err = + validateForm m + in + ( { m | errorMsg = err }, Cmd.none ) + + SetInvite str -> + ( { model + | invite = + if str == "" then + Nothing + + else + Just str + } + , Cmd.none + ) + + ToggleShowPass1 -> + ( { model | showPass1 = not model.showPass1 }, Cmd.none ) + + ToggleShowPass2 -> + ( { model | showPass2 = not model.showPass2 }, Cmd.none ) + + SubmitResp (Ok r) -> + let + m = + emptyModel + + cmd = + if r.success then + Page.goto (LoginPage ( Nothing, False )) + + else + Cmd.none + in + ( { m + | result = + if r.success then + Nothing + + else + Just r + } + , cmd + ) + + SubmitResp (Err err) -> + ( model, Cmd.none ) + + +validateForm : Model -> List String +validateForm model = + if + model.login + == "" + || model.pass1 + == "" + || model.pass2 + == "" + then + [ "All fields are required!" ] + + else if model.pass1 /= model.pass2 then + [ "The passwords do not match." ] + + else + [] diff --git a/modules/webapp/src/main/elm/Page/Register/View.elm b/modules/webapp/src/main/elm/Page/Register/View.elm new file mode 100644 index 00000000..44be077b --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Register/View.elm @@ -0,0 +1,150 @@ +module Page.Register.View exposing (view) + +import Data.Flags exposing (Flags) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput, onSubmit) +import Page exposing (Page(..)) +import Page.Register.Data exposing (..) + + +view : Flags -> Model -> Html Msg +view flags model = + div [ class "register-page" ] + [ div [ class "ui centered grid" ] + [ div [ class "row" ] + [ div [ class "six wide column ui segment register-view" ] + [ h1 [ class "ui cener aligned icon header" ] + [ img + [ class "ui logo image" + , src (flags.config.assetsPath ++ "/img/logo.png") + ] + [] + , div [ class "content" ] + [ text "Sign up" + ] + ] + , Html.form + [ class "ui large error form raised segment" + , onSubmit RegisterSubmit + , autocomplete False + ] + [ div [ class "required field" ] + [ label [] [ text "User Login" ] + , div [ class "ui left icon input" ] + [ input + [ type_ "text" + , autocomplete False + , onInput SetLogin + , value model.login + ] + [] + , i [ class "user icon" ] [] + ] + ] + , div + [ class "required field" + ] + [ label [] [ text "Password" ] + , div [ class "ui left icon action input" ] + [ input + [ type_ <| + if model.showPass1 then + "text" + + else + "password" + , autocomplete False + , onInput SetPass1 + , value model.pass1 + ] + [] + , i [ class "lock icon" ] [] + , button [ class "ui icon button", onClick ToggleShowPass1 ] + [ i [ class "eye icon" ] [] + ] + ] + ] + , div + [ class "required field" + ] + [ label [] [ text "Password (repeat)" ] + , div [ class "ui left icon action input" ] + [ input + [ type_ <| + if model.showPass2 then + "text" + + else + "password" + , autocomplete False + , onInput SetPass2 + , value model.pass2 + ] + [] + , i [ class "lock icon" ] [] + , button [ class "ui icon button", onClick ToggleShowPass2 ] + [ i [ class "eye icon" ] [] + ] + ] + ] + , div + [ classList + [ ( "field", True ) + , ( "invisible", flags.config.signupMode /= "invite" ) + ] + ] + [ label [] [ text "Invitation Key" ] + , div [ class "ui left icon input" ] + [ input + [ type_ "text" + , autocomplete False + , onInput SetInvite + , model.invite |> Maybe.withDefault "" |> value + ] + [] + , i [ class "key icon" ] [] + ] + ] + , button + [ class "ui primary button" + , type_ "submit" + ] + [ text "Submit" + ] + ] + , resultMessage model + , div [ class "ui very basic right aligned segment" ] + [ text "Already signed up? " + , a [ class "ui link", Page.href (LoginPage ( Nothing, False )) ] + [ i [ class "sign-in icon" ] [] + , text "Sign in" + ] + ] + ] + ] + ] + ] + + +resultMessage : Model -> Html Msg +resultMessage model = + case model.result of + Just r -> + if r.success then + div [ class "ui success message" ] + [ text "Registration successful." + ] + + else + div [ class "ui error message" ] + [ text r.message + ] + + Nothing -> + if List.isEmpty model.errorMsg then + span [ class "invisible" ] [] + + else + div [ class "ui error message" ] + (List.map (\s -> div [] [ text s ]) model.errorMsg) diff --git a/modules/webapp/src/main/elm/Page/Settings/Data.elm b/modules/webapp/src/main/elm/Page/Settings/Data.elm new file mode 100644 index 00000000..b124bf2c --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Settings/Data.elm @@ -0,0 +1,56 @@ +module Page.Settings.Data exposing + ( Banner + , Model + , Msg(..) + , emptyModel + ) + +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.EmailInfo exposing (EmailInfo) +import Comp.PasswordInput +import Http + + +type alias Banner = + { success : Bool + , text : String + } + + +type alias Model = + { oldPasswordModel : Comp.PasswordInput.Model + , oldPasswordField : Maybe String + , newPasswordModel1 : Comp.PasswordInput.Model + , newPasswordField1 : Maybe String + , newPasswordModel2 : Comp.PasswordInput.Model + , newPasswordField2 : Maybe String + , emailField : Maybe String + , currentEmail : Maybe String + , banner : Maybe Banner + } + + +emptyModel : Model +emptyModel = + { oldPasswordModel = Comp.PasswordInput.init + , oldPasswordField = Nothing + , newPasswordModel1 = Comp.PasswordInput.init + , newPasswordField1 = Nothing + , newPasswordModel2 = Comp.PasswordInput.init + , newPasswordField2 = Nothing + , emailField = Nothing + , currentEmail = Nothing + , banner = Nothing + } + + +type Msg + = Init + | SetEmail String + | SubmitEmail + | SetOldPassword Comp.PasswordInput.Msg + | SetNewPassword1 Comp.PasswordInput.Msg + | SetNewPassword2 Comp.PasswordInput.Msg + | SubmitPassword + | GetEmailResp (Result Http.Error EmailInfo) + | SaveResp (Result Http.Error BasicResult) diff --git a/modules/webapp/src/main/elm/Page/Settings/Update.elm b/modules/webapp/src/main/elm/Page/Settings/Update.elm new file mode 100644 index 00000000..2d85a380 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Settings/Update.elm @@ -0,0 +1,136 @@ +module Page.Settings.Update exposing (update) + +import Api +import Api.Model.PasswordChange exposing (PasswordChange) +import Comp.PasswordInput +import Data.Flags exposing (Flags) +import Page.Settings.Data exposing (Banner, Model, Msg(..)) +import Util.Http +import Util.Maybe + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + case msg of + Init -> + ( { model | banner = Nothing } + , Api.getEmail flags GetEmailResp + ) + + GetEmailResp (Ok r) -> + ( { model + | currentEmail = r.email + , emailField = + if model.emailField == Nothing then + r.email + + else + model.emailField + } + , Cmd.none + ) + + GetEmailResp (Err err) -> + ( { model + | banner = + Just <| + Banner False <| + "Error retrieving current email: " + ++ Util.Http.errorToString err + } + , Cmd.none + ) + + SetEmail str -> + let + em = + Util.Maybe.fromString str + in + ( { model | emailField = em, banner = Nothing }, Cmd.none ) + + SubmitEmail -> + if model.currentEmail == model.emailField then + ( { model + | banner = + Just <| + Banner False "E-Mail has not changed." + } + , Cmd.none + ) + + else + ( model, Api.setEmail flags model.emailField SaveResp ) + + SaveResp (Ok r) -> + ( { model | banner = Just <| Banner r.success r.message }, Cmd.none ) + + SaveResp (Err err) -> + ( { model + | banner = + Just <| + Banner False <| + "Error on submit: " + ++ Util.Http.errorToString err + } + , Cmd.none + ) + + SetOldPassword lmsg -> + let + ( m, pw ) = + Comp.PasswordInput.update lmsg model.oldPasswordModel + in + ( { model + | oldPasswordModel = m + , oldPasswordField = pw + , banner = Nothing + } + , Cmd.none + ) + + SetNewPassword1 lmsg -> + let + ( m, pw ) = + Comp.PasswordInput.update lmsg model.newPasswordModel1 + in + ( { model + | newPasswordModel1 = m + , newPasswordField1 = pw + , banner = Nothing + } + , Cmd.none + ) + + SetNewPassword2 lmsg -> + let + ( m, pw ) = + Comp.PasswordInput.update lmsg model.newPasswordModel2 + in + ( { model + | newPasswordModel2 = m + , newPasswordField2 = pw + , banner = Nothing + } + , Cmd.none + ) + + SubmitPassword -> + let + bothEqual = + model.newPasswordField1 + == model.newPasswordField2 + && model.newPasswordField1 + /= Nothing + + pwc = + PasswordChange + (Maybe.withDefault "" model.oldPasswordField) + (Maybe.withDefault "" model.newPasswordField1) + in + if bothEqual then + ( model, Api.changePassword flags pwc SaveResp ) + + else + ( { model | banner = Just <| Banner False "Passwords don't match." } + , Cmd.none + ) diff --git a/modules/webapp/src/main/elm/Page/Settings/View.elm b/modules/webapp/src/main/elm/Page/Settings/View.elm new file mode 100644 index 00000000..a6d53ae5 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Settings/View.elm @@ -0,0 +1,118 @@ +module Page.Settings.View exposing (view) + +import Comp.PasswordInput +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Page.Settings.Data exposing (Model, Msg(..)) + + +view : Model -> Html Msg +view model = + div [ class "ui text container account-page" ] + [ h1 [ class "ui dividing header" ] + [ i [ class "ui cog icon" ] [] + , text "Settings" + ] + , banner model + , emailForm model + , changePasswordForm model + ] + + +emailForm : Model -> Html Msg +emailForm model = + div [ class "ui segments" ] + [ div [ class "ui segment" ] + [ h2 [ class "ui header" ] + [ text "Change your E-Mail" + ] + , Html.form [ class "ui form" ] + [ div [ class "ui field" ] + [ label [] [ text "New E-Mail" ] + , input + [ type_ "text" + , placeholder "E-Mail address" + , onInput SetEmail + , Maybe.withDefault "" model.emailField + |> value + ] + [] + ] + , p [] + [ text "Submitting an empty form deletes the E-Mail address." + ] + ] + ] + , div [ class "ui secondary segment" ] + [ button + [ type_ "button" + , class "ui primary button" + , onClick SubmitEmail + ] + [ text "Submit" + ] + ] + ] + + +changePasswordForm : Model -> Html Msg +changePasswordForm model = + div [ class "ui segments" ] + [ div [ class "ui segment" ] + [ h2 [ class "ui header" ] + [ text "Change Password" + ] + , Html.form [ class "ui form" ] + [ div [ class "ui required field" ] + [ label [] [ text "Current Password" ] + , Html.map SetOldPassword + (Comp.PasswordInput.view + model.oldPasswordField + model.oldPasswordModel + ) + ] + , div [ class "ui required field" ] + [ label [] [ text "New Password" ] + , Html.map SetNewPassword1 + (Comp.PasswordInput.view + model.newPasswordField1 + model.newPasswordModel1 + ) + ] + , div [ class "ui required field" ] + [ label [] [ text "New Password (Repeat)" ] + , Html.map SetNewPassword2 + (Comp.PasswordInput.view + model.newPasswordField2 + model.newPasswordModel2 + ) + ] + ] + ] + , div [ class "ui secondary segment" ] + [ button + [ type_ "button" + , class "ui primary button" + , onClick SubmitPassword + ] + [ text "Submit" + ] + ] + ] + + +banner : Model -> Html Msg +banner model = + div + [ classList + [ ( "ui message", True ) + , ( "hidden invisible", model.banner == Nothing ) + , ( "error", Maybe.map .success model.banner == Just False ) + , ( "success", Maybe.map .success model.banner == Just True ) + ] + ] + [ Maybe.map .text model.banner + |> Maybe.withDefault "" + |> text + ] diff --git a/modules/webapp/src/main/elm/Page/Share/Data.elm b/modules/webapp/src/main/elm/Page/Share/Data.elm new file mode 100644 index 00000000..73dd64ec --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Share/Data.elm @@ -0,0 +1,83 @@ +module Page.Share.Data exposing (Model, Msg(..), emptyModel, makeProps) + +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.IdResult exposing (IdResult) +import Api.Model.ShareProperties exposing (ShareProperties) +import Comp.Dropzone2 +import Comp.IntField +import Comp.MarkdownInput +import Comp.PasswordInput +import Comp.ValidityField +import Data.Flags exposing (Flags) +import Data.UploadDict exposing (UploadDict) +import Data.UploadState exposing (UploadState) +import Data.ValidityValue exposing (ValidityValue) +import Http + + +type alias Model = + { dropzoneModel : Comp.Dropzone2.Model + , uploads : UploadDict + , validityModel : Comp.ValidityField.Model + , validityField : ValidityValue + , passwordModel : Comp.PasswordInput.Model + , passwordField : Maybe String + , maxViewModel : Comp.IntField.Model + , maxViewField : Maybe Int + , descModel : Comp.MarkdownInput.Model + , descField : String + , nameField : Maybe String + , formState : BasicResult + , uploading : Bool + , shareId : Maybe String + , showDetails : Bool + , uploadPaused : Bool + } + + +emptyModel : Flags -> Model +emptyModel flags = + { dropzoneModel = Comp.Dropzone2.init + , uploads = Data.UploadDict.empty + , validityModel = Comp.ValidityField.init flags + , validityField = Data.ValidityValue.Days 2 + , passwordModel = Comp.PasswordInput.init + , passwordField = Nothing + , maxViewModel = Comp.IntField.init (Just 1) Nothing "Maximum Public Views" + , maxViewField = Just 30 + , descModel = Comp.MarkdownInput.init + , descField = "" + , nameField = Nothing + , formState = BasicResult True "" + , uploading = False + , shareId = Nothing + , showDetails = False + , uploadPaused = False + } + + +type Msg + = DropzoneMsg Comp.Dropzone2.Msg + | ValidityMsg Comp.ValidityField.Msg + | PasswordMsg Comp.PasswordInput.Msg + | MaxViewMsg Comp.IntField.Msg + | DescMsg Comp.MarkdownInput.Msg + | SetName String + | ClearFiles + | Submit + | CreateShareResp (Result Http.Error IdResult) + | Uploading UploadState + | ToggleDetails + | StartStopUpload + | UploadStopped (Maybe String) + | ResetForm + + +makeProps : Model -> ShareProperties +makeProps model = + { name = model.nameField + , validity = Data.ValidityValue.toMillis model.validityField + , description = Just model.descField + , maxViews = Maybe.withDefault 10 model.maxViewField + , password = model.passwordField + } diff --git a/modules/webapp/src/main/elm/Page/Share/Update.elm b/modules/webapp/src/main/elm/Page/Share/Update.elm new file mode 100644 index 00000000..70e076c7 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Share/Update.elm @@ -0,0 +1,221 @@ +module Page.Share.Update exposing (update) + +import Api +import Api.Model.BasicResult exposing (BasicResult) +import Comp.Dropzone2 +import Comp.IntField +import Comp.MarkdownInput +import Comp.PasswordInput +import Comp.ValidityField +import Data.Flags exposing (Flags) +import Data.UploadData exposing (UploadData) +import Data.UploadDict +import Data.UploadState exposing (UploadState) +import Dict +import File +import Page.Share.Data exposing (Model, Msg(..), makeProps) +import Ports +import Util.Http +import Util.Maybe +import Util.Share + + +update : Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update flags msg model = + case msg of + DropzoneMsg lmsg -> + let + ( m, c, fs ) = + Comp.Dropzone2.update model.uploads.selectedFiles lmsg model.dropzoneModel + in + ( { model + | dropzoneModel = m + , uploads = Data.UploadDict.updateFiles model.uploads fs + , formState = BasicResult True "" + } + , Cmd.batch [ Cmd.map DropzoneMsg c ] + ) + + ValidityMsg lmsg -> + let + ( m, sel ) = + Comp.ValidityField.update lmsg model.validityModel + in + ( { model + | validityModel = m + , validityField = Maybe.withDefault model.validityField sel + } + , Cmd.none + ) + + PasswordMsg lmsg -> + let + ( m, pw ) = + Comp.PasswordInput.update lmsg model.passwordModel + in + ( { model | passwordModel = m, passwordField = pw } + , Cmd.none + ) + + MaxViewMsg lmsg -> + let + ( m, v ) = + Comp.IntField.update lmsg model.maxViewModel + in + ( { model + | maxViewModel = m + , maxViewField = v + } + , Cmd.none + ) + + DescMsg lmsg -> + let + ( m, txt ) = + Comp.MarkdownInput.update model.descField lmsg model.descModel + in + ( { model + | descModel = m + , descField = txt + , formState = BasicResult True "" + } + , Cmd.none + ) + + SetName str -> + ( { model | nameField = Util.Maybe.fromString str } + , Cmd.none + ) + + ClearFiles -> + ( { model | uploads = Data.UploadDict.updateFiles model.uploads [] }, Cmd.none ) + + Submit -> + let + valid = + Util.Share.validate flags Nothing model + in + if valid.success then + ( { model + | uploading = True + , showDetails = False + } + , Api.createEmptyShare flags (makeProps model) CreateShareResp + ) + + else + ( { model | formState = valid } + , Cmd.none + ) + + CreateShareResp (Ok idres) -> + let + ( native, files ) = + List.unzip model.uploads.selectedFiles + + uploadUrl = + flags.config.baseUrl ++ "/api/v2/sec/upload/" ++ idres.id ++ "/files/tus" + + submit = + if native == [] then + Cmd.none + + else + UploadData uploadUrl idres.id native Nothing + |> Data.UploadData.encode + |> Ports.submitFiles + in + if idres.success then + ( { model | shareId = Just idres.id }, submit ) + + else + ( { model | formState = BasicResult False idres.message } + , Cmd.none + ) + + CreateShareResp (Err err) -> + ( { model + | formState = BasicResult False (Util.Http.errorToString err) + , uploading = False + } + , Cmd.none + ) + + Uploading state -> + if Just state.id == model.shareId then + trackUpload model state + + else + ( model, Cmd.none ) + + ToggleDetails -> + ( { model | showDetails = not model.showDetails }, Cmd.none ) + + StartStopUpload -> + case model.shareId of + Just id -> + ( model + , if model.uploadPaused then + Ports.startUpload id + + else + Ports.stopUpload id + ) + + Nothing -> + ( model, Cmd.none ) + + UploadStopped err -> + let + infoMsg = + case err of + Just m -> + BasicResult False m + + Nothing -> + model.formState + in + ( { model + | uploadPaused = err == Nothing + , formState = infoMsg + } + , Cmd.none + ) + + ResetForm -> + ( Page.Share.Data.emptyModel flags, Cmd.none ) + + +trackUpload : Model -> UploadState -> ( Model, Cmd Msg ) +trackUpload model state = + let + ( next, progress ) = + Data.UploadDict.trackUpload model.uploads state + + progressCmd p = + case p of + Data.UploadDict.FileProgress index perc -> + [ ( "file-progress-" ++ String.fromInt index + , perc + ) + ] + + Data.UploadDict.AllProgress perc -> + [ ( "all-progress", perc ) + ] + + infoMsg = + case state.state of + Data.UploadState.Failed em -> + BasicResult False em + + _ -> + model.formState + in + ( { model + | uploads = next + , uploadPaused = False + , formState = infoMsg + } + , Ports.setProgress (List.concatMap progressCmd progress) + ) diff --git a/modules/webapp/src/main/elm/Page/Share/View.elm b/modules/webapp/src/main/elm/Page/Share/View.elm new file mode 100644 index 00000000..0693a00a --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Share/View.elm @@ -0,0 +1,241 @@ +module Page.Share.View exposing (view) + +import Comp.Dropzone2 +import Comp.IntField +import Comp.MarkdownInput +import Comp.PasswordInput +import Comp.ValidityField +import Data.Flags exposing (Flags) +import Data.UploadDict exposing (countDone) +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Page exposing (Page(..)) +import Page.Share.Data exposing (Model, Msg(..)) + + +view : Flags -> Model -> Html Msg +view flags model = + let + counts = + countDone model.uploads + + allDone = + model.shareId + /= Nothing + && Tuple.first counts + + Tuple.second counts + == List.length model.uploads.selectedFiles + in + div [] + [ div [ class "ui container" ] + [ h1 [ class "ui dividing header" ] + [ i [ class "ui share alternate icon" ] [] + , text "Create a Share" + ] + ] + , div [ class "ui container" ] + [ p [] [] + , div + [ classList + [ ( "ui small form", True ) + , ( "error", not model.formState.success || Tuple.second counts > 0 ) + , ( "success", Tuple.second counts == 0 ) + ] + ] + [ if allDone then + doneMessageBox counts model + + else + controls model + , Data.Flags.limitsMessage flags + [ class "ui info message" ] + , div [ class "ui error message" ] + [ text model.formState.message + ] + , div [ class "ui accordion" ] + [ div + [ classList + [ ( "ui header title", True ) + , ( "active", model.showDetails ) + ] + , onClick ToggleDetails + ] + [ i [ class "dropdown icon" ] [] + , text "Details" + ] + , div + [ classList + [ ( "content", True ) + , ( "active", model.showDetails ) + ] + ] + [ div [ class "field" ] + [ label [] [ text "Description" ] + , Html.map DescMsg + (Comp.MarkdownInput.view + model.descField + model.descModel + ) + ] + , div [ class "two fields" ] + [ div [ class "field" ] + [ label [] [ text "Name" ] + , input + [ type_ "text" + , placeholder "Optional Name" + , onInput SetName + ] + [] + ] + , div [ class "required field" ] + [ label [] [ text "Validity" ] + , Html.map ValidityMsg + (Comp.ValidityField.view + model.validityField + model.validityModel + ) + ] + ] + , div [ class "two fields" ] + [ Html.map MaxViewMsg + (Comp.IntField.view + model.maxViewField + model.maxViewModel + ) + , div [ class "field" ] + [ label [] [ text "Password" ] + , Html.map PasswordMsg + (Comp.PasswordInput.view model.passwordField + model.passwordModel + ) + ] + ] + ] + , div [ class "active ui header title" ] + [ i [ class "dropdown icon" ] [] + , text "Files" + ] + , Html.map DropzoneMsg + (Comp.Dropzone2.view + (mkViewSettings model) + model.dropzoneModel + ) + ] + ] + ] + ] + + +doneMessageBox : ( Int, Int ) -> Model -> Html Msg +doneMessageBox ( _, err ) model = + let + buttons = + div [ class "" ] + [ a + [ class "ui primary button" + , href "#" + , onClick ResetForm + ] + [ text "New Share" + ] + , a + [ class "ui secondary button" + , Page.href (DetailPage <| Maybe.withDefault "" model.shareId) + ] + [ text "Goto Share" + ] + ] + + success = + div [ class "ui success icon message" ] + [ i [ class "ui check icon" ] [] + , div [ class "content" ] + [ div [ class "ui header" ] + [ text "All files uploaded" + ] + , div [ class "ui divider" ] [] + , buttons + ] + ] + + error = + div [ class "ui error icon message" ] + [ i [ class "ui meh icon" ] [] + , div [ class "content" ] + [ div [ class "header" ] + [ text "Some files failed" + ] + , p [] + [ text "Some files failed to upload…. " + , text "You can go to the share and try uploading them again." + ] + , div [ class "ui divider" ] [] + , buttons + ] + ] + in + if err > 0 then + error + + else + success + + +controls : Model -> Html Msg +controls model = + div + [ class "field" + ] + [ a + [ classList + [ ( "ui primary button", True ) + , ( "disabled", model.uploading ) + ] + , href "#" + , onClick Submit + ] + [ i [ class "upload icon" ] [] + , text "Submit" + ] + , a + [ onClick ClearFiles + , href "#" + , classList + [ ( "ui basic button", True ) + , ( "disabled", model.uploading ) + ] + ] + [ i [ class "undo icon" ] [] + , text "Clear Files" + ] + , a + [ classList + [ ( "ui right floated basic button", True ) + , ( "disabled", not model.uploading ) + ] + , href "#" + , onClick StartStopUpload + ] + [ i + [ class + (if model.uploadPaused then + "play icon" + + else + "pause icon" + ) + ] + [] + , if model.uploadPaused then + text "Resume" + + else + text "Pause" + ] + ] + + +mkViewSettings : Model -> Comp.Dropzone2.ViewSettings +mkViewSettings model = + Comp.Dropzone2.mkViewSettings (not model.uploading) model.uploads diff --git a/modules/webapp/src/main/elm/Page/Upload/Data.elm b/modules/webapp/src/main/elm/Page/Upload/Data.elm new file mode 100644 index 00000000..13c47b90 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Upload/Data.elm @@ -0,0 +1,30 @@ +module Page.Upload.Data exposing (Model, Msg(..), emptyModel) + +import Api.Model.ShareList exposing (ShareList) +import Api.Model.ShareListItem exposing (ShareListItem) +import Comp.ShareTable +import Http + + +type alias Model = + { selected : Maybe ShareListItem + , searchResult : List ShareListItem + , query : String + , tableModel : Comp.ShareTable.Model + } + + +emptyModel : Model +emptyModel = + { selected = Nothing + , searchResult = [] + , query = "" + , tableModel = Comp.ShareTable.init + } + + +type Msg + = ShareTableMsg Comp.ShareTable.Msg + | SetQuery String + | SearchResp (Result Http.Error ShareList) + | Init diff --git a/modules/webapp/src/main/elm/Page/Upload/Update.elm b/modules/webapp/src/main/elm/Page/Upload/Update.elm new file mode 100644 index 00000000..d6cc3ab2 --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Upload/Update.elm @@ -0,0 +1,45 @@ +module Page.Upload.Update exposing (update) + +import Api +import Browser.Navigation as Nav +import Comp.ShareTable +import Data.Flags exposing (Flags) +import Page exposing (Page(..)) +import Page.Upload.Data exposing (Model, Msg(..)) + + +update : Nav.Key -> Flags -> Msg -> Model -> ( Model, Cmd Msg ) +update key flags msg model = + case msg of + Init -> + ( model, Api.findShares flags model.query SearchResp ) + + SetQuery str -> + ( { model | query = str } + , Api.findShares flags str SearchResp + ) + + ShareTableMsg lmsg -> + let + ( lm, selected ) = + Comp.ShareTable.update lmsg model.tableModel + + cmd = + case selected of + Just id -> + Page.set key (DetailPage id.id) + + Nothing -> + Cmd.none + in + ( { model | tableModel = lm, selected = selected } + , cmd + ) + + SearchResp (Ok list) -> + ( { model | searchResult = list.items } + , Cmd.none + ) + + SearchResp (Err err) -> + ( model, Cmd.none ) diff --git a/modules/webapp/src/main/elm/Page/Upload/View.elm b/modules/webapp/src/main/elm/Page/Upload/View.elm new file mode 100644 index 00000000..ee2c102d --- /dev/null +++ b/modules/webapp/src/main/elm/Page/Upload/View.elm @@ -0,0 +1,57 @@ +module Page.Upload.View exposing (view) + +import Comp.ShareTable +import Html exposing (..) +import Html.Attributes exposing (..) +import Html.Events exposing (onClick, onInput) +import Page exposing (Page(..)) +import Page.Upload.Data exposing (Model, Msg(..)) + + +view : Model -> Html Msg +view model = + div + [ classList + [ ( "ui container upload-page", True ) + ] + ] + (viewList model) + + +viewList : Model -> List (Html Msg) +viewList model = + [ h1 [ class "ui dividing header" ] + [ i [ class "ui share alternate icon" ] [] + , text "Your Shares" + ] + , searchArea model + , Html.map ShareTableMsg (Comp.ShareTable.view model.searchResult model.tableModel) + ] + + +searchArea : Model -> Html Msg +searchArea model = + div [ class "ui secondary menu" ] + [ div [ class "ui container" ] + [ div [ class "fitted-item" ] + [ div [ class "ui icon input" ] + [ input + [ type_ "text" + , onInput SetQuery + , placeholder "Search…" + ] + [] + , i [ class "ui search icon" ] + [] + ] + ] + , div [ class "right menu" ] + [ a + [ class "ui primary button" + , Page.href SharePage + ] + [ text "New Share" + ] + ] + ] + ] diff --git a/modules/webapp/src/main/elm/PageLocation.elm b/modules/webapp/src/main/elm/PageLocation.elm deleted file mode 100644 index 8af074e9..00000000 --- a/modules/webapp/src/main/elm/PageLocation.elm +++ /dev/null @@ -1,172 +0,0 @@ -module PageLocation exposing (..) - -import Navigation -import Http -import Data exposing (UploadId(..), isUnauthorized) - --- index page - -indexPageHref: String -indexPageHref = "#" - -indexPage: Cmd msg -indexPage = - Navigation.newUrl indexPageHref - - --- login page - -loginPageHref: String -loginPageHref = "#login" - -loginPage: Navigation.Location -> Cmd msg -loginPage location = - let - url = - if (String.length location.hash > 1) then - (loginPageHref ++ "&redirect=" ++ location.hash) - else - loginPageHref - in - Navigation.newUrl url - -loginPageRedirect: Navigation.Location -> Cmd msg -loginPageRedirect loc = - let - prefix = loginPageHref ++ "&redirect=#" - url = if String.startsWith prefix loc.hash then - String.dropLeft ((String.length prefix) - 1) loc.hash - else - "#" - in - if url /= timeoutPageHref && url /= loginPageHref then - Navigation.newUrl url - else - indexPage - --- uploads page - -uploadsPageHref: String -uploadsPageHref = "#uploads" - -uploadsPage: Cmd msg -uploadsPage = - Navigation.newUrl uploadsPageHref - - --- download page - -downloadPageHref: UploadId -> String -downloadPageHref uploadId = - case uploadId of - Pid id -> "#id=" ++ id - Uid id -> "#uid=" ++ id - -downloadPage: UploadId -> Cmd msgs -downloadPage id = - Navigation.newUrl (downloadPageHref id) - - -downloadPageId: String -> Maybe UploadId -downloadPageId hash = - if String.startsWith "#id=" hash then - Pid (String.dropLeft 4 hash) |> Just - else if String.startsWith "#uid=" hash then - Uid (String.dropLeft 5 hash) |> Just - else - Nothing - --- account edit page - -accountEditPageHref: String -accountEditPageHref = "#account-edit" - -accountEditPage: Cmd msg -accountEditPage = - Navigation.newUrl accountEditPageHref - - --- new share page - -newSharePageHref: String -newSharePageHref = "#new-share" - -newSharePage: Cmd msg -newSharePage = - Navigation.newUrl newSharePageHref - - --- update account page - -profilePageHref: String -profilePageHref = "#profile" - -profilePage: Cmd msg -profilePage = - Navigation.newUrl profilePageHref - - --- manage alias pages - -aliasListPageHref: String -aliasListPageHref = "#aliases" - -aliasListPage: Cmd msg -aliasListPage = - Navigation.newUrl aliasListPageHref - - --- alias uploadFormModel - -aliasUploadPageHref: String -> String -aliasUploadPageHref id = - "#a=" ++ id - -aliasUploadPageId: String -> Maybe String -aliasUploadPageId hash = - if String.startsWith "#a=" hash then - String.dropLeft 3 hash |> Just - else - Nothing - -aliasUploadPage: String -> Cmd msg -aliasUploadPage id = - Navigation.newUrl (aliasUploadPageHref id) - - --- timeout page - -timeoutPageHref: String -timeoutPageHref = "#timeout" - -timeoutPage: Cmd msg -timeoutPage = - Navigation.newUrl timeoutPageHref - -timeoutCmd: Http.Error -> Cmd msg -timeoutCmd err = - if Data.isUnauthorized err then - timeoutPage - else - Cmd.none - --- manual page - -manualPageHref: String -> String -manualPageHref name = - "#manual/" ++ name - -manualPageName: String -> Maybe String -manualPageName hash = - if String.startsWith "#manual/" hash then - String.dropLeft 8 hash |> Just - else - Nothing - --- error page -errorPageHref: String -errorPageHref = "#error" - -errorPage: Cmd msg -errorPage = - Navigation.newUrl errorPageHref diff --git a/modules/webapp/src/main/elm/Pages/AccountEdit/Model.elm b/modules/webapp/src/main/elm/Pages/AccountEdit/Model.elm deleted file mode 100644 index d9f91c84..00000000 --- a/modules/webapp/src/main/elm/Pages/AccountEdit/Model.elm +++ /dev/null @@ -1,23 +0,0 @@ -module Pages.AccountEdit.Model exposing(..) - -import Http -import Data exposing (Account, RemoteUrls) - -import Widgets.AccountForm as AccountForm -import Widgets.LoginSearch as LoginSearch - -type alias Model = - { search: LoginSearch.Model - , accountForm: Maybe AccountForm.Model - , errorMsg: String - , urls: RemoteUrls - } - -emptyModel: RemoteUrls -> Model -emptyModel urls = - Model (LoginSearch.initModel urls) Nothing "" urls - -type Msg - = NewAccount - | AccountFormMsg AccountForm.Msg - | LoginSearchMsg LoginSearch.Msg diff --git a/modules/webapp/src/main/elm/Pages/AccountEdit/Update.elm b/modules/webapp/src/main/elm/Pages/AccountEdit/Update.elm deleted file mode 100644 index 09ecb947..00000000 --- a/modules/webapp/src/main/elm/Pages/AccountEdit/Update.elm +++ /dev/null @@ -1,51 +0,0 @@ -module Pages.AccountEdit.Update exposing (..) - -import Data exposing (Account) -import Pages.AccountEdit.Model exposing (..) - -import Widgets.AccountForm as AccountForm -import Widgets.LoginSearch as LoginSearch - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - let - search = model.search - in - case msg of - NewAccount -> - let - acc = Data.emptyAccount - in - ({model - | accountForm = Just (AccountForm.createAccount model.urls model.search.login) - , search = LoginSearch.initModel model.urls - , errorMsg = "" - } - , Cmd.none) - - LoginSearchMsg msg -> - let - (val, cmd, acc) = LoginSearch.update msg model.search - in - case acc of - Just a -> - ({model - | search = val - , accountForm = Just (AccountForm.modifyAccount model.urls a) - } - , Cmd.map LoginSearchMsg cmd) - - Nothing -> - ({model | search = val}, Cmd.map LoginSearchMsg cmd) - - AccountFormMsg msg -> - case model.accountForm of - Just m -> - let - (val, cmd) = AccountForm.update msg m - in - ({model | accountForm = Just val} - ,Cmd.map AccountFormMsg cmd) - - Nothing -> - (model, Cmd.none) diff --git a/modules/webapp/src/main/elm/Pages/AccountEdit/View.elm b/modules/webapp/src/main/elm/Pages/AccountEdit/View.elm deleted file mode 100644 index c55bf646..00000000 --- a/modules/webapp/src/main/elm/Pages/AccountEdit/View.elm +++ /dev/null @@ -1,103 +0,0 @@ -module Pages.AccountEdit.View exposing (..) - -import List -import Html exposing (Html, div, text, span, i, input, a, p, h2) -import Html.Attributes exposing (class, classList) -import Html.Events exposing (onClick) - -import Data exposing (Account) - -import Widgets.AccountForm as AccountForm -import Widgets.LoginSearch as LoginSearch - -import Pages.AccountEdit.Model exposing (..) -import Pages.AccountEdit.Update exposing (..) - -view: Model -> Html Msg -view model = - let - accForm = - case model.accountForm of - Just acc -> Html.map AccountFormMsg (AccountForm.view acc) - Nothing -> div[][] - in - div [class "main ui grid container"] - [ - div [class "ui two column centered row"] - [ - div [class "column"] - (viewSearchAndButton model) - ] - ,div [class "row"] - [ - div [class "ten wide column"] - [accForm] - ,div [class "six wide column"] - (infoMessage model) - ] - ] - -infoMessage: Model -> List (Html a) -infoMessage model = - case model.accountForm of - Just account -> - [ - h2 [class "ui horizontal divider header"] - [ - text (toString account.update) - ] - , (infoText account) - ] - Nothing -> - [] - -infoText: AccountForm.Model -> Html a -infoText model = - case model.update of - AccountForm.Modify -> - modifyHint - AccountForm.Create -> - createHint - -modifyHint: Html a -modifyHint = - Data.markdownHtml """ -This will update the account as follows: - -* leave `password` empty to not change it -* `Email` is optional, used to send a new passwords and notifications on received files -""" - -createHint: Html a -createHint = - Data.markdownHtml """ -Create a new account: - -* supply `Password` for internal accounts -* do not set `Password` for external accounts -* login names must be alphanumeric and start with a letter -* `Email` is optional, used to send a new passwords and notifications on received files -""" - -viewSearchAndButton: Model -> List (Html Msg) -viewSearchAndButton model = - [ - div [class "ui raised brown segment"] - [ - (Html.map LoginSearchMsg (LoginSearch.view model.search)) - ,div [class "ui horizontal divider"][text "Or"] - ,a [class "ui brown labeled icon button", onClick NewAccount] - [ - text "Create New Account" - ,i [class "add icon"][] - ] - ,div [classList - [ ("row ui error message", True) - , ("hidden", model.errorMsg == "") - , ("visible", (String.length model.errorMsg > 0)) - ] - ] - [ span [] [ text model.errorMsg ] - ] - ] - ] diff --git a/modules/webapp/src/main/elm/Pages/AliasList/Model.elm b/modules/webapp/src/main/elm/Pages/AliasList/Model.elm deleted file mode 100644 index 78f1666d..00000000 --- a/modules/webapp/src/main/elm/Pages/AliasList/Model.elm +++ /dev/null @@ -1,19 +0,0 @@ -module Pages.AliasList.Model exposing (..) - -import Data exposing (Alias, RemoteConfig, RemoteUrls) -import Widgets.AliasList as AliasList - -type alias Model = - {aliasList: AliasList.Model - ,urls: RemoteUrls - } - -emptyModel: RemoteConfig -> Model -emptyModel cfg = - Model (AliasList.emptyModel cfg) cfg.urls - -makeModel: RemoteConfig -> List Alias -> Model -makeModel cfg alia = - Model (AliasList.makeModel cfg alia) cfg.urls - -type Msg = AliasListMsg AliasList.Msg diff --git a/modules/webapp/src/main/elm/Pages/AliasList/Update.elm b/modules/webapp/src/main/elm/Pages/AliasList/Update.elm deleted file mode 100644 index 5442befe..00000000 --- a/modules/webapp/src/main/elm/Pages/AliasList/Update.elm +++ /dev/null @@ -1,14 +0,0 @@ -module Pages.AliasList.Update exposing (..) - -import Data exposing (defer) -import Pages.AliasList.Model exposing (..) -import Widgets.AliasList as AliasList - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - AliasListMsg msg -> - let - (m, c) = AliasList.update msg model.aliasList - in - {model | aliasList = m} ! [Cmd.map AliasListMsg c] diff --git a/modules/webapp/src/main/elm/Pages/AliasList/View.elm b/modules/webapp/src/main/elm/Pages/AliasList/View.elm deleted file mode 100644 index 108d9d3c..00000000 --- a/modules/webapp/src/main/elm/Pages/AliasList/View.elm +++ /dev/null @@ -1,19 +0,0 @@ -module Pages.AliasList.View exposing (..) - -import Html exposing (Html, div, text, h1, p) -import Html.Attributes exposing (class) - -import Widgets.AliasList as AliasList -import Pages.AliasList.Model exposing (..) - -view: Model -> Html Msg -view model = - div [class "main ui grid container"] - [ - div [class "sixteen wide column"] - [ - h1 [class "header"] [text "Aliases"] - ,p[][text "Aliases are pages where other people can upload files for you."] - ,(Html.map AliasListMsg (AliasList.view model.aliasList)) - ] - ] diff --git a/modules/webapp/src/main/elm/Pages/AliasUpload/Model.elm b/modules/webapp/src/main/elm/Pages/AliasUpload/Model.elm deleted file mode 100644 index 924d9e7d..00000000 --- a/modules/webapp/src/main/elm/Pages/AliasUpload/Model.elm +++ /dev/null @@ -1,94 +0,0 @@ -module Pages.AliasUpload.Model exposing (..) - -import Http - -import Resumable -import Data exposing (Account, Alias, RemoteConfig) -import Widgets.AliasUploadForm as AliasUploadForm -import Widgets.UploadProgress as UploadProgress -import Widgets.MarkdownHelp as MarkdownHelp -import Widgets.MarkdownEditor as MarkdownEditor - -type Mode - = Form - | Upload - | Done - -type alias Model = - {cfg: RemoteConfig - ,alia: Maybe Alias - ,uploadForm: AliasUploadForm.Model - ,uploadProgress: UploadProgress.Model - ,mode: Mode - ,errorMessage: String - ,account: Maybe Account - ,markdownEditorModel: Maybe MarkdownEditor.Model - ,showMarkdownHelp: Bool - } - -emptyModel: RemoteConfig -> Maybe Account -> Model -emptyModel cfg acc = - Model cfg Nothing (AliasUploadForm.emptyModel cfg) UploadProgress.emptyModel Form "" acc Nothing False - -makeModel: RemoteConfig -> Maybe Account -> Alias -> Model -makeModel cfg acc alia = - let - empty = emptyModel cfg acc - in - {empty | alia = Just alia} - -clearModel: Model -> Model -clearModel model = - { cfg = model.cfg - , alia = model.alia - , uploadForm = AliasUploadForm.clearModel model.uploadForm - , uploadProgress = UploadProgress.emptyModel - , mode = Form - , errorMessage = "" - , account = model.account - , markdownEditorModel = Nothing - , showMarkdownHelp = False - } - -isAliasUser: Model -> Bool -isAliasUser model = - case (model.account, model.alia) of - (Just ac, Just al) -> - ac.login == al.login - _ -> - False - -isValidAlias: Model -> Bool -isValidAlias model = - model.alia - |> Maybe.map .enable - |> Maybe.withDefault False - - -hasError: Model -> Bool -hasError model = - not <| String.isEmpty model.errorMessage - -clearError: Model -> Model -clearError model = - {model | errorMessage = ""} - - -type Msg - = AliasUploadFormMsg AliasUploadForm.Msg - | UploadProgressMsg UploadProgress.Msg - | InitUpload - | UploadCreated (Result Http.Error ()) - | CancelUpload - | ResetForm - | UploadDeleted (Result Http.Error Int) - | NotifyResult (Result Http.Error ()) - | ToggleMarkdownEditor - | MarkdownEditorMsg MarkdownEditor.Msg - | ToggleMarkdownHelp - -makeResumableMsg: Resumable.Msg -> List Msg -makeResumableMsg rmsg = - [AliasUploadFormMsg (AliasUploadForm.ResumableMsg rmsg) - ,UploadProgressMsg (UploadProgress.ResumableMsg rmsg) - ] diff --git a/modules/webapp/src/main/elm/Pages/AliasUpload/Update.elm b/modules/webapp/src/main/elm/Pages/AliasUpload/Update.elm deleted file mode 100644 index de7aea85..00000000 --- a/modules/webapp/src/main/elm/Pages/AliasUpload/Update.elm +++ /dev/null @@ -1,184 +0,0 @@ -module Pages.AliasUpload.Update exposing (..) - -import Http -import Json.Decode as Decode -import Json.Encode as Encode - -import Resumable -import Ports -import Data exposing (defer) -import PageLocation as PL -import Pages.AliasUpload.Model exposing (..) -import Widgets.AliasUploadForm as AliasUploadForm -import Widgets.UploadProgress as UploadProgress -import Widgets.MarkdownEditor as MarkdownEditor - -update: Msg -> Model -> (Model, Cmd Msg, Cmd Msg) -update msg model = - case msg of - AliasUploadFormMsg msg -> - let - (um, ucmd, ucmdd) = AliasUploadForm.update msg model.uploadForm - in - {model | uploadForm = um} ! [Cmd.map AliasUploadFormMsg ucmd] |> defer (Cmd.map AliasUploadFormMsg ucmdd) - - UploadProgressMsg msg -> - let - (um, ucmd) = UploadProgress.update msg model.uploadProgress - model_ = {model | uploadProgress = um} - in - model_ ! [Cmd.map UploadProgressMsg ucmd, httpNotifyWhenDone model_] |> defer Cmd.none - - InitUpload -> - model ! [httpInitUpload model] |> defer Cmd.none - - UploadCreated (Ok ()) -> - let - ufm = model.uploadForm - um = {ufm | errorMessage = Nothing} - handle = Maybe.withDefault "" model.uploadForm.resumableModel.handle - (cmd1, cmd2) = - if AliasUploadForm.hasFiles model.uploadForm then - (Ports.resumableStart handle, Cmd.none) - else - (Cmd.none, Ports.resumableSetComplete (handle, "."++UploadProgress.progressClass)) - in - {model | mode = Upload, uploadForm = um} ! [cmd1] |> defer cmd2 - - UploadCreated (Err error) -> - let - ufm = model.uploadForm - um = {ufm | errorMessage = Just (Data.errorMessage error)} - in - {model | uploadForm = um} ! [PL.timeoutCmd error] |> defer Cmd.none - - ResetForm -> - clearModel model ! [Ports.reloadPage ()] |> defer Cmd.none - - CancelUpload -> - let - handle = Maybe.withDefault "" model.uploadForm.resumableModel.handle - in - model ! [Ports.resumableCancel handle, httpDeleteUpload model] |> defer Cmd.none - - UploadDeleted (Ok n) -> - -- its a little hacky: going back means to rebind the resumable handlers - let - handle = Maybe.withDefault "" model.uploadForm.resumableModel.handle - cmd = Ports.resumableRebind handle - in - clearModel model ! [] |> defer cmd - - UploadDeleted (Err error) -> - let - m = clearModel model - in - {m | errorMessage = Data.errorMessage error} ! [PL.timeoutCmd error] |> defer Cmd.none - - NotifyResult res -> - model ! [] |> defer Cmd.none - - MarkdownEditorMsg memsg -> - case model.markdownEditorModel of - Just mem -> - let - (mem_, cmd) = MarkdownEditor.update memsg mem - in - {model | markdownEditorModel = Just mem_} ! [Cmd.map MarkdownEditorMsg cmd] |> defer Cmd.none - Nothing -> - model ! [] |> defer Cmd.none - - ToggleMarkdownEditor -> - case model.markdownEditorModel of - Just mem -> - let - ufm = model.uploadForm - ufm_ = {ufm | description = mem.text} - -- its a little hacky: going back means to rebind the resumable handlers - handle = Maybe.withDefault "" model.uploadForm.resumableModel.handle - cmd = Ports.resumableRebind handle - in - {model | markdownEditorModel = Nothing, uploadForm = ufm_} ! [] |> defer cmd - Nothing -> - let - mem = MarkdownEditor.initModel model.uploadForm.description - in - {model | markdownEditorModel = Just mem} ! [] |> defer Cmd.none - - ToggleMarkdownHelp -> - {model | showMarkdownHelp = not model.showMarkdownHelp} ! [] |> defer Cmd.none - - -modelEncoder: Model -> Encode.Value -modelEncoder model = - let - up = model.uploadForm - in - Encode.object - [ ("id", Encode.string (Maybe.withDefault "" up.resumableModel.handle)) - , ("description", Encode.string up.description) - , ("validity", Encode.string "1h") -- dummy values follow - , ("maxdownloads", Encode.int 30) - , ("password", Encode.string "") - ] - - -httpInitUpload: Model -> Cmd Msg -httpInitUpload model = - case model.alia of - Just a -> - let - header = Http.header model.cfg.aliasHeaderName a.id - url = model.cfg.urls.uploads - in - httpPost url header (Http.jsonBody (modelEncoder model)) (Decode.succeed ()) - |> Http.send UploadCreated - Nothing -> - Cmd.none - - -httpDeleteUpload: Model -> Cmd Msg -httpDeleteUpload model = - case (model.uploadForm.resumableModel.handle, model.alia) of - (Just h, Just a) -> - let - header = Http.header model.cfg.aliasHeaderName a.id - url = model.cfg.urls.uploads ++"/"++ h - in - httpDelete url header Http.emptyBody (Decode.field "filesRemoved" Decode.int) - |> Http.send UploadDeleted - _ -> - Cmd.none - -httpNotifyWhenDone: Model -> Cmd Msg -httpNotifyWhenDone model = - if UploadProgress.isComplete model.uploadProgress then - let - header = Http.header model.cfg.aliasHeaderName (model.alia |> Maybe.map .id |> Maybe.withDefault "") - handle = Maybe.withDefault "" model.uploadForm.resumableModel.handle - url = model.cfg.urls.uploadNotify ++"/"++ handle - in - httpPost url header Http.emptyBody (Decode.succeed ()) - |> Http.send NotifyResult - else - Cmd.none - - -httpPost: String -> Http.Header -> Http.Body -> Decode.Decoder a -> (Http.Request a) -httpPost = httpMethod "POST" - -httpDelete: String -> Http.Header -> Http.Body -> Decode.Decoder a -> (Http.Request a) -httpDelete = httpMethod "DELETE" - - -httpMethod: String -> String -> Http.Header -> Http.Body -> Decode.Decoder a -> (Http.Request a) -httpMethod method url header body dec = - Http.request - { method = method - , headers = [header] - , url = url - , body = body - , expect = Http.expectJson dec - , timeout = Nothing - , withCredentials = False - } diff --git a/modules/webapp/src/main/elm/Pages/AliasUpload/View.elm b/modules/webapp/src/main/elm/Pages/AliasUpload/View.elm deleted file mode 100644 index 98f9287b..00000000 --- a/modules/webapp/src/main/elm/Pages/AliasUpload/View.elm +++ /dev/null @@ -1,222 +0,0 @@ -module Pages.AliasUpload.View exposing (..) - -import Html exposing (Html, a, div, text, h1, h2, h3, button, i) -import Html.Attributes exposing (class, classList) -import Html.Events exposing (onClick) - -import Data -import Pages.AliasUpload.Model exposing (..) -import Widgets.AliasUploadForm as AliasUploadForm -import Widgets.UploadProgress as UploadProgress -import Widgets.MarkdownEditor as MarkdownEditor -import Widgets.MarkdownHelp as MarkdownHelp - -view: Model -> Html Msg -view model = - case model.markdownEditorModel of - Just mem -> - div [] - [ - div [class "main ui grid container"] - [ - div [class "row"] - [button [class "ui primary button", onClick ToggleMarkdownEditor][text "Back"] - ,button [class "ui button", onClick ToggleMarkdownHelp][text "Help"] - ] - ,div [class "row"] - [ - div [class "ui"] - [text "Write Markdown in the left input below and a preview is displayed " - ,text "at the right as you type. Click Help button to show syntax help." - ] - ] - ] - ,if model.showMarkdownHelp then - markdownHelp - else - Html.map MarkdownEditorMsg (MarkdownEditor.view mem) - ] - - Nothing -> - div [class "main ui grid container"] - [(mainView model)] - - -mainView: Model -> Html Msg -mainView model = - div [class "main ui grid container"] - [ - (userDimmer model) - ,(emptyAliasDimmer model) - ,div [class "sixteen wide column"] - [h1 [class "ui header"][text "Upload your files here"] - ,(renderError model) - ] - ,div [class "sixteen wide column"] - (stepView model) - ] - -markdownHelp: Html Msg -markdownHelp = - div [onClick ToggleMarkdownHelp] - [h3 [class "ui horizontal clearing divider header"] - [i [class "help icon"][] - ,text "Markdown Help" - ] - ,div [class "ui center aligned segment"] - [text "Click somewhere on the help text to close it."] - ,MarkdownHelp.helpTextHtml - ] - -stepView: Model -> List (Html Msg) -stepView model = - case model.mode of - Form -> - [ - button [class "ui basic button", onClick ToggleMarkdownEditor][text "Description Editor"] - ,(Html.map AliasUploadFormMsg (AliasUploadForm.view model.uploadForm)) - ,(uploadButton model) - ,(cancelButton model) - ] - - Upload -> - [ - Html.map UploadProgressMsg (UploadProgress.view model.uploadProgress) - ,(doneMessage model) - ,(cancelButton model) - ,(moreButton model) - ] - - Done -> - [div [][text "Everything uploaded."]] - -userDimmer: Model -> Html Msg -userDimmer model = - div [classList [("ui inverted dimmer", True) - ,("active", isAliasUser model)]] - [ - div [class "content"] - [ - div [class "ui center aligned grid"] - [ - div [class "sixteen wide column"] - [ - h2 [class "ui icon header"] - [ - i [class "info icon"][] - ,text "Let me explain…" - ] - ] - ,div [class "eight wide column"] - [ - div [class "ui info message"] - [Data.markdownHtml - """This page is not intended for - you. Rather give the URL away to - other, _anonymous_, users to allow - them sending files to you. You - receive all files uploaded through - this page in _My Uploads_.""" - - ] - ] - ] - ] - ] - -emptyAliasDimmer: Model -> Html Msg -emptyAliasDimmer model = - div [classList [("ui dimmer", True) - ,("active", not (isValidAlias model))]] - [div [class "content"] - [div [class "ui center aligned grid"] - [div [class "sixteen wide column"] - [h2 [class "ui inverted icon header"] - [i [class "warning sign icon"][] - ,text "Not Found" - ] - ] - ,div [class "eight wide column"] - [div [class "ui inverted error message"] - [text "The alias was not found"] - ] - ] - ] - ] - -doneMessage: Model -> Html Msg -doneMessage model = - if nextStepDisabled Done model || UploadProgress.hasErrors model.uploadProgress then - div[][] - else - div [class "ui success message"] - [ - div [class "header"][text "All done."] - ,div [class "content"] - [Data.markdownHtml - """Your files have been uploaded. If you changed - your mind, you can remove them by clicking the - _Delete_ button. To upload more, simply refresh - the page or click the _More…_ button.""" - - ] - ] - -moreButton: Model -> Html Msg -moreButton model = - if nextStepDisabled Done model then - div[][] - else - button [class "ui primary button", onClick ResetForm] - [ - i [class "add icon"][] - ,text "More …" - ] - -uploadButton: Model -> Html Msg -uploadButton model = - button [classList [("ui primary button", True) - ,("disabled", nextStepDisabled Upload model) - ] - , onClick InitUpload - ] - [i [class "upload icon"][] - ,text "Upload" - ] - -cancelButton: Model -> Html Msg -cancelButton model = - let - action = if model.mode == Upload then CancelUpload else ResetForm - btntext = if model.mode == Form then - "Reset" - else if UploadProgress.isComplete model.uploadProgress then - "Delete" - else - "Cancel" - in - a [class "ui labeled basic icon button", onClick action] - [ - i [class "cancel icon"][] - ,text btntext - ] - -renderError: Model -> Html Msg -renderError model = - if hasError model then - div [class "ui error message"] - [text model.errorMessage] - else - div [][] - -nextStepDisabled: Mode -> Model -> Bool -nextStepDisabled mode model = - case (model.mode, mode) of - (Form, Upload) -> - not (AliasUploadForm.isReady model.uploadForm) - - (Upload, Done) -> - not (UploadProgress.isComplete model.uploadProgress) - - _ -> - True diff --git a/modules/webapp/src/main/elm/Pages/Download/Model.elm b/modules/webapp/src/main/elm/Pages/Download/Model.elm deleted file mode 100644 index dcdeadc9..00000000 --- a/modules/webapp/src/main/elm/Pages/Download/Model.elm +++ /dev/null @@ -1,19 +0,0 @@ -module Pages.Download.Model exposing (..) - -import Data exposing (Account, UploadInfo, RemoteConfig) -import Widgets.DownloadView as DownloadView - -type alias Model = - {uploadViewModel: Maybe DownloadView.Model - } - -emptyModel: Model -emptyModel = Model Nothing - -makeModel: UploadInfo -> RemoteConfig -> Maybe Account -> Model -makeModel um cfg acc = - Model (Just (DownloadView.makeModel um cfg acc)) - - -type Msg - = DownloadViewMsg DownloadView.Msg diff --git a/modules/webapp/src/main/elm/Pages/Download/Update.elm b/modules/webapp/src/main/elm/Pages/Download/Update.elm deleted file mode 100644 index 65868485..00000000 --- a/modules/webapp/src/main/elm/Pages/Download/Update.elm +++ /dev/null @@ -1,18 +0,0 @@ -module Pages.Download.Update exposing (..) - -import Pages.Download.Model exposing (..) -import Widgets.DownloadView as DownloadView - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - DownloadViewMsg msg -> - let - result = model.uploadViewModel - |> Maybe.map (DownloadView.update msg) - in - case result of - Just (m, c) -> - {model | uploadViewModel = Just m} ! [Cmd.map DownloadViewMsg c] - Nothing -> - model ! [] diff --git a/modules/webapp/src/main/elm/Pages/Download/View.elm b/modules/webapp/src/main/elm/Pages/Download/View.elm deleted file mode 100644 index 36ec5b04..00000000 --- a/modules/webapp/src/main/elm/Pages/Download/View.elm +++ /dev/null @@ -1,17 +0,0 @@ -module Pages.Download.View exposing (..) - -import Html exposing (Html, div, text) -import Html.Attributes exposing (class) - -import Widgets.DownloadView as DownloadView -import Pages.Download.Model exposing (..) - -view: Model -> Html Msg -view model = - case model.uploadViewModel of - Just m -> - div [class "main ui grid container"] - (List.map (Html.map DownloadViewMsg) (DownloadView.view m)) - - Nothing -> - div[][text "You must specify the download id"] diff --git a/modules/webapp/src/main/elm/Pages/Error/Model.elm b/modules/webapp/src/main/elm/Pages/Error/Model.elm deleted file mode 100644 index f12947c0..00000000 --- a/modules/webapp/src/main/elm/Pages/Error/Model.elm +++ /dev/null @@ -1,12 +0,0 @@ -module Pages.Error.Model exposing (..) - -type alias Model = - { message: String - } - -initModel: String -> Model -initModel msg = - Model msg - -emptyModel: Model -emptyModel = Model "" diff --git a/modules/webapp/src/main/elm/Pages/Error/View.elm b/modules/webapp/src/main/elm/Pages/Error/View.elm deleted file mode 100644 index 2c9fe1fb..00000000 --- a/modules/webapp/src/main/elm/Pages/Error/View.elm +++ /dev/null @@ -1,23 +0,0 @@ -module Pages.Error.View exposing (..) - -import Html exposing(Html, h1, div, text, a) -import Html.Attributes exposing (class, href) - -import Pages.Error.Model exposing (..) - -import PageLocation as PL - -view: Model -> Html msg -view model = - div [class "main ui grid container"] - [ - div [class "sixteen wide column"] - [ - h1 [class "ui header"] - [text "Error"] - ,div [class "ui message"] - [ - text model.message - ] - ] - ] diff --git a/modules/webapp/src/main/elm/Pages/Login/Commands.elm b/modules/webapp/src/main/elm/Pages/Login/Commands.elm deleted file mode 100644 index 51008100..00000000 --- a/modules/webapp/src/main/elm/Pages/Login/Commands.elm +++ /dev/null @@ -1,24 +0,0 @@ -module Pages.Login.Commands exposing (..) - -import Http -import Json.Encode as Encode -import Data exposing (Account, accountDecoder) -import Pages.Login.Model exposing (Model) -import Pages.Login.Data as LoginData exposing (Msg) - -authenticate: Model -> Cmd Msg -authenticate model = - Http.post (authUrl model) (Http.jsonBody (userPassJson model)) accountDecoder - |> Http.send LoginData.AuthResult - -authUrl: Model -> String -authUrl model = - model.loginUrl - - -userPassJson: Model -> Encode.Value -userPassJson model = - Encode.object - [ ("login", Encode.string model.login) - , ("pass", Encode.string model.password) - ] diff --git a/modules/webapp/src/main/elm/Pages/Login/Data.elm b/modules/webapp/src/main/elm/Pages/Login/Data.elm deleted file mode 100644 index dc73dcaa..00000000 --- a/modules/webapp/src/main/elm/Pages/Login/Data.elm +++ /dev/null @@ -1,10 +0,0 @@ -module Pages.Login.Data exposing (..) - -import Http -import Data exposing (Account) - -type Msg - = Login String - | Password String - | TryLogin - | AuthResult (Result Http.Error Account) diff --git a/modules/webapp/src/main/elm/Pages/Login/Model.elm b/modules/webapp/src/main/elm/Pages/Login/Model.elm deleted file mode 100644 index 2c1e11f2..00000000 --- a/modules/webapp/src/main/elm/Pages/Login/Model.elm +++ /dev/null @@ -1,23 +0,0 @@ -module Pages.Login.Model exposing (..) - -import Data exposing (RemoteUrls) - -type alias Model = - { login: String - , password: String - , error: String - , loginUrl: String - , welcomeMessage: String - } - -emptyModel: Model -emptyModel = - Model "" "" "" "" "" - -sharryModel: RemoteUrls -> String -> Model -sharryModel urls = - Model "sharry" "sharry" "" urls.authLogin - -fromUrls: RemoteUrls -> String -> Model -fromUrls urls = - Model "" "" "" urls.authLogin diff --git a/modules/webapp/src/main/elm/Pages/Login/Update.elm b/modules/webapp/src/main/elm/Pages/Login/Update.elm deleted file mode 100644 index b7f87e27..00000000 --- a/modules/webapp/src/main/elm/Pages/Login/Update.elm +++ /dev/null @@ -1,33 +0,0 @@ -module Pages.Login.Update exposing(..) - -import String -import Http -import Json.Decode as Decode exposing(field) -import Data exposing (Account) -import Pages.Login.Model exposing(Model, emptyModel) -import Pages.Login.Commands as Commands -import Pages.Login.Data as Data exposing (..) - - -update: Msg -> Model -> (Model, Cmd Msg, Maybe Account) -update msg model = - case msg of - Login name -> - ({ model | login = name }, Cmd.none, Nothing) - - Password pw -> - ({ model | password = pw }, Cmd.none, Nothing) - - TryLogin -> - if String.isEmpty model.login then - ({model|error = "login is empty"}, Cmd.none, Nothing) - else - let c = Commands.authenticate model - in - ({ model | password = "" }, c, Nothing) - - AuthResult (Ok acc) -> - (emptyModel, Cmd.none, Just acc) - - AuthResult (Err error) -> - ({model | error = Data.errorMessage error}, Cmd.none, Nothing) diff --git a/modules/webapp/src/main/elm/Pages/Login/View.elm b/modules/webapp/src/main/elm/Pages/Login/View.elm deleted file mode 100644 index 517621c9..00000000 --- a/modules/webapp/src/main/elm/Pages/Login/View.elm +++ /dev/null @@ -1,82 +0,0 @@ -module Pages.Login.View exposing (..) - -import String -import Html exposing (Html, button, div, text, h2, form, i, input, img, a, span, br) -import Html.Attributes exposing (class, classList, type_, placeholder, src, href) -import Html.Events exposing (onClick, onInput, onSubmit) -import Pages.Login.Model exposing (Model) -import Pages.Login.Data exposing (..) -import PageLocation as PL -import Data - -view: Model -> Html Msg -view model = - div [ class "ui middle aligned center aligned grid" ] - [ - div [ class "column login-page-column" ] - [ - img [class "ui fluid image login-page-image" , src "static/sharry-webapp/logo.png"] [] - , h2 [ class "ui brown image header"] - [ - div [class "content"] - [ text "Login, please" ] - ] - , form [ onSubmit TryLogin, class "ui large form" ] - [ - div [class "ui segment"] - [ - div [ class "field" ] - [ - div [class "ui left icon input"] - [ - i [class "user icon"] [] - , input [type_ "text", placeholder "Login", onInput Login] [] - ] - ] - , div [ class "field" ] - [ - div [class "ui left icon input"] - [ - i [class "lock icon"] [] - , input [type_ "password", placeholder "Password", onInput Password] [] - ] - ] - , button [class "ui fluid large brown submit button"] [ text "Login" ] - ] - , div [classList - [ ("ui error message", True) - , ("visible", (String.length model.error > 0)) - ] - ] - [ span [] [ text model.error ] - ] - ] - , br [][] - , div [class "ui mini horizontal divided list"] - [ - div [class "item"] - [ - a [href "https://github.com/eikek/sharry"] - [ - i [class "github icon"] [] - , text "Github" - ] - ] - , div [class "item"] - [ - a [href (PL.manualPageHref "index.md")] - [ - i [class "question circle outline icon"][] - ,text "Manual" - ] - ] - ] - , (welcomeMessage model) - ] - ] - -welcomeMessage: Model -> Html msg -welcomeMessage model = - if String.isEmpty model.welcomeMessage then span [][] - else div [class "ui basic segment"] - [ Data.markdownHtml model.welcomeMessage ] diff --git a/modules/webapp/src/main/elm/Pages/Manual/Model.elm b/modules/webapp/src/main/elm/Pages/Manual/Model.elm deleted file mode 100644 index b67652b6..00000000 --- a/modules/webapp/src/main/elm/Pages/Manual/Model.elm +++ /dev/null @@ -1,22 +0,0 @@ -module Pages.Manual.Model exposing (..) - -type alias Model = - { manualPage: String - } - -initialModel: Model -initialModel = Model "index.md" - -makeModel: String -> Model -makeModel page = - Model page - -type Msg - = Content String - - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - Content str -> - {model | manualPage = str} ! [] diff --git a/modules/webapp/src/main/elm/Pages/Manual/View.elm b/modules/webapp/src/main/elm/Pages/Manual/View.elm deleted file mode 100644 index b0e99661..00000000 --- a/modules/webapp/src/main/elm/Pages/Manual/View.elm +++ /dev/null @@ -1,25 +0,0 @@ -module Pages.Manual.View exposing (..) - -import Html exposing (Html, div) -import Html.Attributes exposing (class) -import Markdown - -import Pages.Manual.Model exposing (..) - -markdownHtml: String -> Html msg -markdownHtml str = - let - defaultOpts = Markdown.defaultOptions - markedOptions = {defaultOpts | sanitize = False, smartypants = True, githubFlavored = Just { tables = True, breaks = False}} - in - Markdown.toHtmlWith markedOptions [class "sharry-manual"] str - - -view: Model -> Html msg -view model = - div [class "main ui text container"] - [ - div [class "sixteen wide column"] - [ markdownHtml model.manualPage - ] - ] diff --git a/modules/webapp/src/main/elm/Pages/Profile/Model.elm b/modules/webapp/src/main/elm/Pages/Profile/Model.elm deleted file mode 100644 index 9b355b62..00000000 --- a/modules/webapp/src/main/elm/Pages/Profile/Model.elm +++ /dev/null @@ -1,20 +0,0 @@ -module Pages.Profile.Model exposing (..) - -import Data exposing (Account, RemoteUrls) -import Widgets.UpdateEmailForm as UpdateEmailForm -import Widgets.UpdatePasswordForm as UpdatePasswordForm - -type alias Model = - {updateEmail: UpdateEmailForm.Model - ,updatePassword: UpdatePasswordForm.Model - ,name: String - } - -makeModel: RemoteUrls -> Account -> Model -makeModel urls acc = - Model (UpdateEmailForm.makeModel acc urls) (UpdatePasswordForm.makeModel acc urls) acc.login - - -type Msg - = UpdateEmailFormMsg UpdateEmailForm.Msg - | UpdatePasswordFormMsg UpdatePasswordForm.Msg diff --git a/modules/webapp/src/main/elm/Pages/Profile/Update.elm b/modules/webapp/src/main/elm/Pages/Profile/Update.elm deleted file mode 100644 index dce760b9..00000000 --- a/modules/webapp/src/main/elm/Pages/Profile/Update.elm +++ /dev/null @@ -1,20 +0,0 @@ -module Pages.Profile.Update exposing (..) - -import Pages.Profile.Model exposing (..) -import Widgets.UpdateEmailForm as UpdateEmailForm -import Widgets.UpdatePasswordForm as UpdatePasswordForm - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - UpdateEmailFormMsg msg -> - let - (m, c) = UpdateEmailForm.update msg model.updateEmail - in - {model | updateEmail = m} ! [Cmd.map UpdateEmailFormMsg c] - - UpdatePasswordFormMsg msg -> - let - (m, c) = UpdatePasswordForm.update msg model.updatePassword - in - {model | updatePassword = m} ! [Cmd.map UpdatePasswordFormMsg c] diff --git a/modules/webapp/src/main/elm/Pages/Profile/View.elm b/modules/webapp/src/main/elm/Pages/Profile/View.elm deleted file mode 100644 index 31cd523d..00000000 --- a/modules/webapp/src/main/elm/Pages/Profile/View.elm +++ /dev/null @@ -1,33 +0,0 @@ -module Pages.Profile.View exposing (..) - -import Html exposing (Html, div, h1, text, i) -import Html.Attributes exposing (class) - -import Pages.Profile.Model exposing (..) -import Widgets.UpdateEmailForm as UpdateEmailForm -import Widgets.UpdatePasswordForm as UpdatePasswordForm - -view: Model -> Html Msg -view model = - div [] - [ - div [class "main ui grid container"] - [ - div [class "sixteen wide column"] - [ - h1 [class "ui header"] - [ - i [class "user icon"][] - ,text (model.name ++ "'s Profile") - ] - ] - ,div [class "sixteen wide column"] - [ - (Html.map UpdateEmailFormMsg (UpdateEmailForm.view model.updateEmail)) - ] - ,div [class "sixteen wide column"] - [ - (Html.map UpdatePasswordFormMsg (UpdatePasswordForm.view model.updatePassword)) - ] - ] - ] diff --git a/modules/webapp/src/main/elm/Pages/Timeout/View.elm b/modules/webapp/src/main/elm/Pages/Timeout/View.elm deleted file mode 100644 index 0137d0ec..00000000 --- a/modules/webapp/src/main/elm/Pages/Timeout/View.elm +++ /dev/null @@ -1,23 +0,0 @@ -module Pages.Timeout.View exposing (..) - -import Html exposing(Html, h1, div, text, a) -import Html.Attributes exposing (class, href) - -import PageLocation as PL - -view: Html msg -view = - div [class "main ui grid container"] - [ - div [class "sixteen wide column"] - [ - h1 [class "ui header"] - [text "Session Timeout"] - ,div [class "ui message"] - [ - text "The session has timed out. Please " - ,a [href PL.loginPageHref][text "login"] - ,text " again." - ] - ] - ] diff --git a/modules/webapp/src/main/elm/Pages/Upload/Model.elm b/modules/webapp/src/main/elm/Pages/Upload/Model.elm deleted file mode 100644 index 4fdfd0ec..00000000 --- a/modules/webapp/src/main/elm/Pages/Upload/Model.elm +++ /dev/null @@ -1,72 +0,0 @@ -module Pages.Upload.Model exposing(..) - -import Http -import Data exposing (Account, RemoteConfig, UploadInfo) -import Resumable -import Widgets.UploadForm as UploadForm -import Widgets.UploadProgress as UploadProgress -import Widgets.MarkdownEditor as MarkdownEditor - -type Mode - = Settings - | Upload - | Publish - -type alias Model = - { uploadFormModel: UploadForm.Model - , uploadProgressModel: UploadProgress.Model - , mode: Mode - , serverConfig: RemoteConfig - , errorMessage: String - , markdownEditorModel: Maybe MarkdownEditor.Model - , showMarkdownHelp: Bool - } - -emptyModel: RemoteConfig -> Model -emptyModel cfg = - Model (UploadForm.emptyModel cfg) UploadProgress.emptyModel Settings cfg "" Nothing False - -clearModel: Model -> Model -clearModel model = - { uploadFormModel = UploadForm.clearModel model.uploadFormModel - , uploadProgressModel = UploadProgress.emptyModel - , mode = Settings - , serverConfig = model.serverConfig - , errorMessage = "" - , markdownEditorModel = Nothing - , showMarkdownHelp = False - } - -hasError: Model -> Bool -hasError model = - not <| String.isEmpty model.errorMessage - -clearError: Model -> Model -clearError model = - {model | errorMessage = ""} - - -type Msg - = UploadFormMsg UploadForm.Msg - | UploadProgressMsg UploadProgress.Msg - | MoveToUpload - | UploadCreated (Result Http.Error ()) - | MoveToPublish - | ResetForm - | CancelUpload - | UploadDeleted (Result Http.Error Int) - | UploadPublished (Result Http.Error UploadInfo) - | ToggleMarkdownEditor - | MarkdownEditorMsg MarkdownEditor.Msg - | ToggleMarkdownHelp - - -resumableMsg: Resumable.Msg -> List Msg -resumableMsg rmsg = - [UploadFormMsg (UploadForm.ResumableMsg rmsg) - ,UploadProgressMsg (UploadProgress.ResumableMsg rmsg) - ] - -randomPasswordMsg: String -> Msg -randomPasswordMsg s = - UploadFormMsg (UploadForm.RandomPassword s) diff --git a/modules/webapp/src/main/elm/Pages/Upload/Update.elm b/modules/webapp/src/main/elm/Pages/Upload/Update.elm deleted file mode 100644 index 00fc4443..00000000 --- a/modules/webapp/src/main/elm/Pages/Upload/Update.elm +++ /dev/null @@ -1,165 +0,0 @@ -module Pages.Upload.Update exposing (..) - -import Http -import Json.Encode as Encode -import Json.Decode as Decode -import Navigation - -import Ports -import Data exposing (Account, UploadId(..), defer) -import PageLocation as PL -import Resumable -import Resumable.Update as ResumableUpdate -import Widgets.UploadForm as UploadForm -import Widgets.UploadProgress as UploadProgress -import Widgets.MarkdownEditor as MarkdownEditor -import Pages.Upload.Model exposing (..) - -update: Msg -> Model -> (Model, Cmd Msg, Cmd Msg) -update msg model = - case msg of - UploadFormMsg msg -> - let - (um, ucmd, ucmdd) = UploadForm.update msg model.uploadFormModel - in - {model | uploadFormModel = um} ! [Cmd.map UploadFormMsg ucmd] |> defer (Cmd.map UploadFormMsg ucmdd) - - UploadProgressMsg msg -> - let - (um, ucmd) = UploadProgress.update msg model.uploadProgressModel - in - {model | uploadProgressModel = um} ! [Cmd.map UploadProgressMsg ucmd] |> defer Cmd.none - - ResetForm -> - let - handle = Maybe.withDefault "" model.uploadFormModel.resumableModel.handle - in - clearModel model ! [Ports.resumableCancel handle] |> defer Cmd.none - - CancelUpload -> - let - handle = Maybe.withDefault "" model.uploadFormModel.resumableModel.handle - in - model ! [Ports.resumableCancel handle, httpDeleteUpload model] |> defer Cmd.none - - UploadDeleted (Ok n) -> - -- its a little hacky: going back means to rebind the resumable handlers - let - handle = Maybe.withDefault "" model.uploadFormModel.resumableModel.handle - cmd = Ports.resumableRebind handle - in - clearModel model ! [] |> defer cmd - - UploadDeleted (Err error) -> - let - x = Debug.log "Error deleting upload" (Data.errorMessage error) - in - clearModel model ! [PL.timeoutCmd error] |> defer Cmd.none - - MoveToUpload -> - if model.mode == Settings then - model ! [httpInitUpload model] |> defer Cmd.none - else - (model, Cmd.none) |> defer Cmd.none - - UploadCreated (Ok ()) -> - let - ufm = model.uploadFormModel - um = {ufm | errorMessage = Nothing} - handle = Maybe.withDefault "" model.uploadFormModel.resumableModel.handle - (cmd1, cmd2) = - if UploadForm.hasFiles model.uploadFormModel then - (Ports.resumableStart handle, Cmd.none) - else - (Cmd.none, Ports.resumableSetComplete (handle, "."++UploadProgress.progressClass)) - in - {model | mode = Upload, uploadFormModel = um} ! [cmd1] |> defer cmd2 - - UploadCreated (Err error) -> - let - ufm = model.uploadFormModel - um = {ufm | errorMessage = Just (Data.errorMessage error)} - in - {model | uploadFormModel = um} ! [PL.timeoutCmd error] |> defer Cmd.none - - MoveToPublish -> - model ! [httpPublishUpload model] |> defer Cmd.none - - UploadPublished (Ok info) -> - let - model_ = clearModel model - handle = Maybe.withDefault "" model.uploadFormModel.resumableModel.handle - in - model_ ! [PL.downloadPage (Uid info.upload.id), Ports.resetResumable handle] |> defer Cmd.none - - UploadPublished (Err error) -> - {model | errorMessage = Data.errorMessage error} ! [PL.timeoutCmd error] |> defer Cmd.none - - MarkdownEditorMsg memsg -> - case model.markdownEditorModel of - Just mem -> - let - (mem_, cmd) = MarkdownEditor.update memsg mem - in - {model | markdownEditorModel = Just mem_} ! [Cmd.map MarkdownEditorMsg cmd] |> defer Cmd.none - Nothing -> - model ! [] |> defer Cmd.none - - ToggleMarkdownEditor -> - case model.markdownEditorModel of - Just mem -> - let - ufm = model.uploadFormModel - ufm_ = {ufm | description = mem.text} - -- its a little hacky: going back means to rebind the resumable handlers - handle = Maybe.withDefault "" model.uploadFormModel.resumableModel.handle - cmd = Ports.resumableRebind handle - in - {model | markdownEditorModel = Nothing, uploadFormModel = ufm_} ! [] |> defer cmd - Nothing -> - let - mem = MarkdownEditor.initModel model.uploadFormModel.description - in - {model | markdownEditorModel = Just mem} ! [] |> defer Cmd.none - - ToggleMarkdownHelp -> - {model | showMarkdownHelp = not model.showMarkdownHelp} ! [] |> defer Cmd.none - - -modelEncoder: Model -> Encode.Value -modelEncoder model = - let - up = model.uploadFormModel - in - Encode.object - [ ("id", Encode.string (Maybe.withDefault "" up.resumableModel.handle)) - , ("description", Encode.string up.description) - , ("validity", Encode.string ((toString up.validityNum) ++ up.validityUnit)) - , ("maxdownloads", Encode.int up.maxDownloads) - , ("password", Encode.string up.password) - ] - - -httpInitUpload: Model -> Cmd Msg -httpInitUpload model = - Http.post model.serverConfig.urls.uploads (Http.jsonBody (modelEncoder model)) (Decode.succeed ()) - |> Http.send UploadCreated - -httpDeleteUpload: Model -> Cmd Msg -httpDeleteUpload model = - case model.uploadFormModel.resumableModel.handle of - Just h -> - Data.httpDelete (model.serverConfig.urls.uploads ++ "/" ++ h) Http.emptyBody (Decode.field "filesRemoved" Decode.int) - |> Http.send UploadDeleted - - Nothing -> - Cmd.none - -httpPublishUpload: Model -> Cmd Msg -httpPublishUpload model = - case model.uploadFormModel.resumableModel.handle of - Just h -> - Http.post (model.serverConfig.urls.uploadPublish ++ "/" ++ h) Http.emptyBody Data.decodeUploadInfo - |> Http.send UploadPublished - Nothing -> - Cmd.none diff --git a/modules/webapp/src/main/elm/Pages/Upload/View.elm b/modules/webapp/src/main/elm/Pages/Upload/View.elm deleted file mode 100644 index 4b8a91c6..00000000 --- a/modules/webapp/src/main/elm/Pages/Upload/View.elm +++ /dev/null @@ -1,161 +0,0 @@ -module Pages.Upload.View exposing (..) - -import List -import Html exposing (Html, button, form, h1, div, label, text, textarea, select, option, i, input, a, p, h3) -import Html.Attributes exposing (class, name, type_, href, classList, rows, placeholder, value, selected) -import Html.Events exposing (onInput, onClick) - -import Resumable -import Data exposing (Account, RemoteConfig, bytesReadable) -import Widgets.UploadForm as UploadForm -import Widgets.UploadProgress as UploadProgress -import Widgets.MarkdownEditor as MarkdownEditor -import Widgets.MarkdownHelp as MarkdownHelp -import Pages.Upload.Model exposing (..) -import Pages.Upload.Update exposing (..) - -view: Model -> Html Msg -view model = - case model.markdownEditorModel of - Just mem -> - div [] - [ - div [class "main ui grid container"] - [ - div [class "row"] - [button [class "ui primary button", onClick ToggleMarkdownEditor][text "Back"] - ,button [class "ui button", onClick ToggleMarkdownHelp][text "Help"] - ] - ,div [class "row"] - [ - div [class "ui"] - [text "Write Markdown in the left input below and a preview is displayed " - ,text "at the right as you type. Click Help button to show syntax help." - ] - ] - ] - ,if model.showMarkdownHelp then - markdownHelp - else - Html.map MarkdownEditorMsg (MarkdownEditor.view mem) - ] - - Nothing -> - div [class "main ui grid container"] - (mainView model) - - -mainView: Model -> List (Html Msg) -mainView model = - [ - div [class "sixteen wide column"] - [h1 [class "ui header"][text "New Share"] - ] - ,div [class "sixteen wide column"] - [(steps model) - ,(renderError model) - ] - ,div [class "sixteen wide column"] - (stepView model) - ] - -markdownHelp: Html Msg -markdownHelp = - div [onClick ToggleMarkdownHelp] - [h3 [class "ui horizontal clearing divider header"] - [i [class "help icon"][] - ,text "Markdown Help" - ] - ,div [class "ui center aligned segment"] - [text "Click somewhere on the help text to close it."] - ,MarkdownHelp.helpTextHtml - ] - -renderError: Model -> Html Msg -renderError model = - if hasError model then - div [class "ui error message"] - [text model.errorMessage] - else - div [][] - -cancelButton: Model -> Html Msg -cancelButton model = - let - action = if model.mode == Upload then CancelUpload else ResetForm - in - a [class "ui labeled right floated basic icon button", onClick action] - [ - i [class "cancel icon"][] - ,text (if model.mode == Settings then "Reset" else "Cancel") - ] - -stepView: Model -> List (Html Msg) -stepView model = - case model.mode of - Settings -> - [ - (cancelButton model) - ,button [class "ui basic button", onClick ToggleMarkdownEditor][text "Description Editor"] - ,Html.map UploadFormMsg (UploadForm.view model.uploadFormModel) - ] - - Upload -> - [ - Html.map UploadProgressMsg (UploadProgress.view model.uploadProgressModel) - ,(cancelButton model) - ] - Publish -> - [div [][text "Oopps, this is an error."]] - -nextStepDisabled: Mode -> Model -> Bool -nextStepDisabled mode model = - case (model.mode, mode) of - (Settings, Upload) -> - not (UploadForm.isReady model.uploadFormModel) - - (Upload, Publish) -> - not (UploadProgress.isComplete model.uploadProgressModel) - - _ -> - True - -stepClasses: Mode -> Model -> Html.Attribute msg -stepClasses mode model = - classList [("active", model.mode == mode) - ,("disabled", model.mode /= mode && (nextStepDisabled mode model)) - ,("step", True) - ] - -stepIcon: Mode -> String -stepIcon mode = - case mode of - Settings -> "ui settings icon" - Upload -> "ui upload icon" - Publish -> "ui share icon" - -renderStep: Mode -> Maybe Msg -> Model -> Html Msg -renderStep mode msg model = - let - handler = (Maybe.withDefault [] (Maybe.map (\m -> [onClick m]) msg)) - parent = \cs -> if mode == model.mode then - div [(stepClasses mode model)] cs - else - a ([(stepClasses mode model)] ++ handler) cs - in - parent [ i [class (stepIcon mode)][] - , div [class "content"] - [ - div [class "title"] - [text (toString mode)] - ] - ] - -steps: Model -> Html Msg -steps model = - div [class "ui three mini steps"] - [ - (renderStep Settings Nothing model) - ,(renderStep Upload (Just MoveToUpload) model) - ,(renderStep Publish (Just MoveToPublish) model) - ] diff --git a/modules/webapp/src/main/elm/Pages/UploadList/Model.elm b/modules/webapp/src/main/elm/Pages/UploadList/Model.elm deleted file mode 100644 index f92c8ed1..00000000 --- a/modules/webapp/src/main/elm/Pages/UploadList/Model.elm +++ /dev/null @@ -1,18 +0,0 @@ -module Pages.UploadList.Model exposing (..) - -import Data exposing (Upload, RemoteUrls) -import Widgets.UploadList as UploadList - -type alias Model = - { uploadList: UploadList.Model - } - -emptyModel: RemoteUrls -> Model -emptyModel urls = - Model (UploadList.emptyModel urls) - -makeModel: RemoteUrls -> List Upload -> Model -makeModel urls up = - Model (UploadList.makeModel urls up) - -type Msg = UploadListMsg UploadList.Msg diff --git a/modules/webapp/src/main/elm/Pages/UploadList/Update.elm b/modules/webapp/src/main/elm/Pages/UploadList/Update.elm deleted file mode 100644 index c0f17472..00000000 --- a/modules/webapp/src/main/elm/Pages/UploadList/Update.elm +++ /dev/null @@ -1,13 +0,0 @@ -module Pages.UploadList.Update exposing (..) - -import Pages.UploadList.Model exposing (..) -import Widgets.UploadList as UploadList - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - UploadListMsg msg -> - let - (m, c) = UploadList.update msg model.uploadList - in - {model | uploadList = m} ! [Cmd.map UploadListMsg c] diff --git a/modules/webapp/src/main/elm/Pages/UploadList/View.elm b/modules/webapp/src/main/elm/Pages/UploadList/View.elm deleted file mode 100644 index 3ab93e9d..00000000 --- a/modules/webapp/src/main/elm/Pages/UploadList/View.elm +++ /dev/null @@ -1,18 +0,0 @@ -module Pages.UploadList.View exposing (..) - -import Html exposing (Html, div, h1, text) -import Html.Attributes exposing (class) - -import Pages.UploadList.Model exposing (..) -import Widgets.UploadList as UploadList - -view: Model -> Html Msg -view model = - div [class "main ui grid container"] - [ - div [class "sixteen wide column"] - [ - h1 [class "header"] [text "Uploads"] - ,(Html.map UploadListMsg (UploadList.view model.uploadList)) - ] - ] diff --git a/modules/webapp/src/main/elm/Ports.elm b/modules/webapp/src/main/elm/Ports.elm index 00544463..05ae3545 100644 --- a/modules/webapp/src/main/elm/Ports.elm +++ b/modules/webapp/src/main/elm/Ports.elm @@ -1,42 +1,55 @@ port module Ports exposing (..) -import Data exposing (..) -import Resumable +import Api.Model.AuthResult exposing (AuthResult) +import Json.Decode as D --- Ports -port setAccount : Account -> Cmd msg -port removeAccount : Account -> Cmd msg +port setAccount : AuthResult -> Cmd msg -port makeRandomString: String -> Cmd msg -port randomString: (String -> msg) -> Sub msg -port setProgress: (String, Float, Bool) -> Cmd msg +port removeAccount : () -> Cmd msg -port initAccordionAndTabs: () -> Cmd msg -port initEmbeds: () -> Cmd msg -port makeResumable: Resumable.Config -> Cmd msg -port resetResumable: Resumable.Handle -> Cmd msg -port resumableHandle: ((String, Resumable.Handle) -> msg) -> Sub msg +port submitFiles : D.Value -> Cmd msg -port resumableRebind: Resumable.Handle -> Cmd msg -port resumableStart: Resumable.Handle -> Cmd msg -port resumablePause: Resumable.Handle -> Cmd msg -port resumableCancel: Resumable.Handle -> Cmd msg -port resumableRetry: (Resumable.Handle, List String) -> Cmd msg -port resumableSetComplete: (Resumable.Handle, String) -> Cmd msg +{-| Information from JS about an upload that is currently in progress +or completed. -port resumableFileAdded: ((String, Resumable.File) -> msg) -> Sub msg -port resumableFileSuccess: ((String, Resumable.File) -> msg) -> Sub msg -port resumableStarted: (String -> msg) -> Sub msg -port resumablePaused: (String -> msg) -> Sub msg -port resumableProgress: ((String, Float) -> msg) -> Sub msg -port resumableComplete: (String -> msg) -> Sub msg -port resumableError: ((String, String, Resumable.File) -> msg) -> Sub msg +The JSON data is read into a [UploadState](#Data.UploadState) data +type. -port resumableMaxFileSizeError: ((String, Resumable.File) -> msg) -> Sub msg -port resumableMaxFilesError: ((String, Resumable.File) -> msg) -> Sub msg +-} +port uploadState : (D.Value -> msg) -> Sub msg -port reloadPage: () -> Cmd msg + +{-| Run JS code to set the progress of a Semantic-UI progress div to +some value. + +The string in the tuple is the element id, the second part the value +in percent from 0 to 100. + +-} +port setProgress : List ( String, Int ) -> Cmd msg + + +{-| Requests to stop the current upload. +-} +port stopUpload : String -> Cmd msg + + +port startUpload : String -> Cmd msg + + +{-| Callback from the JS side to tell when a call to `stopUpload` has +completed. +-} +port uploadStopped : (Maybe String -> msg) -> Sub msg + + +{-| Scroll to the top +-} +port scrollTop : () -> Cmd msg + + +port scrollToElem : String -> Cmd msg diff --git a/modules/webapp/src/main/elm/Resumable.elm b/modules/webapp/src/main/elm/Resumable.elm deleted file mode 100644 index ff3a0017..00000000 --- a/modules/webapp/src/main/elm/Resumable.elm +++ /dev/null @@ -1,115 +0,0 @@ -module Resumable exposing (..) - -import Json.Encode as Json -import Data exposing (RemoteConfig) - -type alias Handle = String - -type alias Config = - { target: String - , testTarget: String - , chunkSize: Int - , forceChunkSize: Bool - , simultaneousUploads: Int - , testChunks: Bool - , maxFiles: Int - , maxFileSize: Int - , withCredentials: Bool - , handle: Maybe Handle - , dropClass: String - , browseClass: String - , page: String - , headers: Json.Value - } - -browseCssClass: String -browseCssClass = "sharry-add-files" - -dropCssClass: String -dropCssClass = "sharry-dropzone" - -makeStandardConfig: RemoteConfig -> Config -makeStandardConfig cfg = - { target = cfg.urls.uploadData - , testTarget = cfg.urls.uploadData - , chunkSize = cfg.chunkSize - , simultaneousUploads = cfg.simultaneousUploads - , maxFiles = cfg.maxFiles - , maxFileSize = cfg.maxFileSize - , forceChunkSize = True - , testChunks = True - , withCredentials = True - , handle = Nothing - , dropClass = "."++dropCssClass - , browseClass = "."++browseCssClass - , page = "" - , headers = Json.object [] - } - -makeAliasConfig: RemoteConfig -> String -> Config -makeAliasConfig cfg aliasId = - let - default = makeStandardConfig cfg - in - {default| headers = Json.object [(cfg.aliasHeaderName, Json.string aliasId)]} - -type alias File = - { fileName: String - , size: Int - , uniqueIdentifier: String - , progress: Float - , completed: Bool - , uploading: Bool - } - -type State - = Initial - | Uploading - | Paused - | Cancelled - | Completed - -type alias Model = - { handle: Maybe Handle - , files: List File - , progress: Float - , errorFiles: List (File, String) - , state: State - } - -emptyModel: Model -emptyModel = - Model Nothing [] -1 [] Initial - -makeErrorList: Model -> List String -makeErrorList model = - model.errorFiles - |> List.map (\(f, msg) -> f.fileName ++": "++ msg) - - -{-| Clears everything but the handle to reuse a resumable instance. --} -clearModel: Model -> Model -clearModel model = - {emptyModel | handle = model.handle} - -isInitialized: Model -> Bool -isInitialized model = - case model.handle of - Just h -> True - Nothing -> False - -hasErrors: Model -> Bool -hasErrors model = - not <| List.isEmpty model.errorFiles - -type Msg - = Initialize Config - | SetHandle Handle - | FileAdded File - | FileError File String - | FileSuccess File - | Progress Float - | UploadStarted - | UploadPaused - | UploadComplete diff --git a/modules/webapp/src/main/elm/Resumable/Update.elm b/modules/webapp/src/main/elm/Resumable/Update.elm deleted file mode 100644 index a1a25442..00000000 --- a/modules/webapp/src/main/elm/Resumable/Update.elm +++ /dev/null @@ -1,37 +0,0 @@ -module Resumable.Update exposing (..) - -import Resumable exposing (..) -import Ports - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - Initialize cfg -> - model ! [ Ports.makeResumable {cfg | handle = model.handle} ] - - SetHandle handle -> - {model | handle = Just handle} ! [] - - FileAdded file -> - {model | files = file :: model.files, errorFiles = []} ! [] - - FileError file msg -> - {model | errorFiles = (file, msg) :: model.errorFiles} ! [] - - FileSuccess file -> - let - notFile = \f -> f.uniqueIdentifier /= file.uniqueIdentifier - in - {model | errorFiles = List.filter (Tuple.first >> notFile) model.errorFiles} ! [] - - Progress percent -> - {model | progress = percent, state = Uploading} ! [] - - UploadComplete -> - {model | state = Completed, errorFiles = []} ! [] - - UploadStarted -> - {model | state = Uploading, errorFiles = []} ! [] - - UploadPaused -> - {model | state = Paused} ! [] diff --git a/modules/webapp/src/main/elm/Util/Duration.elm b/modules/webapp/src/main/elm/Util/Duration.elm new file mode 100644 index 00000000..dae1894c --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Duration.elm @@ -0,0 +1,66 @@ +module Util.Duration exposing (Duration, toHuman) + +-- 486ms -> 12s -> 1:05 -> 59:45 -> 1:02:12 + + +type alias Duration = + Int + + +toHuman : Duration -> String +toHuman dur = + fromMillis dur + + + +-- implementation + + +fromMillis : Int -> String +fromMillis ms = + case ms // 1000 of + 0 -> + String.fromInt ms ++ "ms" + + n -> + fromSeconds n + + +fromSeconds : Int -> String +fromSeconds sec = + case sec // 60 of + 0 -> + String.fromInt sec ++ "s" + + n -> + let + s = + sec - (n * 60) + in + fromMinutes n ++ ":" ++ num s + + +fromMinutes : Int -> String +fromMinutes min = + case min // 60 of + 0 -> + num min + + n -> + let + m = + min - (n * 60) + in + num n ++ ":" ++ num m + + +num : Int -> String +num n = + String.fromInt n + |> (++) + (if n < 10 then + "0" + + else + "" + ) diff --git a/modules/webapp/src/main/elm/Util/Html.elm b/modules/webapp/src/main/elm/Util/Html.elm new file mode 100644 index 00000000..d23bd9d3 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Html.elm @@ -0,0 +1,57 @@ +module Util.Html exposing + ( checkbox + , checkboxChecked + , checkboxUnchecked + , noElement + , resultMsg + , resultMsgMaybe + ) + +import Api.Model.BasicResult exposing (BasicResult) +import Html exposing (..) +import Html.Attributes exposing (..) + + +checkboxChecked : Html msg +checkboxChecked = + i [ class "ui check square outline icon" ] [] + + +checkboxUnchecked : Html msg +checkboxUnchecked = + i [ class "ui square outline icon" ] [] + + +checkbox : Bool -> Html msg +checkbox flag = + if flag then + checkboxChecked + + else + checkboxUnchecked + + +noElement : Html msg +noElement = + span [ class "invisible" ] [] + + +resultMsg : BasicResult -> Html msg +resultMsg result = + resultMsgMaybe (Just result) + + +resultMsgMaybe : Maybe BasicResult -> Html msg +resultMsgMaybe mres = + div + [ classList + [ ( "ui message", True ) + , ( "invisible hidden", mres == Nothing ) + , ( "error", Maybe.map .success mres == Just False ) + , ( "success", Maybe.map .success mres == Just True ) + ] + ] + [ Maybe.map .message mres + |> Maybe.withDefault "" + |> text + ] diff --git a/modules/webapp/src/main/elm/Util/Http.elm b/modules/webapp/src/main/elm/Util/Http.elm new file mode 100644 index 00000000..35417f8b --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Http.elm @@ -0,0 +1,281 @@ +module Util.Http exposing (..) + +import Api.Model.AuthResult exposing (AuthResult) +import Http +import Json.Decode as D +import Process +import Task exposing (Task) + + + +-- Authenticated Requests + + +authReq : + { url : String + , account : AuthResult + , method : String + , headers : List Http.Header + , body : Http.Body + , expect : Http.Expect msg + , tracker : Maybe String + } + -> Cmd msg +authReq req = + Http.request + { url = req.url + , method = req.method + , headers = Http.header "Sharry-Auth" (Maybe.withDefault "" req.account.token) :: req.headers + , expect = req.expect + , body = req.body + , timeout = Nothing + , tracker = req.tracker + } + + +aliasReq : + { url : String + , aliasId : String + , method : String + , headers : List Http.Header + , body : Http.Body + , expect : Http.Expect msg + , tracker : Maybe String + } + -> Cmd msg +aliasReq req = + Http.request + { url = req.url + , method = req.method + , headers = Http.header "Sharry-Alias" req.aliasId :: req.headers + , expect = req.expect + , body = req.body + , timeout = Nothing + , tracker = req.tracker + } + + +authPost : + { url : String + , account : AuthResult + , body : Http.Body + , expect : Http.Expect msg + } + -> Cmd msg +authPost req = + authReq + { url = req.url + , account = req.account + , body = req.body + , expect = req.expect + , method = "POST" + , headers = [] + , tracker = Nothing + } + + +aliasPost : + { url : String + , aliasId : String + , body : Http.Body + , expect : Http.Expect msg + } + -> Cmd msg +aliasPost req = + aliasReq + { url = req.url + , aliasId = req.aliasId + , body = req.body + , expect = req.expect + , method = "POST" + , headers = [] + , tracker = Nothing + } + + +authPostTrack : + { url : String + , account : AuthResult + , body : Http.Body + , expect : Http.Expect msg + , tracker : String + } + -> Cmd msg +authPostTrack req = + authReq + { url = req.url + , account = req.account + , body = req.body + , expect = req.expect + , method = "POST" + , headers = [] + , tracker = Just req.tracker + } + + +authPut : + { url : String + , account : AuthResult + , body : Http.Body + , expect : Http.Expect msg + } + -> Cmd msg +authPut req = + authReq + { url = req.url + , account = req.account + , body = req.body + , expect = req.expect + , method = "PUT" + , headers = [] + , tracker = Nothing + } + + +authGet : + { url : String + , account : AuthResult + , expect : Http.Expect msg + } + -> Cmd msg +authGet req = + authReq + { url = req.url + , account = req.account + , body = Http.emptyBody + , expect = req.expect + , method = "GET" + , headers = [] + , tracker = Nothing + } + + +getH : + { url : String + , headers : List Http.Header + , expect : Http.Expect msg + } + -> Cmd msg +getH req = + Http.request + { url = req.url + , method = "GET" + , headers = req.headers + , expect = req.expect + , body = Http.emptyBody + , timeout = Nothing + , tracker = Nothing + } + + +authDelete : + { url : String + , account : AuthResult + , expect : Http.Expect msg + } + -> Cmd msg +authDelete req = + authReq + { url = req.url + , account = req.account + , body = Http.emptyBody + , expect = req.expect + , method = "DELETE" + , headers = [] + , tracker = Nothing + } + + + +-- Error Utilities + + +errorToStringStatus : Http.Error -> (Int -> String) -> String +errorToStringStatus error statusString = + case error of + Http.BadUrl url -> + "There is something wrong with this url: " ++ url + + Http.Timeout -> + "There was a network timeout." + + Http.NetworkError -> + "There was a network error." + + Http.BadStatus status -> + statusString status + + Http.BadBody str -> + "There was an error decoding the response: " ++ str + + +errorToString : Http.Error -> String +errorToString error = + let + f sc = + case sc of + 404 -> + "The requested resource doesn't exist." + + _ -> + "There was an invalid response status: " ++ String.fromInt sc + in + errorToStringStatus error f + + + +-- Http.Task Utilities + + +jsonResolver : D.Decoder a -> Http.Resolver Http.Error a +jsonResolver decoder = + Http.stringResolver <| + \response -> + case response of + Http.BadUrl_ url -> + Err (Http.BadUrl url) + + Http.Timeout_ -> + Err Http.Timeout + + Http.NetworkError_ -> + Err Http.NetworkError + + Http.BadStatus_ metadata _ -> + Err (Http.BadStatus metadata.statusCode) + + Http.GoodStatus_ _ body -> + case D.decodeString decoder body of + Ok value -> + Ok value + + Err err -> + Err (Http.BadBody (D.errorToString err)) + + +executeIn : Float -> (Result Http.Error a -> msg) -> Task Http.Error a -> Cmd msg +executeIn delay receive task = + Process.sleep delay + |> Task.andThen (\_ -> task) + |> Task.attempt receive + + +authTask : + { method : String + , headers : List Http.Header + , account : AuthResult + , url : String + , body : Http.Body + , resolver : Http.Resolver x a + , timeout : Maybe Float + } + -> Task x a +authTask req = + Http.task + { method = req.method + , headers = Http.header "Sharry-Auth" (Maybe.withDefault "" req.account.token) :: req.headers + , url = req.url + , body = req.body + , resolver = req.resolver + , timeout = req.timeout + } diff --git a/modules/webapp/src/main/elm/Util/List.elm b/modules/webapp/src/main/elm/Util/List.elm new file mode 100644 index 00000000..513aedae --- /dev/null +++ b/modules/webapp/src/main/elm/Util/List.elm @@ -0,0 +1,96 @@ +module Util.List exposing + ( distinct + , find + , findIndexed + , findNext + , findPrev + , get + , nonEmpty + , remove + ) + + +remove : Int -> List a -> List a +remove index list = + List.indexedMap Tuple.pair list + |> List.filter (\t -> index /= Tuple.first t) + |> List.map Tuple.second + + +nonEmpty : List a -> Bool +nonEmpty list = + not (List.isEmpty list) + + +get : List a -> Int -> Maybe a +get list index = + if index < 0 then + Nothing + + else + case list of + [] -> + Nothing + + x :: xs -> + if index == 0 then + Just x + + else + get xs (index - 1) + + +find : (a -> Bool) -> List a -> Maybe a +find pred list = + findIndexed pred list |> Maybe.map Tuple.first + + +findIndexed : (a -> Bool) -> List a -> Maybe ( a, Int ) +findIndexed pred list = + findIndexed1 pred list 0 + + +findIndexed1 : (a -> Bool) -> List a -> Int -> Maybe ( a, Int ) +findIndexed1 pred list index = + case list of + [] -> + Nothing + + x :: xs -> + if pred x then + Just ( x, index ) + + else + findIndexed1 pred xs (index + 1) + + +distinct : List a -> List a +distinct list = + List.reverse <| + List.foldl + (\a -> + \r -> + if List.member a r then + r + + else + a :: r + ) + [] + list + + +findPrev : (a -> Bool) -> List a -> Maybe a +findPrev pred list = + findIndexed pred list + |> Maybe.map Tuple.second + |> Maybe.map (\i -> i - 1) + |> Maybe.andThen (get list) + + +findNext : (a -> Bool) -> List a -> Maybe a +findNext pred list = + findIndexed pred list + |> Maybe.map Tuple.second + |> Maybe.map (\i -> i + 1) + |> Maybe.andThen (get list) diff --git a/modules/webapp/src/main/elm/Util/Maybe.elm b/modules/webapp/src/main/elm/Util/Maybe.elm new file mode 100644 index 00000000..c3b549e5 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Maybe.elm @@ -0,0 +1,57 @@ +module Util.Maybe exposing + ( filter + , fromString + , isEmpty + , nonEmpty + , or + ) + + +nonEmpty : Maybe a -> Bool +nonEmpty ma = + ma /= Nothing + + +isEmpty : Maybe a -> Bool +isEmpty ma = + ma == Nothing + + +or : List (Maybe a) -> Maybe a +or listma = + case listma of + [] -> + Nothing + + (Just el) :: _ -> + Just el + + Nothing :: els -> + or els + + +filter : (a -> Bool) -> Maybe a -> Maybe a +filter pred ma = + case ma of + Just v -> + if pred v then + ma + + else + Nothing + + Nothing -> + Nothing + + +fromString : String -> Maybe String +fromString str = + let + s = + String.trim str + in + if s == "" then + Nothing + + else + Just str diff --git a/modules/webapp/src/main/elm/Util/Share.elm b/modules/webapp/src/main/elm/Util/Share.elm new file mode 100644 index 00000000..fac00ea2 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Share.elm @@ -0,0 +1,59 @@ +module Util.Share exposing (splitDescription, validate) + +import Api.Model.BasicResult exposing (BasicResult) +import Api.Model.ShareDetail exposing (ShareDetail) +import Data.Flags exposing (Flags) +import Data.UploadDict exposing (UploadDict) + + +splitDescription : ShareDetail -> ( String, String ) +splitDescription share = + let + fallback = + Maybe.map (\n -> "# " ++ n) share.name + |> Maybe.withDefault "# Your Share" + + desc = + Maybe.map String.trim share.description + |> Maybe.withDefault "" + + lines = + String.lines desc + in + case lines of + [] -> + ( fallback, desc ) + + first :: rest -> + if String.startsWith "#" (String.trim first) then + ( first, String.join "\n" rest ) + + else + ( fallback, desc ) + + +validate : + Flags + -> Maybe ShareDetail + -> { m | descField : String, uploads : UploadDict } + -> BasicResult +validate flags mshare model = + if model.descField == "" && model.uploads.selectedFiles == [] then + BasicResult False "Either some files or a description must be provided." + + else + let + nsz = + Data.UploadDict.size model.uploads + + esz = + Maybe.map .files mshare + |> Maybe.withDefault [] + |> List.map .size + |> List.sum + in + if (nsz + esz) > flags.config.maxSize then + BasicResult False "Upload is too large." + + else + BasicResult True "" diff --git a/modules/webapp/src/main/elm/Util/Size.elm b/modules/webapp/src/main/elm/Util/Size.elm new file mode 100644 index 00000000..92a838c5 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Size.elm @@ -0,0 +1,57 @@ +module Util.Size exposing (SizeUnit(..), bytesReadable) + + +type SizeUnit + = G + | M + | K + | B + + +prettyNumber : Float -> String +prettyNumber n = + let + parts = + String.split "." (String.fromFloat n) + in + case parts of + n0 :: d :: [] -> + n0 ++ "." ++ String.left 2 d + + _ -> + String.join "." parts + + +bytesReadable : SizeUnit -> Float -> String +bytesReadable unit n = + let + k = + n / 1024 + + num = + prettyNumber n + in + case unit of + G -> + num ++ "G" + + M -> + if k > 1 then + bytesReadable G k + + else + num ++ "M" + + K -> + if k > 1 then + bytesReadable M k + + else + num ++ "K" + + B -> + if k > 1 then + bytesReadable K k + + else + num ++ "B" diff --git a/modules/webapp/src/main/elm/Util/String.elm b/modules/webapp/src/main/elm/Util/String.elm new file mode 100644 index 00000000..f4129781 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/String.elm @@ -0,0 +1,16 @@ +module Util.String exposing (shorten) + + +shorten : Int -> String -> String +shorten max str = + let + len = + max // 2 + + pref = + String.left len str + + suff = + String.right len str + in + pref ++ "…" ++ suff diff --git a/modules/webapp/src/main/elm/Util/Time.elm b/modules/webapp/src/main/elm/Util/Time.elm new file mode 100644 index 00000000..16945406 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Time.elm @@ -0,0 +1,102 @@ +module Util.Time exposing (..) + +import DateFormat +import Time exposing (Posix, Zone, utc) + + +dateFormatter : Zone -> Posix -> String +dateFormatter = + DateFormat.format + [ DateFormat.dayOfWeekNameAbbreviated + , DateFormat.text ", " + , DateFormat.monthNameFull + , DateFormat.text " " + , DateFormat.dayOfMonthSuffix + , DateFormat.text ", " + , DateFormat.yearNumber + ] + + +dateFormatterShort : Zone -> Posix -> String +dateFormatterShort = + DateFormat.format + [ DateFormat.yearNumber + , DateFormat.text "/" + , DateFormat.monthFixed + , DateFormat.text "/" + , DateFormat.dayOfMonthFixed + ] + + +timeFormatter : Zone -> Posix -> String +timeFormatter = + DateFormat.format + [ DateFormat.hourMilitaryNumber + , DateFormat.text ":" + , DateFormat.minuteFixed + ] + + +isoDateTimeFormatter : Zone -> Posix -> String +isoDateTimeFormatter = + DateFormat.format + [ DateFormat.yearNumber + , DateFormat.text "-" + , DateFormat.monthFixed + , DateFormat.text "-" + , DateFormat.dayOfMonthFixed + , DateFormat.text "T" + , DateFormat.hourMilitaryNumber + , DateFormat.text ":" + , DateFormat.minuteFixed + , DateFormat.text ":" + , DateFormat.secondFixed + ] + + +timeZone : Zone +timeZone = + utc + + + +{- Format millis into "Wed, 10. Jan 2018, 18:57" -} + + +formatDateTime : Int -> String +formatDateTime millis = + formatDate millis ++ ", " ++ formatTime millis + + +formatIsoDateTime : Int -> String +formatIsoDateTime millis = + Time.millisToPosix millis + |> isoDateTimeFormatter timeZone + + + +{- Format millis into "18:57". The current time (not the duration of + the millis). +-} + + +formatTime : Int -> String +formatTime millis = + Time.millisToPosix millis + |> timeFormatter timeZone + + + +{- Format millis into "Wed, 10. Jan 2018" -} + + +formatDate : Int -> String +formatDate millis = + Time.millisToPosix millis + |> dateFormatter timeZone + + +formatDateShort : Int -> String +formatDateShort millis = + Time.millisToPosix millis + |> dateFormatterShort timeZone diff --git a/modules/webapp/src/main/elm/Util/Update.elm b/modules/webapp/src/main/elm/Util/Update.elm new file mode 100644 index 00000000..dee7dfe4 --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Update.elm @@ -0,0 +1,18 @@ +module Util.Update exposing (andThen1) + + +andThen1 : List (a -> ( a, Cmd b )) -> a -> ( a, Cmd b ) +andThen1 fs a = + let + init = + ( a, [] ) + + update el tuple = + let + ( a2, c2 ) = + el (Tuple.first tuple) + in + ( a2, c2 :: Tuple.second tuple ) + in + List.foldl update init fs + |> Tuple.mapSecond Cmd.batch diff --git a/modules/webapp/src/main/elm/Util/Url.elm b/modules/webapp/src/main/elm/Util/Url.elm new file mode 100644 index 00000000..59d5bade --- /dev/null +++ b/modules/webapp/src/main/elm/Util/Url.elm @@ -0,0 +1,13 @@ +module Util.Url exposing (emptyHttp, emptyHttps) + +import Url exposing (Url) + + +emptyHttp : Url +emptyHttp = + Url Url.Http "" Nothing "" Nothing Nothing + + +emptyHttps : Url +emptyHttps = + Url Url.Https "" Nothing "" Nothing Nothing diff --git a/modules/webapp/src/main/elm/Widgets/AccountForm.elm b/modules/webapp/src/main/elm/Widgets/AccountForm.elm deleted file mode 100644 index ba4e504f..00000000 --- a/modules/webapp/src/main/elm/Widgets/AccountForm.elm +++ /dev/null @@ -1,209 +0,0 @@ -module Widgets.AccountForm exposing (..) - -import Http -import Html exposing (Html, form, div, h2, button, label, input, text, i, ul, li) -import Html.Attributes exposing (class, classList, type_, value, name, placeholder, checked) -import Html.Events exposing (..) -import Data exposing (Account, accountEncoder, accountDecoder, httpPut, RemoteUrls) -import PageLocation as PL - -{- the model -} -type Update - = Create - | Modify - -type alias Model = - { account: Account - , update: Update - , errors: List String - , success: Maybe String - , showPass: Bool - , url: String - } - -createAccount: RemoteUrls -> String -> Model -createAccount urls login = - Model (Data.fromLogin login) Create [] Nothing False urls.accounts - -modifyAccount: RemoteUrls -> Account -> Model -modifyAccount urls acc = - Model {acc|password = Nothing} Modify [] Nothing False urls.accounts - -makeModify: Model -> Model -makeModify model = - let - acc = model.account - in - { model - | update = Modify - , errors = [] - , account = {acc | password = Nothing}} - -hasError: Model -> Bool -hasError model = - if List.isEmpty model.errors then False else True - -hasSuccess: Model -> Bool -hasSuccess model = - Data.isPresent model.success - -updateAccount: (Account -> Account) -> Model -> Model -updateAccount update model = - {model | account = update model.account, errors = [], success = Nothing} - -type Msg - = AccountSetPassword String - | AccountSetEmail String - | AccountSetEnabled Bool - | AccountSetAdmin Bool - | AccountSetExtern Bool - | SubmitAccount - | ToggleShowPassword - | CreateAccountResult (Result Http.Error Account) - - -{- commands -} - -httpCreateAccount: Model -> Cmd Msg -httpCreateAccount model = - httpPut model.url (Http.jsonBody (accountEncoder model.account)) accountDecoder - |> Http.send CreateAccountResult - -httpModifyAccount: Model -> Cmd Msg -httpModifyAccount model = - Http.post model.url (Http.jsonBody (accountEncoder model.account)) accountDecoder - |> Http.send CreateAccountResult - - -{- update -} - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - AccountSetPassword pass -> - updateAccount (\acc -> {acc | password = Just pass}) model ! [] - - AccountSetEmail email -> - updateAccount (\acc -> {acc | email = Just email}) model ! [] - - AccountSetEnabled flag -> - updateAccount (\acc -> {acc | enabled = flag}) model ! [] - - AccountSetAdmin flag -> - updateAccount (\acc -> {acc | admin = flag}) model ! [] - - AccountSetExtern flag -> - updateAccount (\acc -> {acc | extern = flag}) model ! [] - - CreateAccountResult (Ok acc) -> - let - verb = if model.update == Modify then "updated" else "created" - newmodel = {model | account = acc, success = Just ("The account has been "++ verb ++".")} - in - (makeModify newmodel, Cmd.none) - - CreateAccountResult (Err error) -> - let - msg = Data.errorMessage error - in - {model | errors = msg :: model.errors, success = Nothing} ! [PL.timeoutCmd error] - - ToggleShowPassword -> - ({model | showPass = (not model.showPass)}, Cmd.none) - - SubmitAccount -> - case model.update of - Create -> - ({model| errors = [], success = Nothing}, httpCreateAccount model) - Modify -> - ({model | errors = [], success = Nothing}, httpModifyAccount model) - - -{- view -} - -view: Model -> Html Msg -view model = - let - acc = model.account - in - form [classList [("ui form", True) - ,("error", hasError model) - ,("success", hasSuccess model)] - , onSubmit SubmitAccount - ] - [ - h2 [class "ui horizontal divider header"] - [ - text acc.login - ] - , div [classList - [ ("ui error message", True) - , ("visible", (Data.nonEmpty model.errors)) - ] - ] - [Data.messagesToHtml model.errors] - ,div [class "ui success message"] - [model.success |> Maybe.withDefault "" |> text - ] - ,div [class "fields"] - [ - div [class "fourteen wide field"] - [ - label [] [text "Password"] - ,input [type_ (if model.showPass then "text" else "password") - , onInput AccountSetPassword - , value (Maybe.withDefault "" acc.password) - , name "password" - , placeholder "password"][] - ] - ,div [class "two wide field"] - [ - label [] [text "Show"] - ,button [type_ "button" - , class "ui button" - , onClick ToggleShowPassword - ] - [text (if model.showPass then "Hide" else "Show")] - ] - ] - ,div [class "field"] - [ - label [] [text "Email"] - ,input [type_ "text" - , onInput AccountSetEmail - , value (Maybe.withDefault "" acc.email) - , name "email" - , placeholder "optional email address"][] - ] - ,div [class "field"] - [ - div [class "ui checkbox"] - [ - input [type_ "checkbox" - , checked acc.enabled - , onCheck AccountSetEnabled][] - ,label [] [text "Enabled"] - ] - ] - ,div [class "field"] - [ - div [class "ui checkbox"] - [ - input [type_ "checkbox" - , checked acc.admin - , onCheck AccountSetAdmin][] - ,label [] [text "Admin"] - ] - ] - ,div [class "field"] - [ - div [class "ui checkbox"] - [ - input [type_ "checkbox" - , checked acc.extern - , onCheck AccountSetExtern][] - ,label [] [text "Extern"] - ] - ] - ,button [class "ui button", type_ "submit"] [text "Submit"] - ] diff --git a/modules/webapp/src/main/elm/Widgets/AliasEdit.elm b/modules/webapp/src/main/elm/Widgets/AliasEdit.elm deleted file mode 100644 index ee59c9ed..00000000 --- a/modules/webapp/src/main/elm/Widgets/AliasEdit.elm +++ /dev/null @@ -1,169 +0,0 @@ -module Widgets.AliasEdit exposing (..) - -import Http -import Json.Decode as Decode -import Html exposing (Html, div, form, input, select, option, h2, text, label, a, p) -import Html.Attributes exposing (class, classList, selected, value, placeholder, type_, name, checked) -import Html.Events exposing (onInput, onCheck, onClick) - -import Data exposing (Alias, RemoteUrls) -import PageLocation as PL - -type alias Model = - {current: Alias - ,currentId: String - ,urls: RemoteUrls - ,validityUnit: String - ,validityNum: String - ,errorMessage: Maybe String - ,infoMessage: Maybe String - } - -makeModel: Alias -> RemoteUrls -> Model -makeModel alia urls = - case Data.parseDuration alia.validity of - Just (n, unit) -> - Model alia alia.id urls unit (toString n) Nothing Nothing - Nothing -> - Model alia alia.id urls "" "" Nothing Nothing - -hasError: Model -> Bool -hasError model = Data.isPresent model.errorMessage - -hasInfo: Model -> Bool -hasInfo model = Data.isPresent model.infoMessage - -type Msg - = SetName String - | SetValidityNum String - | SetValidityUnit String - | SetEnabled Bool - | SetId String - | TrySubmit - | SubmitAliasResult (Result Http.Error Alias) - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - SetId id -> - let - a = model.current - na = {a | id = id} - in - {model | current = na, errorMessage = Nothing} ! [] - - SetName name -> - let - a = model.current - na = {a | name = name} - in - {model | current = na, errorMessage = Nothing} ! [] - - SetValidityUnit unit -> - {model | validityUnit = unit, errorMessage = Nothing} ! [] - - SetValidityNum num -> - if num /= "" then - case (String.toInt num) of - Ok n -> - {model | validityNum = num, errorMessage = Nothing} ! [] - Err msg -> - {model | validityNum = num, errorMessage = Just msg} ! [] - else - {model | validityNum = num} ! [] - - SetEnabled flag -> - let - a = model.current - na = {a | enable = flag} - in - {model | current = na, errorMessage = Nothing} ! [] - - TrySubmit -> - case String.toInt model.validityNum of - Ok n -> - let - validity = model.validityNum ++ model.validityUnit - thisAlias = model.current - newAlias = {thisAlias | validity = validity} - model_ = {model | current = newAlias, errorMessage = Nothing} - in - model_ ! [httpSubmitAlias model_ model.currentId] - Err msg -> - {model | errorMessage = Just ("Error parsing validity number: "++ msg)} ! [] - - SubmitAliasResult (Ok na) -> - {model| currentId = na.id, current = na, infoMessage = Just "Alias has been updated."} ! [] - - SubmitAliasResult (Err error) -> - {model | errorMessage = Just (Data.errorMessage error), infoMessage = Nothing} ! [PL.timeoutCmd error] - - - -view: Model -> Html Msg -view model = - form [class "ui form"] - [h2 [class "header"][text "Change Alias"] - ,form [classList [("ui form", True) - ,("error", hasError model) - ,("success", hasInfo model) - ]] - [ - div [class "ui error message"] - [model.errorMessage |> Maybe.withDefault "" |> text] - ,div [class "ui success message"] - [model.infoMessage |> Maybe.withDefault "" |> text] - ,div [class "field"] - [ - label [][text "Id"] - ,input [onInput SetId, placeholder "Id", value model.current.id][] - ,div [class "ui info message"] - [div [class "header"][text "Note on changing the id:"] - ,p[][text "The id must be globally unique and is used to authorize your public upload site. It therefore changes the URL to the alias page. If it is easy to guess, it may be abused to send spam to you. If unsure, leave the default value."] - ] - ] - ,div [class "field"] - [ - label [][text "Name"] - ,input [onInput SetName, placeholder "Name", value model.current.name][] - ] - ,div [class "field"] - [ - label [][text "Validity"] - ,div [class "two fields"] - [ - div [class "field"] - [ - input [class "ui input" - ,onInput SetValidityNum - ,type_ "text" - ,placeholder "Number" - ,value model.validityNum][] - ] - ,div [class "field"] - [ - select [onInput SetValidityUnit] - (List.map - (\n -> case n of - (val, unit) -> option [value val, selected <| model.validityUnit == val][text unit]) - [("h", "Hours"), ("d", "Days")]) - ] - ] - ] - ,div [class "inline ui checkbox field"] - [ - input [type_ "checkbox" - ,checked model.current.enable - ,onCheck SetEnabled - ][] - ,label [][text "Enable"] - ] - ,div [class "ui divider"][] - ,a [class "ui primary button", onClick TrySubmit][text "Submit"] - ] - ] - -httpSubmitAlias: Model -> String -> Cmd Msg -httpSubmitAlias model id = - Http.post (model.urls.aliases ++"/"++ id) (Http.jsonBody (Data.encodeAlias model.current)) (Data.decodeAlias) - |> Http.send SubmitAliasResult diff --git a/modules/webapp/src/main/elm/Widgets/AliasList.elm b/modules/webapp/src/main/elm/Widgets/AliasList.elm deleted file mode 100644 index 3c0eb947..00000000 --- a/modules/webapp/src/main/elm/Widgets/AliasList.elm +++ /dev/null @@ -1,229 +0,0 @@ -module Widgets.AliasList exposing (..) - -import Http -import Html exposing (Html, div, table, th, tr, thead, td, tbody, a, i, text, button, h2) -import Html.Attributes exposing (class, href) -import Html.Events exposing (onClick) -import Json.Decode as Decode - -import Ports -import Data exposing (Alias, RemoteConfig, RemoteUrls, defer) -import Widgets.AliasEdit as AliasEdit -import Widgets.MailForm as MailForm -import PageLocation as PL - -type Selected - = EditDetail AliasEdit.Model - | MailDetail MailForm.Model - | Table - -type alias Model = - {aliases: List Alias - ,cfg: RemoteConfig - ,selected: Selected - } - -makeModel: RemoteConfig -> List Alias -> Model -makeModel cfg aliases = - Model aliases cfg Table - -emptyModel: RemoteConfig -> Model -emptyModel cfg = - Model [] cfg Table - -type Msg - = DeleteAlias String - | DeleteAliasResult (Result Http.Error ()) - | AliasListResult (Result Http.Error (List Alias)) - | AddNewAlias - | EditAlias Alias - | NewAliasResult (Result Http.Error Alias) - | AliasEditMsg AliasEdit.Msg - | BackToTable - | OpenMailForm Alias - | MailFormMsg MailForm.Msg - - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - DeleteAlias id -> - model ! [httpDeleteAlias model id] - - DeleteAliasResult (Ok _) -> - model ! [httpGetAliases model] - - DeleteAliasResult (Err error) -> - let - x = Debug.log "Error deleting upload" (Data.errorMessage error) - in - model ! [PL.timeoutCmd error] - - AliasListResult (Ok list) -> - {model | aliases = list} ! [] - - AliasListResult (Err error) -> - let - x = Debug.log "Error getting upload list" (Data.errorMessage error) - in - model ! [PL.timeoutCmd error] - - AddNewAlias -> - model ! [httpAddAlias model] - - NewAliasResult (Ok alia) -> - model ! [httpGetAliases model] - - NewAliasResult (Err error) -> - model ! [PL.timeoutCmd error] - - AliasEditMsg msg -> - case model.selected of - EditDetail am -> - let - (m, c) = AliasEdit.update msg am - in - {model | selected = EditDetail m} ! [Cmd.map AliasEditMsg c] - _ -> - model ! [] - - EditAlias alia -> - {model | selected = EditDetail (AliasEdit.makeModel alia model.cfg.urls)} ! [] - - BackToTable -> - case model.selected of - EditDetail m -> - {model | selected = Table} ! [httpGetAliases model] - _ -> - {model | selected = Table} ! [] - - OpenMailForm alia -> - {model | selected = MailDetail (MailForm.makeModel model.cfg.urls)} ! [httpGetTemplate model alia] - - MailFormMsg msg -> - case model.selected of - MailDetail m -> - let - (m_, c) = MailForm.update msg m - in - {model | selected = MailDetail m_} ! [Cmd.map MailFormMsg c] - _ -> - model ! [] - -view: Model -> Html Msg -view model = - case model.selected of - EditDetail alia -> - div [] - [ - button [class "ui button", onClick BackToTable][text "Back"] - ,div [class "ui divider"][] - ,createAliasEdit alia - ] - MailDetail mf -> - div [class "sixteen wide column"] - [ - a [class "ui button", onClick BackToTable][text "Back"] - ,div [class "ui divider"][] - ,div [class "sixteen wide column"] - [h2 [class "ui header"][text "Send an email"] - ,(Html.map MailFormMsg (MailForm.view mf)) - ] - ] - - Table -> - div[] - [ - button [class "ui right floated primary button", onClick AddNewAlias] - [ - i [class "add icon"][] - ,text "New Alias" - ] - ,table [class "ui selectable celled table"] - [ - thead [] - [ - tr [] - [ - th[][text "Link"] - ,th[][text "Created"] - ,th[][text "Validity"] - ,th[][text "Enabled"] - ,th[][text ""] - ] - ] - ,tbody[] - (List.map (createRow model) model.aliases) - ] - ] - -createAliasEdit: AliasEdit.Model -> Html Msg -createAliasEdit aliasModel = - Html.map AliasEditMsg (AliasEdit.view aliasModel) - -createRow: Model -> Alias -> Html Msg -createRow model alia = - let - no = "brown minus square outline icon" - yes = "brown checkmark box icon" - in - tr[] - [ - td [] - [a [href (PL.aliasUploadPageHref alia.id)][text alia.name]] - ,td [class "center aligned"][alia.created |> Data.formatDate |> text] - ,td [class "center aligned"] - [ - text (Data.formatDuration alia.validity) - ] - ,td [class "center aligned"] - [ - i [class (if alia.enable then yes else no)][] - ] - ,td [class "right aligned"] - [ - a [class "mini ui basic primary button", onClick (EditAlias alia)] - [ - i [class "edit icon"][] - ,text "Edit" - ] - ,a [class "mini ui basic negative button", onClick (DeleteAlias alia.id)] - [ - i [class "remove icon"][] - ,text "Delete" - ] - ,if model.cfg.mailEnabled then - a[class "mini ui basic button", onClick (OpenMailForm alia)] - [ - i [class "mail icon"][] - ,text "Email" - ] - else - div[][] - ] - ] - -httpAddAlias: Model -> Cmd Msg -httpAddAlias model = - Http.post model.cfg.urls.aliases Http.emptyBody (Data.decodeAlias) - |> Http.send NewAliasResult - -httpDeleteAlias: Model -> String -> Cmd Msg -httpDeleteAlias model id = - Data.httpDelete (model.cfg.urls.aliases ++"/"++ id) Http.emptyBody (Decode.succeed ()) - |> Http.send DeleteAliasResult - -httpGetAliases: Model -> Cmd Msg -httpGetAliases model = - Http.get model.cfg.urls.aliases (Decode.list Data.decodeAlias) - |> Http.send AliasListResult - -httpGetTemplate: Model -> Alias -> Cmd Msg -httpGetTemplate model alia = - let - href = PL.aliasUploadPageHref alia.id - url = model.cfg.urls.baseUrl ++ href - cmd = Http.get (model.cfg.urls.mailAliasTemplate ++ "?url=" ++ (Http.encodeUri url)) MailForm.decodeTemplate - |> Http.send MailForm.TemplateResult - in - Cmd.map MailFormMsg cmd diff --git a/modules/webapp/src/main/elm/Widgets/AliasUploadForm.elm b/modules/webapp/src/main/elm/Widgets/AliasUploadForm.elm deleted file mode 100644 index 9a6d891e..00000000 --- a/modules/webapp/src/main/elm/Widgets/AliasUploadForm.elm +++ /dev/null @@ -1,149 +0,0 @@ -module Widgets.AliasUploadForm exposing (..) - -import Html exposing (Html, button, form, h3, div, label, text, textarea, select, option, i, input, a, p) -import Html.Attributes exposing (class, name, type_, href, classList, rows, placeholder, value, selected) -import Html.Events exposing (onInput, onClick) - -import Ports -import Resumable -import Resumable.Update as ResumableUpdate -import Data exposing (RemoteConfig, defer, bytesReadable) -import Widgets.MarkdownHelp as MarkdownHelp - -type alias Limits = - { maxFileSize: Int - , maxFiles: Int - } - -type alias Model = - { errorMessage: Maybe String - , showMarkdownHelp: Bool - , description: String - , limits: Limits - , resumableModel: Resumable.Model - } - -emptyModel: RemoteConfig -> Model -emptyModel cfg = - Model Nothing False "" (Limits cfg.maxFileSize cfg.maxFiles) Resumable.emptyModel - -clearModel: Model -> Model -clearModel model = - Model Nothing False "" model.limits (Resumable.clearModel model.resumableModel) - -hasError: Model -> Bool -hasError model = - Data.isPresent model.errorMessage || Data.nonEmpty model.resumableModel.errorFiles - -hasFiles: Model -> Bool -hasFiles model = - (List.length model.resumableModel.files) > 0 - -isReady: Model -> Bool -isReady model = - (not <| Data.isPresent model.errorMessage) && - ((hasFiles model) || (not <| String.isEmpty model.description)) - -errorMessage: Model -> List String -errorMessage model = - let - resumableErrors = Resumable.makeErrorList model.resumableModel - in - model.errorMessage - |> Maybe.map List.singleton - |> Maybe.map ((++) resumableErrors) - |> Maybe.withDefault resumableErrors - - -type Msg - = SetDescription String - | ResumableMsg Resumable.Msg - | ToggleMarkdownHelp - -update: Msg -> Model -> (Model, Cmd Msg, Cmd Msg) -update msg model = - case msg of - SetDescription desc -> - ({model | description = desc, errorMessage = Nothing}, Cmd.none) |> defer Cmd.none - - ResumableMsg msg -> - let - (rmodel, cmd) = ResumableUpdate.update msg model.resumableModel - in - {model | resumableModel = rmodel} ! [] |> defer (Cmd.map ResumableMsg cmd) - - ToggleMarkdownHelp -> - {model | showMarkdownHelp = not model.showMarkdownHelp} ! [] |> defer Cmd.none - - -view: Model -> Html Msg -view model = - if model.showMarkdownHelp then markdownHelp - else - form [classList [("ui form", True) - ,("error", hasError model) - ] - ] - [ - infoView model.limits - ,div [class "ui error message"] - [errorMessage model |> Data.messagesToHtml] - ,div [class "field"] - [ - label [][text "Description (supports " - ,a[onClick ToggleMarkdownHelp, class "ui link"][text "Markdown"] - ,text ")" - ] - , textarea [name "description" - , rows 5 - , onInput SetDescription - , placeholder "Optional description" - , value model.description - ][] - ] - ,div[] - [ - a [class ("ui button " ++ Resumable.browseCssClass)][text "Add files"] - ] - ,div [class ("ui center aligned container " ++ Resumable.dropCssClass)] - [ - p [] - [ - text "Drop files here or use the “Add files” button to select files to upload." - ] - ,makeFilesView model.resumableModel.files - ] - ] - - -makeFilesView: List Resumable.File -> Html Msg -makeFilesView files = - let - size = List.sum (List.map (\m -> m.size) files) - bytes = bytesReadable Data.B (toFloat size) - message = "Selected " ++ (toString (List.length files)) ++ " files, " ++ bytes - in - h3 [class "header"][text message] - -infoView: Limits -> Html Msg -infoView cfg = - p [] - [text ("You can select up to " ++ - (toString cfg.maxFiles) ++ - " files with a total of " ++ - (bytesReadable Data.B (toFloat cfg.maxFileSize)) ++ - ".") - ,text " The »Upload« button is enabled when a description is present and/or files are selected." - ] - -markdownHelp:Html Msg -markdownHelp = - div [onClick ToggleMarkdownHelp] - [h3 [class "ui horizontal clearing divider header"] - [i [class "help icon"][] - ,text "Markdown Help" - ] - ,div [class "ui center aligned segment"] - [text "Click somewhere on the help text to close it."] - ,MarkdownHelp.helpTextHtml - ] diff --git a/modules/webapp/src/main/elm/Widgets/DownloadView.elm b/modules/webapp/src/main/elm/Widgets/DownloadView.elm deleted file mode 100644 index aa8a1628..00000000 --- a/modules/webapp/src/main/elm/Widgets/DownloadView.elm +++ /dev/null @@ -1,611 +0,0 @@ -module Widgets.DownloadView exposing (..) - -import Http -import Html exposing (Html, div, text, h2, h3) -import Html.Attributes as HA -import Html.Events as HE -import Json.Decode as Decode exposing (field, at) -import Json.Encode as Encode -import Data exposing (Account, UploadInfo, File, RemoteUrls, RemoteConfig, UploadId(..), htmlList) -import PageLocation as PL -import Widgets.MailForm as MailForm - -type alias Model = - {info: UploadInfo - ,cfg: RemoteConfig - ,login: Maybe String - ,password: Maybe String - ,validPassword: Bool - ,errorMessage: List String - ,mailForm: Maybe MailForm.Model - ,editName: Maybe String - } - -type Msg - = SetPassword String - | PasswordAttempt - | PasswordCheck (Result Http.Error (List String)) - | DeleteDownload - | DeleteDownloadResult (Result Http.Error Int) - | PublishDownload - | UnpublishDownload - | PublishDownloadResult (Result Http.Error UploadInfo) - | OpenMailForm - | MailFormCancel - | MailFormMsg MailForm.Msg - | EditName - | CancelEditName - | SaveEditName - | SetName String - | UploadUpdateResult (Result Http.Error ()) - -makeModel: UploadInfo -> RemoteConfig -> Maybe Account -> Model -makeModel info cfg account = - Model info cfg (Maybe.map (\a -> a.login) account) Nothing False [] Nothing Nothing - - -isOwner: Model -> Bool -isOwner model = - Maybe.map (\s -> s == model.info.upload.login) model.login - |> Maybe.withDefault False - -isAskPassword: Model -> Bool -isAskPassword model = - model.info.upload.requiresPassword && (not model.validPassword) - -isValid: Model -> Bool -isValid model = - Data.isValidUpload model.info.upload - -hasPasswordErrors: Model -> Bool -hasPasswordErrors model = - not (List.isEmpty model.errorMessage) - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - SetPassword p -> - {model | password = Just p, errorMessage = []} ! [] - - PasswordAttempt -> - model ! [httpCheckPassword model] - - PasswordCheck (Ok list) -> - {model| validPassword = List.isEmpty list, errorMessage = list} ! [] - - PasswordCheck (Err error) -> - {model | errorMessage = [Data.errorMessage error]} ! [PL.timeoutCmd error] - - DeleteDownload -> - model ! [httpDeleteDownload model] - - DeleteDownloadResult (Ok n) -> - model ! [PL.uploadsPage] - - DeleteDownloadResult (Err error) -> - {model | errorMessage = Debug.log "Error deleting download" [(Data.errorMessage error)]} ! [PL.timeoutCmd error] - - PublishDownload -> - model ! [httpPublishDownload model] - - PublishDownloadResult (Ok info) -> - {model | info = info} ! [] - - PublishDownloadResult (Err error) -> - {model | errorMessage = Debug.log "Error un-/publishing download" [(Data.errorMessage error)]} ! [PL.timeoutCmd error] - - UnpublishDownload -> - model ! [httpUnpublishDownload model] - - OpenMailForm -> - {model | mailForm = Just (MailForm.makeModel model.cfg.urls)} ! [httpGetTemplate model] - - MailFormCancel -> - {model | mailForm = Nothing} ! [] - - MailFormMsg msg -> - case model.mailForm of - Just m -> - let - (m_, c) = MailForm.update msg m - in - {model | mailForm = Just m_} ! [Cmd.map MailFormMsg c] - Nothing -> - model ! [] - - EditName -> - ({model|editName = Data.maybeOrElse model.info.upload.name (Just "")}, Cmd.none) - CancelEditName -> - ({model|editName = Nothing}, Cmd.none) - SaveEditName -> - case model.editName of - Just name -> - (model, httpSetName model name) - Nothing -> - ({model|editName = Nothing}, Cmd.none) - SetName name -> - ({model|editName = Just name}, Cmd.none) - UploadUpdateResult (Ok _) -> - let - info = model.info - up = info.upload - nup = {up|name = model.editName} - ninfo = {info|upload = nup} - in - ({model|editName = Nothing, info = ninfo}, Cmd.none) - UploadUpdateResult (Err _) -> - (model, Cmd.none) - -view: Model -> List (Html Msg) -view model = - case model.mailForm of - Just m -> - viewMailForm m - Nothing -> - viewPage model - -viewMailForm: MailForm.Model -> List (Html Msg) -viewMailForm model = - [div [HA.class "sixteen wide column"] - [ - Html.a [HA.class "ui button", HE.onClick MailFormCancel][text "Back"] - ,div [HA.class "ui divider"][] - ] - ,div [HA.class "sixteen wide column"] - [h2 [HA.class "ui header"][text "Send an email"] - ,(Html.map MailFormMsg (MailForm.view model)) - ] - ] - -viewPage: Model -> List (Html Msg) -viewPage model = - let - msg = Maybe.withDefault (defaultDescription model) model.info.upload.description - in - htmlList [ - (not (isValid model || isOwner model), - renderDimmer model) - ,(not (isOwner model) && isValid model && isAskPassword model, - passwordForm model) - ,(True, div [HA.class "sixteen wide column"] - [(Data.markdownHtml msg)]) - ,(True, div [HA.class "eight wide column"] - (uploadInfoItems model)) - ,(True, div [HA.class "six wide column"] - (downloadInfoItems model)) - ,(True, div [HA.class "two wide column"] - [actionButtons model]) - ,(True, setNameInput model) - ,(isValid model && isOwner model, infoMessage model) - ,(model.info.upload.requiresPassword && isOwner model, - div [HA.class "sixteen wide column"] - (passwordHint model)) - ,(not (isValid model) && isOwner model, - div [HA.class "sixteen wide column"] - (validatedHint model)) - ,(True, div [HA.class "sixteen wide column"] - [ - h2 [HA.class "ui header"][ - text "Files" - ,div [HA.class "sub header"] - [text (fileSummary model)] - ] - ,div [HA.class "ui fluid accordion"] - (if List.isEmpty model.info.files then - [text "No files attached."] - else - (List.map (renderFile model) model.info.files)) - ]) - ] - -setNameInput: Model -> Html Msg -setNameInput model = - case model.editName of - Just name -> - div [HA.class "ui right aligned container"] - [Html.div [HA.class "ui action input"] - [Html.input [HA.type_ "text" - ,HA.value name - ,HE.onInput SetName - ][] - ,Html.button [HA.class "ui primary button", HE.onClick SaveEditName] - [text "Save" - ] - ,Html.button [HA.class "ui secodary button", HE.onClick CancelEditName] - [text "Cancel" - ] - ] - ] - Nothing -> - Html.span [][] - -infoMessage: Model -> Html msg -infoMessage model = - case model.info.upload.publishId of - Just id -> - let - href = PL.downloadPageHref (Pid id) - url = model.cfg.urls.baseUrl ++ href - in - div [] - [text "You can share this page with others by sending the following link:" - ,Html.br[][] - ,Html.a[HA.href href][text url] - ] - Nothing -> - div[][] - - -defaultDescription: Model -> String -defaultDescription model = - if (isOwner model) then "# Your Upload" - else - """# Your Files - -Someone provided the following files. Download is available for the given time period.""" - - -uploadInfoItems: Model -> List (Html msg) -uploadInfoItems model = - [ - div [HA.class "ui list"] - [div [HA.class "item"] - [Html.i [HA.class "comment outline icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Name"] - ,div [HA.class "content"] - [text (Maybe.withDefault "-" model.info.upload.name)] - ] - ] - - ,div [HA.class "item"] - [Html.i [HA.class "calendar outline icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Uploaded at"] - ,div [HA.class "content"] - [text (Data.formatDate model.info.upload.created)] - ] - ] - - ,div [HA.class "item"] - [Html.i [HA.class "hashtag icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Publish Id"] - ,div [HA.class "content"] - [case model.info.upload.publishId of - Just id -> - Html.a[HA.href (PL.downloadPageHref (Pid id))][text id] - Nothing -> - text "-" - ] - ] - ] - - ,div [HA.class "item"] - [Html.i [HA.class "calendar icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Published on"] - ,div [HA.class "content"] - [Maybe.map Data.formatDate model.info.upload.publishDate |> Maybe.withDefault "-" |> text] - ] - ] - - ,div [HA.class "item"] - [Html.i [HA.class "download icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Max. downloads"] - ,div [HA.class "content"] - [toString model.info.upload.maxDownloads |> text] - ] - ] - ] - ] - -downloadInfoItems: Model -> List (Html msg) -downloadInfoItems model = - [ - div [HA.class "ui list"] - [ - div [HA.class "item"] - [Html.i [HA.class "download icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Downloads"] - ,div [HA.class "content"] - [toString model.info.upload.downloads |> text] - ] - ] - - ,div [HA.class "item"] - [Html.i [HA.class "download icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Last download at"] - ,div [HA.class "content"] - [Maybe.map Data.formatDate model.info.upload.lastDownload |> Maybe.withDefault "-" |> text] - ] - ] - - ,div [HA.class "item"] - [Html.i [HA.class "protect icon"][] - ,div [HA.class "content"] - [ - div [HA.class "header"] - [text "Valid until"] - ,div [HA.class "content"] - [Maybe.map Data.formatDate model.info.upload.validUntil |> Maybe.withDefault "-" |> text] - ] - ] - ] - ] - -passwordHint: Model -> List (Html msg) -passwordHint model = - if (model.info.upload.requiresPassword && isOwner model) then - div [HA.class "eight wide column"] - [ - div [HA.class "ui info message"] - [ - div [] - [text "This download requires a password!"] - ] - ] |> List.singleton - else - [] - -validatedHint: Model -> List (Html msg) -validatedHint model = - if isValid model && not (isOwner model) then [] - else div [HA.class "eight wide column"] - [ - div [HA.class "ui info message"] - [ - div [HA.class "header"] - [text "This is not a valid public download!"] - ,Html.ul [HA.class "list"] - (List.map (\s -> Html.li[][text s]) model.info.upload.validated) - ] - ] |> List.singleton - -renderDimmer: Model -> Html msg -renderDimmer model = - div [HA.class "ui active dimmer"] - [ - div [HA.class "content"] - [ - div [HA.class "center"] - [ - h2 [HA.class "ui inverted icon header"] - [ - Html.i [HA.class "meh icon"][] - ,text "This download is not available anymore!" - ] - ,div [] - (List.map (\s -> Html.p[][text s]) model.info.upload.validated) - ] - ] - ] - -renderFile: Model -> File -> Html msg -renderFile model file = - let - downloadUrl = if isOwner model then - model.cfg.urls.download ++ "/" ++ file.id - else if isValid model && not (isAskPassword model) then - model.cfg.urls.downloadPublished ++ "/" ++ file.id - else - "#" - downloadUrlAbs = if String.startsWith "/" downloadUrl then - model.cfg.urls.baseUrl ++ String.dropLeft 1 downloadUrl - else - model.cfg.urls.baseUrl ++ downloadUrl - mimecss = case Data.parseMime file.mimetype of - ("application", "zip") -> "file archive outline" - ("application", "pdf") -> "file pdf outline" - ("text", _) -> "file text outline" - ("image", _) -> "file image outline" - ("audio", _) -> "file audio outline" - ("video", _) -> "file video outline" - ("application", "vnd.openxmlformats-officedocument.wordprocessingml.document") -> - "file word outline" - ("application", "vnd.openxmlformats-officedocument.spreadsheetml.sheet") -> - "file excel outline" - ("application", "vnd.openxmlformats-officedocument.presentationml.presentation") -> - "file powerpoint outline" - _ -> "file outline" - niceEmbed = case Data.parseMime file.mimetype of - ("application", "pdf") -> Just "circle arrow right" - ("image", _) -> Just "circle arrow right" - ("video", _) -> Just "video play outline" - _ -> Nothing - in - div [] - [div [HA.class "title"] - [Html.i [HA.class ("large dropdown middle aligned icon")][] - ,Html.i [HA.class ("large " ++ mimecss ++ " middle aligned icon")][] - ,Html.a [HA.class "header", HA.href downloadUrl] - [text file.filename - ] - ,text " (" - ,Data.bytesReadable Data.B (toFloat file.length) |> text - ,text ")" - ] - ,div [HA.class "content"] - [div [HA.class "ui pointing secondary tabular menu"] - [Html.a [HA.class "active item", HA.attribute "data-tab" ("preview-"++file.id)][text "Preview"] - ,Html.a [HA.class "item", HA.attribute "data-tab" ("embed-"++file.id)][text "Embed"] - ] - ,div [HA.class "ui bottom active tab", HA.attribute "data-tab" ("preview-"++file.id)] - [ - case niceEmbed of - Just icon -> - div [HA.class "ui embed" - ,HA.attribute "data-url" downloadUrl - ,HA.attribute "data-icon" icon - ,HA.attribute "data-placeholder" "static/sharry-webapp/placeholder.png"] - [] - Nothing -> - Html.embed [HA.type_ file.mimetype - ,HA.src downloadUrl - ,HA.attribute "width" "100%" - ,HA.attribute "allowFullscreen" ""] - [] - ] - ,div [HA.class "ui bottom attached tab", HA.attribute "data-tab" ("embed-"++file.id)] - [ - Html.pre [HA.style [("margin-left", "1em")]] - [Html.code [HA.class "lang-html"] - [text ("") - ] - ] - ] - ] - ] - -passwordForm: Model -> Html Msg -passwordForm model = - div [HA.class "ui active dimmer"] - [ - div [HA.class "content"] - [ - div [HA.class "ui center aligned grid"] - [ - div [HA.class "sixteen wide column"] - [ - h2 [HA.class "ui inverted icon header"] - [ - Html.i [HA.class "lock icon"][] - ,text "This download requires a password." - ] - ] - ,div [HA.class "eight wide column"] - [ - Html.form [HE.onSubmit PasswordAttempt, HA.classList [("error", hasPasswordErrors model)]] - [ - div [HA.class "ui right action left icon input"] - [ - Html.i [HA.class "lock icon"] [] - ,Html.input [HA.type_ "password", HA.placeholder "Password", HA.size 30, HE.onInput SetPassword] [] - ,Html.button [HA.class "ui basic floating brown submit button"] [ text "Submit" ] - ] - ,case model.errorMessage of - [] -> - div [HA.class "ui basic segment"][text ""] - a :: [] -> - div [HA.class "ui basic red segment"][text a] - _ -> - div [HA.class "ui basic red segment"] - [Html.ul [] - (List.map (\t -> Html.li[][text t]) model.errorMessage) - ] - ] - ] - ] - - ] - ] - - -actionButtons: Model -> Html Msg -actionButtons model = - div [HA.class "ui vertical buttons"] - <| Data.htmlList - [(isOwner model && not (Data.isPublishedUpload model.info.upload), - Html.button [HA.class "ui button", HE.onClick PublishDownload][text "Publish"]) - ,(isOwner model && Data.isPublishedUpload model.info.upload, - Html.button [HA.class "ui button", HE.onClick UnpublishDownload][text "Unpublish"]) - ,(isOwner model, - Html.button [HA.class "negative ui button", HE.onClick DeleteDownload][text "Delete"]) - ,(isOwner model && isValid model && model.cfg.mailEnabled, - Html.button [HA.class "ui button", HE.onClick OpenMailForm][text "Send email"]) - ,(True - , case model.editName of - Just name -> - Html.span [][] - Nothing -> - Html.button [HA.class "ui button", HE.onClick EditName][text "Edit Name"]) - ] - -fileSummary: Model -> String -fileSummary model = - if (List.length model.info.files) > 1 then - (toString (List.length model.info.files)) ++ ", " ++ (sumFileSize model) - else - "" - -sumFileSize: Model -> String -sumFileSize model = - model.info.files - |> List.map .length - |> List.sum - |> toFloat - |> Data.bytesReadable Data.B - -httpCheckPassword: Model -> Cmd Msg -httpCheckPassword model = - let - url id = model.cfg.urls.checkPassword ++ "/" ++ id - decoder = Decode.list Decode.string - encoded pass = Encode.object [("password", Encode.string pass)] - makeCmd pass id = - Http.post (url id) (Http.jsonBody (encoded pass)) decoder - |> Http.send PasswordCheck - in - Maybe.map2 makeCmd model.password model.info.upload.publishId - |> Maybe.withDefault Cmd.none - -httpDeleteDownload: Model -> Cmd Msg -httpDeleteDownload model = - Data.httpDelete (model.cfg.urls.uploads ++ "/" ++ model.info.upload.id) Http.emptyBody (Decode.field "filesRemoved" Decode.int) - |> Http.send DeleteDownloadResult - - -httpPublishDownload: Model -> Cmd Msg -httpPublishDownload model = - Http.post (model.cfg.urls.uploadPublish ++ "/" ++ model.info.upload.id) Http.emptyBody Data.decodeUploadInfo - |> Http.send PublishDownloadResult - -httpUnpublishDownload: Model -> Cmd Msg -httpUnpublishDownload model = - Http.post (model.cfg.urls.uploadUnpublish ++ "/" ++ model.info.upload.id) Http.emptyBody Data.decodeUploadInfo - |> Http.send PublishDownloadResult - -httpGetTemplate: Model -> Cmd Msg -httpGetTemplate model = - case model.info.upload.publishId of - Just id -> - let - href = PL.downloadPageHref (Pid id) - url = model.cfg.urls.baseUrl ++ href - templateUrl = model.cfg.urls.mailDownloadTemplate - ++ "?url=" ++ (Http.encodeUri url) - ++ "&pass="++ (toString model.info.upload.requiresPassword) - cmd = Http.get templateUrl MailForm.decodeTemplate - |> Http.send MailForm.TemplateResult - in - Cmd.map MailFormMsg cmd - Nothing -> - Cmd.none - -httpSetName: Model -> String -> Cmd Msg -httpSetName model name = - Http.post - (model.cfg.urls.uploads ++ "/" ++ model.info.upload.id) - (Http.jsonBody (Data.uploadUpdateEncoder (Data.UploadUpdate name))) - (Decode.succeed ()) |> Http.send UploadUpdateResult - diff --git a/modules/webapp/src/main/elm/Widgets/LoginSearch.elm b/modules/webapp/src/main/elm/Widgets/LoginSearch.elm deleted file mode 100644 index 801080fb..00000000 --- a/modules/webapp/src/main/elm/Widgets/LoginSearch.elm +++ /dev/null @@ -1,138 +0,0 @@ -module Widgets.LoginSearch exposing (..) - -import Http -import Html exposing (Html, div, text, a, i, input) -import Html.Attributes exposing (class, classList, value, placeholder, type_) -import Html.Events exposing (onInput, onClick) -import Json.Decode as Decode exposing(field) -import Json.Encode as Encode -import Data exposing (Account, RemoteUrls, accountDecoder) -import PageLocation as PL - -type State - = Init - | Searching - | SearchDone - | Selected - -type alias Model = - { login: String - , results: List String - , active: String - , state: State - , errorMsg: String - , url: String - } - -type Msg - = SetSearch String - | SelectLogin String - | SearchResult (Result Http.Error (List String)) - | GetAccountResult (Result Http.Error Account) -{- | SetActiveResult (Maybe String) -} - -initModel: RemoteUrls -> Model -initModel urls = - Model "" [] "" Init "" urls.accounts - -errorModel: Model -> String -> Model -errorModel model msg = - {model | errorMsg = msg, results = [], active = "", state = Init} - - -{-- Commands --} - - -searchLogins: Model -> Cmd Msg -searchLogins model = - let - url = model.url ++ "?q=" ++ (Http.encodeUri model.login) - in - Http.get url decodeLoginList - |> Http.send SearchResult - -decodeLoginList: Decode.Decoder (List String) -decodeLoginList = - Decode.list Decode.string - - -fetchAccount: Model -> Cmd Msg -fetchAccount model = - Http.get (model.url ++ "/" ++ (Http.encodeUri model.login)) accountDecoder - |> Http.send GetAccountResult - - -{-- update --} - -update: Msg -> Model -> (Model, Cmd Msg, Maybe Account) -update msg model = - case msg of - SetSearch login -> - let - new = {model | login = login, state = Searching} - in - (new, searchLogins new, Nothing) - - SearchResult (Ok logins) -> - ({model - | results = logins - , state = SearchDone - } - , Cmd.none, Nothing) - - SearchResult (Err error) -> - ({model - | state = Init - , errorMsg = (Data.errorMessage error) - } - , PL.timeoutCmd error, Nothing) - - SelectLogin login -> - let - new = { model - | login = login - , results = [] - , errorMsg = "" - , state = Selected - } - in - (new, fetchAccount new, Nothing) - - GetAccountResult (Ok acc) -> - ({model | errorMsg = ""}, Cmd.none, Just acc) - - GetAccountResult (Err error) -> - (errorModel model (Data.errorMessage error), PL.timeoutCmd error, Nothing) - -{-- view --} - - -view: Model -> Html Msg -view model = - div [classList [("ui search focus", True) - ,("loading", model.state == Searching)] - ] - [ - div [class "ui icon input fluid"] - [ - input [class "prompt", type_ "text", placeholder "Logins…", value model.login, onInput SetSearch] [] - , i [class "search icon"] [] - ] - ,div [classList [("results", True) - ,("transition visible", Data.nonEmpty model.results) - ,("transition hidden", List.isEmpty model.results) - ] - ] - (List.map (menuItem model) model.results) - ] - -menuItem: Model -> String -> Html Msg -menuItem model login = - a [classList [("result", True), ("active", login == model.active)], onClick (SelectLogin login)] - [ - div [class "content"] - [ - div [class "title"] - [text login] - ] - ] diff --git a/modules/webapp/src/main/elm/Widgets/MailForm.elm b/modules/webapp/src/main/elm/Widgets/MailForm.elm deleted file mode 100644 index b60f4789..00000000 --- a/modules/webapp/src/main/elm/Widgets/MailForm.elm +++ /dev/null @@ -1,189 +0,0 @@ -module Widgets.MailForm exposing (..) - -import Http -import Regex -import Html exposing (Html, div, text, a, form, input, textarea, h3, label) -import Html.Attributes exposing (class, classList, type_, rows, placeholder, value, name) -import Html.Events exposing (onClick, onInput) -import Json.Decode as Decode -import Json.Encode as Encode - -import Data exposing (RemoteUrls) -import PageLocation as PL - -type alias Model = - {urls: RemoteUrls - ,text: String - ,subject: String - ,recipients: String - ,tos: List String - ,sending: Bool - ,errorMessage: List String - ,successMessage: List String - } - -type alias Template = - {subject: String - ,text: String - } - -decodeTemplate: Decode.Decoder Template -decodeTemplate = - Decode.map2 Template - (Decode.field "subject" Decode.string) - (Decode.field "text" Decode.string) - -makeModel: RemoteUrls -> Model -makeModel urls = - Model urls "" "" "" [] False [] [] - -isSuccessfulSend: Model -> Bool -isSuccessfulSend model = - List.isEmpty model.errorMessage && List.isEmpty model.successMessage |> not - -type alias SendResult = - {message: String - ,success: List (String) - ,failed: List (String) - } - -decodeResult: Decode.Decoder SendResult -decodeResult = - Decode.map3 SendResult - (Decode.field "message" Decode.string) - (Decode.field "success" (Decode.list Decode.string)) - (Decode.field "failed" (Decode.list Decode.string)) - -encodeMail: Model -> Encode.Value -encodeMail model = - Encode.object - [("to", Encode.list (List.map Encode.string model.tos)) - ,("subject", Encode.string model.subject) - ,("text", Encode.string model.text)] - - -type Msg - = TemplateResult (Result Http.Error Template) - | SetRecipient String - | SetText String - | SetSubject String - | SendMail - | MailSendResult (Result Http.Error SendResult) - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - TemplateResult (Ok t) -> - {model - | subject = t.subject - , text = t.text - } ! [] - - TemplateResult (Err error) -> - {model | errorMessage = [Data.errorMessage error]} ! [PL.timeoutCmd error] - - SetText text -> - let - m = {model | text = text} - in - {m | errorMessage = validate m, successMessage = []} ! [] - - SetSubject text -> - let - m = {model | subject = text} - in - {m | errorMessage = validate m, successMessage = []} ! [] - - SetRecipient text -> - let - m = {model | recipients = text, tos = splitRecipients text} - in - {m | errorMessage = validate m, successMessage = []} ! [] - - MailSendResult (Ok result) -> - let - errors = if List.isEmpty result.success then - result.message :: result.failed - else - result.failed - success = if List.isEmpty result.success then - [] - else - result.message :: result.success - in - {model | sending = False, errorMessage = errors, successMessage = success} ! [] - - MailSendResult (Err error) -> - {model | sending = False, errorMessage = ["Error sending mails: " ++ (Data.errorMessage error)]} ! [PL.timeoutCmd error] - - SendMail -> - let - errors = validate model - in - if List.isEmpty errors then - {model | sending = True} ! [httpSendMail model] - else - {model | errorMessage = errors} ! [] - -view: Model -> Html Msg -view model = - div [] - [ - div [classList [("ui inverted dimmer", True) - ,("active", model.sending) - ]] - [ - div [class "ui text loader"][text "Sending ..."] - ] - ,form [classList [("ui form", True) - ,("error", Data.nonEmpty model.errorMessage) - ,("success", Data.nonEmpty model.successMessage) - ]] - [ - div [class "ui success message"] - [Data.messagesToHtml model.successMessage] - ,div [class "ui error message"] - [Data.messagesToHtml model.errorMessage] - ,if Data.nonEmpty model.successMessage then - div[][] - else - div[] - [ - div [class "ten wide field"] - [ - label [][text "Recipients (separated by comma)"] - ,input [name "recipients", type_ "text", value model.recipients, onInput SetRecipient][] - ] - ,div [class "ten wide field"] - [ - label [][text "Subject"] - ,input [name "subject", type_ "text", value model.subject, onInput SetSubject][] - ] - ,div [class "ten wide field"] - [ - label [][text "Text"] - ,textarea [name "text", rows 8, value model.text, onInput SetText][] - ] - ,a [class "ui primary button", onClick SendMail][text "Send"] - ] - ] - ] - -splitRecipients: String -> List String -splitRecipients line = - String.split "," line - |> List.map String.trim - - -validate: Model -> List String -validate model = - List.filter (String.isEmpty >> not) - [if List.isEmpty model.tos then "No recipients set" else "" - ,if String.isEmpty model.subject then "No subject given" else "" - ,if String.isEmpty model.text then "No mail text" else ""] - - -httpSendMail: Model -> Cmd Msg -httpSendMail model = - Http.post model.urls.mailSend (Http.jsonBody (encodeMail model)) decodeResult - |> Http.send MailSendResult diff --git a/modules/webapp/src/main/elm/Widgets/MarkdownEditor.elm b/modules/webapp/src/main/elm/Widgets/MarkdownEditor.elm deleted file mode 100644 index 4d0427e2..00000000 --- a/modules/webapp/src/main/elm/Widgets/MarkdownEditor.elm +++ /dev/null @@ -1,40 +0,0 @@ -module Widgets.MarkdownEditor exposing (..) - -import Html exposing (Html, div, textarea) -import Html.Attributes exposing (class, value, style) -import Html.Events exposing (onInput) - -import Data - -type alias Model = - {text: String - } - -emptyModel: Model -emptyModel = Model "" - -initModel: String -> Model -initModel str = - Model str - -type Msg - = SetText String - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - SetText str -> - {model | text = str} ! [] - - -view: Model -> Html Msg -view model = - div [class "ui stackable two column grid"] - [ - div [class "column"] - [textarea [onInput SetText, class "sharry-md-edit", value model.text][] - ] - ,div [class "column"] - [Data.markdownHtml model.text - ] - ] diff --git a/modules/webapp/src/main/elm/Widgets/MarkdownHelp.elm b/modules/webapp/src/main/elm/Widgets/MarkdownHelp.elm deleted file mode 100644 index cae6b8e2..00000000 --- a/modules/webapp/src/main/elm/Widgets/MarkdownHelp.elm +++ /dev/null @@ -1,333 +0,0 @@ -module Widgets.MarkdownHelp exposing (..) - -import Html exposing (Html) -import Markdown - --- based on https://gist.github.com/jonschlinkert/5854601 - -helpText: String -helpText = """# Typography - -## Headings - -Headings from 1 to 6 are constructed with a `#` for each level: - -```markdown -# heading 1 -## heading 2 -### heading 3 -#### heading 4 -##### heading 5 -###### heading 6 -``` - -renders to - -# heading 1 -## heading 2 -### heading 3 -#### heading 4 -##### heading 5 -###### heading 6 - - -## Horizontal Rules - -A "thematic break" between paragraph-level elements can be created -with any of the following: - -* `___`: three consecutive underscores -* `---`: three consecutive dashes -* `***`: three consecutive asterisks - -renders to: - -___ - ---- - -*** - - -## Emphasis - -### Bold - -For emphasizing a snippet of text with a heavier font-weight. - -The following snippet of text is **rendered as bold text**. - -``` markdown -**rendered as bold text** -``` -renders to: - -**rendered as bold text** - - -### Italics -For emphasizing a snippet of text with italics. - -The following snippet of text is _rendered as italicized text_. - -``` markdown -_rendered as italicized text_ -``` - -renders to: - -_rendered as italicized text_ - -### strikethrough -In GFM you can do strickthroughs. - -``` markdown -~~Strike through this text.~~ -``` -Which renders to: - -~~Strike through this text.~~ - - -## Blockquotes - -For quoting blocks of content from another source within your -document. Add `>` before any text you want to quote. - -```markdown -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. -``` - -Renders to: - -> Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante. - - -Blockquotes can also be nested: - -``` markdown -> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. -Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. ->> Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor -odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. ->>> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. -Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. -``` - -Renders to: - -> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. -Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. ->> Sed adipiscing elit vitae augue consectetur a gravida nunc vehicula. Donec auctor -odio non est accumsan facilisis. Aliquam id turpis in dolor tincidunt mollis ac eu diam. ->>> Donec massa lacus, ultricies a ullamcorper in, fermentum sed augue. -Nunc augue augue, aliquam non hendrerit ac, commodo vel nisi. - - -## Lists - -### Unordered - -A list of items in which the order of the items does not explicitly -matter. - -You may use any of the following symbols to denote bullets for each -list item: - -```markdown -* valid bullet -- valid bullet -+ valid bullet -``` - -For example - -``` markdown -+ Lorem ipsum dolor sit amet -+ Consectetur adipiscing elit -+ Integer molestie lorem at massa -+ Facilisis in pretium nisl aliquet -+ Nulla volutpat aliquam velit - - Phasellus iaculis neque - - Purus sodales ultricies - - Vestibulum laoreet porttitor sem - - Ac tristique libero volutpat at -+ Faucibus porta lacus fringilla vel -+ Aenean sit amet erat nunc -+ Eget porttitor lorem -``` -Renders to: - -+ Lorem ipsum dolor sit amet -+ Consectetur adipiscing elit -+ Integer molestie lorem at massa -+ Facilisis in pretium nisl aliquet -+ Nulla volutpat aliquam velit - - Phasellus iaculis neque - - Purus sodales ultricies - - Vestibulum laoreet porttitor sem - - Ac tristique libero volutpat at -+ Faucibus porta lacus fringilla vel -+ Aenean sit amet erat nunc -+ Eget porttitor lorem - - -### Ordered - -A list of items in which the order of items does explicitly matter. - -``` markdown -1. Lorem ipsum dolor sit amet -2. Consectetur adipiscing elit -3. Integer molestie lorem at massa -4. Facilisis in pretium nisl aliquet -5. Nulla volutpat aliquam velit -6. Faucibus porta lacus fringilla vel -7. Aenean sit amet erat nunc -8. Eget porttitor lorem -``` -Renders to: - -1. Lorem ipsum dolor sit amet -2. Consectetur adipiscing elit -3. Integer molestie lorem at massa -4. Facilisis in pretium nisl aliquet -5. Nulla volutpat aliquam velit -6. Faucibus porta lacus fringilla vel -7. Aenean sit amet erat nunc -8. Eget porttitor lorem - - -**TIP**: If you just use `1.` for each number, it will automatically - number each item. For example: - -``` markdown -1. Lorem ipsum dolor sit amet -1. Consectetur adipiscing elit -1. Integer molestie lorem at massa -1. Facilisis in pretium nisl aliquet -1. Nulla volutpat aliquam velit -1. Faucibus porta lacus fringilla vel -1. Aenean sit amet erat nunc -1. Eget porttitor lorem -``` - -Renders to: - -1. Lorem ipsum dolor sit amet -2. Consectetur adipiscing elit -3. Integer molestie lorem at massa -4. Facilisis in pretium nisl aliquet -5. Nulla volutpat aliquam velit -6. Faucibus porta lacus fringilla vel -7. Aenean sit amet erat nunc -8. Eget porttitor lorem - - -## Code - -### Inline code - -Wrap inline snippets of code with `` ` ``. - -``` html -For example, `
` should be wrapped as "inline". -``` - -renders to - -For example, `
` should be wrapped as "inline". - - -### Indented code - -Or indent several lines of code by at least four spaces, as in: - -``` js - // Some comments - line 1 of code - line 2 of code - line 3 of code -``` - - // Some comments - line 1 of code - line 2 of code - line 3 of code - - -### Block code "fences" - -Use "fences" ```` ``` ```` to block in multiple lines of code. - -
-```
-Sample text here...
-```
-
- - -``` -Sample text here... -``` - - -## Links - -### Basic link - -``` markdown -[Sharry](https://github.com/eikek/sharry) -``` - -Renders to (hover over the link, there is no tooltip): - -[Sharry](https://github.com/eikek/sharry) - - -### Add a title - -``` markdown -[Sharry](https://github.com/eikek/sharry/ "Visit Sharry!") -``` - -Renders to (hover over the link, there should be a tooltip): - -[Sharry](https://github.com/eikek/sharry/ "Visit Sharry!") - - -## Images - -Images have a similar syntax to links but include a preceding -exclamation point. - -``` markdown -![Minion](http://octodex.github.com/images/minion.png) -``` -![Minion](http://octodex.github.com/images/minion.png) - -or - -``` markdown -![Alt text](http://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") -``` -![Alt text](http://octodex.github.com/images/stormtroopocat.jpg "The Stormtroopocat") - -Like links, Images also have a footnote style syntax - -``` markdown -![Alt text][id] -``` -![Alt text][id] - -With a reference later in the document defining the URL location: - -[id]: http://octodex.github.com/images/dojocat.jpg "The Dojocat" - - - [id]: http://octodex.github.com/images/dojocat.jpg "The Dojocat" -""" - -helpTextHtml: Html msg -helpTextHtml = - Markdown.toHtml [] helpText diff --git a/modules/webapp/src/main/elm/Widgets/UpdateEmailForm.elm b/modules/webapp/src/main/elm/Widgets/UpdateEmailForm.elm deleted file mode 100644 index 72f0d27a..00000000 --- a/modules/webapp/src/main/elm/Widgets/UpdateEmailForm.elm +++ /dev/null @@ -1,96 +0,0 @@ -module Widgets.UpdateEmailForm exposing (..) - -import Html exposing (Html, div, i, h4, text, input, button) -import Html.Attributes exposing (class, classList, type_, placeholder, value) -import Html.Events exposing (onInput, onClick) -import Http - -import Data exposing (Account, RemoteUrls) -import PageLocation as PL - -type alias Model = - {account: Account - ,urls: RemoteUrls - ,email: Maybe String - ,infoMessage: Maybe String - ,errorMessage: Maybe String - } - -makeModel: Account -> RemoteUrls -> Model -makeModel acc urls = - Model acc urls acc.email Nothing Nothing - -hasInfo: Model -> Bool -hasInfo model = - Data.isPresent model.infoMessage - -hasError: Model -> Bool -hasError model = - Data.isPresent model.errorMessage - -type Msg - = SetEmail String - | UpdateEmail - | UpdateEmailResult (Result Http.Error Account) - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - SetEmail em -> - {model | email = Data.nonEmptyStr em, infoMessage = Nothing, errorMessage = Nothing} ! [] - - UpdateEmailResult (Ok acc) -> - {model | account = acc, email = acc.email, infoMessage = Just "Email was updated."} ! [] - - UpdateEmailResult (Err error) -> - {model | errorMessage = Data.errorMessage error |> Just} ! [PL.timeoutCmd error] - - UpdateEmail -> - let - change acc = {acc | email = model.email} - m = {model | account = change model.account} - in - m ! [httpUpdateEmail m] - - -view: Model -> Html Msg -view model = - let - address = Maybe.withDefault "" model.email - in - div [] - [ - h4 [class "ui dividing header"][text "Change Email"] - ,div [class "ui large right action left icon input"] - [ - i [class "at icon"] [] - ,input [onInput SetEmail, type_ "text", placeholder "Email", value address] [] - ,button [class "ui floating primary submit button", onClick UpdateEmail] [ text "Submit" ] - ] - ,div [classList [("hidden", not (hasInfo model)) - ,("ui icon success message", True)]] - [ - i [class "smile icon"][] - ,div [class "content"] - [model.infoMessage |> Maybe.withDefault "" |> text] - ] - ,div [classList [("hidden", not (hasError model)) - ,("ui icon error message", True)]] - [ - i [class "frown icon"][] - ,div [class "content"] - [model.errorMessage |> Maybe.withDefault "" |> text] - ] - ,div [classList [("hidden", hasInfo model || hasError model) - ,("ui icon info message", True)]] - [ - i [class "info icon"][] - ,div [class "content"] - [text "Submitting an empty email field will delete it from your profile."] - ] - ] - -httpUpdateEmail: Model -> Cmd Msg -httpUpdateEmail model = - Http.post model.urls.profileEmail (Http.jsonBody (Data.accountEncoder model.account)) Data.accountDecoder - |> Http.send UpdateEmailResult diff --git a/modules/webapp/src/main/elm/Widgets/UpdatePasswordForm.elm b/modules/webapp/src/main/elm/Widgets/UpdatePasswordForm.elm deleted file mode 100644 index 3fb492ef..00000000 --- a/modules/webapp/src/main/elm/Widgets/UpdatePasswordForm.elm +++ /dev/null @@ -1,130 +0,0 @@ -module Widgets.UpdatePasswordForm exposing (..) - -import Html exposing (Html, div, i, h4, text, input, button, form) -import Html.Attributes exposing (class, classList, type_, placeholder, value) -import Html.Events exposing (onInput, onSubmit) -import Http - -import Data exposing (Account, RemoteUrls) -import PageLocation as PL - -type alias Model = - {account: Account - ,urls: RemoteUrls - ,password: Maybe String - ,passwordConfirm: Maybe String - ,infoMessage: Maybe String - ,errorMessage: Maybe String - } - -makeModel: Account -> RemoteUrls -> Model -makeModel acc urls = - Model acc urls Nothing Nothing Nothing Nothing - -hasInfo: Model -> Bool -hasInfo model = - Data.isPresent model.infoMessage - -hasError: Model -> Bool -hasError model = - Data.isPresent model.errorMessage - -type Msg - = SetPassword String - | SetPasswordConfirm String - | UpdatePassword - | UpdatePasswordResult (Result Http.Error Account) - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - SetPassword pw -> - {model | password = Data.nonEmptyStr pw, infoMessage = Nothing, errorMessage = Nothing} ! [] - - SetPasswordConfirm pw -> - {model | passwordConfirm = Data.nonEmptyStr pw, infoMessage = Nothing, errorMessage = Nothing} ! [] - - UpdatePasswordResult (Ok acc) -> - {model | account = acc, infoMessage = Just "Password was updated."} ! [] - - UpdatePasswordResult (Err error) -> - {model | errorMessage = Data.errorMessage error |> Just} ! [PL.timeoutCmd error] - - UpdatePassword -> - let - same = model.password == model.passwordConfirm - change acc = {acc | password = model.password} - m = {model | account = change model.account} - in - if model.account.extern then - {model | errorMessage = Just "Password cannot be changed for external accounts"} ! [] - else if same then - m ! [httpUpdatePassword m] - else - {model | errorMessage = Just "Passwords are not equal."} ! [] - -view: Model -> Html Msg -view model = - div [] - [ - h4 [class "ui dividing header"][text "Change Password"] - ,form [classList [("ui form", True) - ,("error", hasError model) - ,("success", hasInfo model)] - ,onSubmit UpdatePassword - ] - [ - div [classList [("ui inverted dimmer", True) - ,("active", model.account.extern)]] - [ - div [class "content"] - [ - div [class "center"] - [ - h4 [class "ui icon header"] - [ - i [class "announcement icon"][] - ,text "Passwords cannot be changed for external accounts." - ] - ] - ] - ] - ,div [class "eight wide field"] - [ - div [class "ui large left icon input"] - [ - i [class "lock icon"] [] - ,input [onInput SetPassword, type_ "password", placeholder "Password"] [] - ] - ] - ,div [class "eight wide field"] - [ - div [class "ui large left icon input"] - [ - i [class "lock icon"][] - ,input [onInput SetPasswordConfirm, type_ "password", placeholder "Confirm"][] - ] - ] - ,button [class "ui primary submit button", type_ "sumit"] - [text "Submit"] - ,div [classList [("hidden", False) - ,("ui icon success message", True)]] - [ - i [class "smile icon"][] - ,div [class "content"] - [model.infoMessage |> Maybe.withDefault "" |> text] - ] - ,div [classList [("hidden", False) - ,("ui icon error message", True)]] - [ - i [class "frown icon"][] - ,div [class "content"] - [model.errorMessage |> Maybe.withDefault "" |> text] - ] - ] - ] - -httpUpdatePassword: Model -> Cmd Msg -httpUpdatePassword model = - Http.post model.urls.profilePassword (Http.jsonBody (Data.accountEncoder model.account)) Data.accountDecoder - |> Http.send UpdatePasswordResult diff --git a/modules/webapp/src/main/elm/Widgets/UploadForm.elm b/modules/webapp/src/main/elm/Widgets/UploadForm.elm deleted file mode 100644 index 0b370a54..00000000 --- a/modules/webapp/src/main/elm/Widgets/UploadForm.elm +++ /dev/null @@ -1,295 +0,0 @@ -module Widgets.UploadForm exposing (..) - -import Html exposing (Html, button, form, h1, h3, div, label, text, textarea, select, option, i, input, a, p) -import Html.Attributes exposing (class, name, type_, href, classList, rows, placeholder, value, selected) -import Html.Events exposing (onInput, onClick) - -import Ports -import Resumable -import Resumable.Update as ResumableUpdate -import Data exposing (RemoteConfig, defer, bytesReadable) -import Widgets.MarkdownHelp as MarkdownHelp - -type alias Limits = - { maxFileSize: Int - , maxFiles: Int - , maxValidity: String - } - -type alias Model = - { errorMessage: Maybe String - , showMarkdownHelp: Bool - , description: String - , validityNum: Int - , validityNumStr: String - , validityUnit: String - , maxDownloads: Int - , maxDownloadsStr: String - , password: String - , showPassword: Bool - , limits: Limits - , resumableModel: Resumable.Model - } - -emptyModel: RemoteConfig -> Model -emptyModel cfg = - {errorMessage = Nothing - ,showMarkdownHelp = False - ,description = "" - ,validityNum = 5 - ,validityNumStr = "5" - ,validityUnit = "d" - ,maxDownloads = 30 - ,maxDownloadsStr = "30" - ,password = "" - ,showPassword = False - ,limits = Limits cfg.maxFileSize cfg.maxFiles cfg.maxValidity - ,resumableModel = Resumable.emptyModel - } - -clearModel: Model -> Model -clearModel model = - {errorMessage = Nothing - ,showMarkdownHelp = False - ,description = "" - ,validityNum = 5 - ,validityNumStr = "5" - ,validityUnit = "d" - ,maxDownloads = 30 - ,maxDownloadsStr = "30" - ,password = "" - ,showPassword = False - ,limits = model.limits - ,resumableModel = Resumable.clearModel model.resumableModel - } - -hasError: Model -> Bool -hasError model = - Data.isPresent model.errorMessage || Data.nonEmpty model.resumableModel.errorFiles - -hasFiles: Model -> Bool -hasFiles model = - (List.length model.resumableModel.files) > 0 - -isReady: Model -> Bool -isReady model = - (not <| Data.isPresent model.errorMessage) && - ((hasFiles model) || (not <| String.isEmpty model.description)) - -errorMessage: Model -> List String -errorMessage model = - let - resumableErrors = Resumable.makeErrorList model.resumableModel - in - model.errorMessage - |> Maybe.map List.singleton - |> Maybe.map ((++) resumableErrors) - |> Maybe.withDefault resumableErrors - - - -type Msg - = SetValidityNum String - | SetValidityUnit String - | SetMaxDownloads String - | SetDescription String - | SetPassword String - | GeneratePassword - | RandomPassword String - | TogglePasswordVisible - | ResumableMsg Resumable.Msg - | ToggleMarkdownHelp - -updateNumber: String -> Model -> (Int -> Model -> Model) -> Model -updateNumber str model apply = - case (String.toInt str) of - Ok n -> - if n > 0 then - let - model_ = apply n model - in - {model_| errorMessage = Nothing} - else - {model | errorMessage = Just "It must be a positive number!"} - Err msg -> - if str == "" then - {model | errorMessage = Just "A number is requred"} - else - {model | errorMessage = Just ("Error converting number: "++msg)} - - -update: Msg -> Model -> (Model, Cmd Msg, Cmd Msg) -update msg model = - case msg of - SetValidityNum str -> - let - model_ = {model | validityNumStr = str} - apply n m = {m | validityNum = n} - in - updateNumber str model_ apply ! [] |> defer Cmd.none - - SetValidityUnit unit -> - ({model | validityUnit = unit, errorMessage = Nothing}, Cmd.none) |> defer Cmd.none - - SetMaxDownloads str -> - let - model_ = {model | maxDownloadsStr = str} - apply n m = {m | maxDownloads = n} - in - updateNumber str model_ apply ! [] |> defer Cmd.none - - SetDescription desc -> - ({model | description = desc, errorMessage = Nothing}, Cmd.none) |> defer Cmd.none - - SetPassword pw -> - ({model | password = pw, errorMessage = Nothing}, Cmd.none) |> defer Cmd.none - - GeneratePassword -> - (model, Ports.makeRandomString "") |> defer Cmd.none - - RandomPassword s -> - {model | password = s} ! [] |> defer Cmd.none - - TogglePasswordVisible -> - {model | showPassword = not model.showPassword, errorMessage = Nothing} ! [] |> defer Cmd.none - - ResumableMsg msg -> - let - (rmodel, cmd) = ResumableUpdate.update msg model.resumableModel - in - {model | resumableModel = rmodel} ! [] |> defer (Cmd.map ResumableMsg cmd) - - ToggleMarkdownHelp -> - {model | showMarkdownHelp = Debug.log "have it " not model.showMarkdownHelp} ! [] |> defer Cmd.none - - -view: Model -> Html Msg -view model = - if model.showMarkdownHelp then markdownHelp model - else - form [classList [("ui form", True) - ,("error", hasError model) - ] - ] - [ - infoView model.limits - ,div [class "ui error message"] - [errorMessage model |> Data.messagesToHtml] - ,div [class "field"] - [ - label [][text "Description (supports " - ,a[onClick ToggleMarkdownHelp, class "ui link"][text "Markdown"] - ,text ")" - ] - , textarea [name "description" - , rows 5 - , onInput SetDescription - , placeholder "Optional description" - , value model.description - ][] - ] - ,div [class "two fields"] - [ - div [class "field"] - [ - label [][text "Validity"] - ,input [class "ui input" - ,onInput SetValidityNum - ,type_ "text" - ,placeholder "Number" - ,value model.validityNumStr][] - ] - ,div [class "field"] - [ - label [][text "Unit"] - ,select [onInput SetValidityUnit] - (List.map - (\n -> case n of - (val, unit) -> option [value val, selected <| model.validityUnit == val][text unit]) - [("h", "Hours"), ("d", "Days")]) - ] - ] - ,div [class "field"] - [ - label [][text "Max. Downloads"] - ,input [ class "ui input" - , type_ "text" - , name "maxdownloads" - , onInput SetMaxDownloads - , placeholder "Maximum number of downloads" - , value model.maxDownloadsStr][] - ] - ,div [class "field"] - [ - label [][text "Password"] - ,div [class "two fields"] - [ - div [class "field"] - [ - input [ class "ui input" - , type_ (if model.showPassword then "text" else "password") - , onInput SetPassword - , placeholder "Optional password" - , value model.password][] - ] - ,div [class "field"] - [ - a [class "ui button" - , onClick TogglePasswordVisible - ] - [text (if model.showPassword then "Hide" else "Show")] - ,a [class "ui button" - , onClick GeneratePassword - ] - [text "Generate"] - ] - ] - ] - ,div[] - [ - a [class ("ui button " ++ Resumable.browseCssClass)][text "Add files"] - ] - ,div [class ("ui center aligned container " ++ Resumable.dropCssClass)] - [ - p [] - [ - text "Drop files here or use the “Add files” button to select files to upload." - ] - ,makeFilesView model.resumableModel.files - ] - ] - - -makeFilesView: List Resumable.File -> Html Msg -makeFilesView files = - let - size = List.sum (List.map (\m -> m.size) files) - bytes = bytesReadable Data.B (toFloat size) - message = "Selected " ++ (toString (List.length files)) ++ " files, " ++ bytes - in - h3 [class "header"][text message] - -infoView: Limits -> Html Msg -infoView cfg = - p [] - [text ("You can select up to " ++ - (toString cfg.maxFiles) ++ - " files with a total of " ++ - (bytesReadable Data.B (toFloat cfg.maxFileSize)) ++ - ". The maximum validity is " ++ - (Data.formatDuration cfg.maxValidity) ++ - ".") - ,text " The »Upload« button is enabled when a description is present and/or files are selected." - ] - -markdownHelp: Model -> Html Msg -markdownHelp model = - div [onClick ToggleMarkdownHelp] - [h3 [class "ui horizontal clearing divider header"] - [i [class "help icon"][] - ,text "Markdown Help" - ] - ,div [class "ui center aligned segment"] - [text "Click somewhere on the help text to close it."] - ,MarkdownHelp.helpTextHtml - ] diff --git a/modules/webapp/src/main/elm/Widgets/UploadList.elm b/modules/webapp/src/main/elm/Widgets/UploadList.elm deleted file mode 100644 index 67461732..00000000 --- a/modules/webapp/src/main/elm/Widgets/UploadList.elm +++ /dev/null @@ -1,161 +0,0 @@ -module Widgets.UploadList exposing (..) - -import Http -import Html exposing (Html, div, table, th, tr, thead, td, tbody, a, i, text, select, option, input, button) -import Html.Attributes exposing (class, href, colspan, value, type_) -import Html.Events exposing (onClick, onInput) -import Json.Decode as Decode - -import Data exposing (Upload, RemoteUrls, UploadId(..)) -import PageLocation as PL - -type alias Model = - {uploads: List Upload - ,urls: RemoteUrls - ,filter: String - } - -makeModel: RemoteUrls -> List Upload -> Model -makeModel urls uploads = - Model uploads urls "all" - -emptyModel: RemoteUrls -> Model -emptyModel urls = - Model [] urls "all" - -hasAlias: Upload -> Bool -hasAlias upload = - Data.isPresent upload.alia - -type Msg - = DeleteUpload String - | DeleteUploadResult (Result Http.Error Int) - | UploadData (Result Http.Error (List Upload)) - | SetFilter String - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - case msg of - DeleteUpload id -> - model ! [httpDeleteUpload model id] - - DeleteUploadResult (Ok n) -> - model ! [httpGetUploads model] - - DeleteUploadResult (Err error) -> - let - x = Debug.log "Error deleting upload" (Data.errorMessage error) - in - model ! [] - - UploadData (Ok list) -> - {model | uploads = list} ! [] - - UploadData (Err error) -> - let - x = Debug.log "Error getting upload list" (Data.errorMessage error) - in - model ! [] - - SetFilter f -> - {model | filter = f} ! [] - - -view: Model -> Html Msg -view model = - table [class "ui selectable celled table"] - [ - thead [] - [ - tr [] - [th [colspan 7] - [ - div [class "ui right aligned container"] - [ - select [class "ui dropdown", onInput SetFilter] - [ - option [value "all"][text "All"] - ,option [value "incoming"][text "Incoming"] - ,option [value "outgoing"][text "Outgoing"] - ] - ] - ] - ] - ,tr [] - [th[][text "Upload"] - ,th[][text "Created"] - ,th[][text "Password"] - ,th[][text "Published"] - ,th[][text "Valid"] - ,th[][text "Alias"] - ,th[][text ""] - ] - ] - ,tbody[] - (model.uploads - |> List.filter (makeFilter model) - |> List.map (createRow model)) - ] - -makeFilter: Model -> Upload -> Bool -makeFilter model upload = - let - present = hasAlias upload - in - case model.filter of - "incoming" -> present - "outgoing" -> not present - _ -> True - - -createRow: Model -> Upload -> Html Msg -createRow model upload = - let - no = "brown minus square outline icon" - yes = "brown checkmark box icon" - in - tr[] - [td [] - [a [href (PL.downloadPageHref (Uid upload.id))] - [Maybe.withDefault upload.id upload.name |> text] - ] - ,td [class "center aligned collapsing"][Data.formatDate upload.created |> text] - ,td [class "center aligned collapsing"] - [ - i [class (if upload.requiresPassword then yes else no)][] - ] - ,td [class "center aligned collapsing"] - [ - case upload.publishId of - Just _ -> i [class yes][] - Nothing -> i [class no][] - ] - ,td [class "center aligned collapsing"] - [ - i [class (if Data.isValidUpload upload then yes else no)][] - ] - ,td [] - [upload.aliasName |> Maybe.withDefault "" |> text] - ,td [class "center aligned collapsing"] - [ - a [class "mini ui basic button", onClick (DeleteUpload upload.id)] - [ - i [class "remove icon"][] - ,text "Delete" - ] - ] - ] - -httpDeleteUpload: Model -> String -> Cmd Msg -httpDeleteUpload model id = - Data.httpDelete (model.urls.uploads ++ "/" ++ id) Http.emptyBody (Decode.field "filesRemoved" Decode.int) - |> Http.send DeleteUploadResult - -httpGetUploads: Model -> Cmd Msg -httpGetUploads model = - Http.get model.urls.uploads (Decode.list Data.decodeUpload) - |> Http.send UploadData - -httpSetName: Model -> String -> String -> Cmd Msg -httpSetName model id name = - Cmd.none diff --git a/modules/webapp/src/main/elm/Widgets/UploadProgress.elm b/modules/webapp/src/main/elm/Widgets/UploadProgress.elm deleted file mode 100644 index 7f96e933..00000000 --- a/modules/webapp/src/main/elm/Widgets/UploadProgress.elm +++ /dev/null @@ -1,122 +0,0 @@ -module Widgets.UploadProgress exposing (..) - -import Html exposing (Html, div, text, i, a) -import Html.Attributes exposing (class, classList) -import Html.Events exposing (onClick) - -import Data -import Ports -import Resumable -import Resumable.Update as ResumableUpdate - -type alias Model = - { resumableModel: Resumable.Model - } - -progressClass: String -progressClass = "sharry-upload-progress" - -emptyModel: Model -emptyModel = - Model Resumable.emptyModel - -isComplete: Model -> Bool -isComplete model = - model.resumableModel.state == Resumable.Completed - -hasErrors: Model -> Bool -hasErrors model = - Resumable.hasErrors model.resumableModel - -type Msg - = ResumableMsg Resumable.Msg - | PauseUpload - | StartUpload - | RetryUpload - -update: Msg -> Model -> (Model, Cmd Msg) -update msg model = - let - handle = Maybe.withDefault "" model.resumableModel.handle - in - case msg of - ResumableMsg msg -> - let - (um, ucmd) = ResumableUpdate.update msg model.resumableModel - progressCmd = \p -> Ports.setProgress ("."++progressClass, p, hasErrors model) - in - case msg of - Resumable.Initialize cfg -> - if isComplete model then - model ! [progressCmd 1.0] - else - model ! [] - - Resumable.Progress percent -> - {model | resumableModel = um} ! [Cmd.map ResumableMsg ucmd, progressCmd percent] - _ -> - {model | resumableModel = um} ! [Cmd.map ResumableMsg ucmd] - - PauseUpload -> - (model, Ports.resumablePause handle) - - StartUpload -> - (model, Ports.resumableStart handle) - - RetryUpload -> - let - rm = model.resumableModel - selectIdent = Tuple.first >> (\f -> f.uniqueIdentifier) - in - {model | resumableModel = {rm | errorFiles = []}} ! [Ports.resumableRetry (handle, List.map selectIdent rm.errorFiles)] - -toggleButton: Model -> Html Msg -toggleButton model = - case model.resumableModel.state of - Resumable.Uploading -> - a [class "ui labeled basic icon button", onClick PauseUpload] - [ - i [class "pause icon"][] - ,text "Pause" - ] - Resumable.Paused -> - a [class "ui labeled basic icon button", onClick StartUpload] - [ - i [class "play icon"][] - ,text "Start" - ] - _ -> div[][] - -retryButton: Model -> Html Msg -retryButton model = - if (isComplete model && hasErrors model) then - a [class "ui labeled basic icon button", onClick RetryUpload] - [ - i [class "retweet icon"][] - ,text "Retry" - ] - else - div[][] - -view: Model -> Html Msg -view model = - let - message = if isComplete model then - if hasErrors model then "There were errors uploading some of your files." else "Done." - else - "Uploading Files" - in - div [] - [ - div [classList [("ui indicating progress " ++ progressClass, True) - ,("error", hasErrors model)]] - [ - div [class "bar"] - [ - div [class "progress"][text "{percent}"] - ] - ,div [class "label"][text message] - ] - ,(toggleButton model) - ,(retryButton model) - ] diff --git a/modules/webapp/src/main/html/index.html b/modules/webapp/src/main/html/index.html deleted file mode 100644 index d1481aba..00000000 --- a/modules/webapp/src/main/html/index.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - Sharry - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/webapp/src/main/html/placeholder.png b/modules/webapp/src/main/html/placeholder.png deleted file mode 100644 index cc29bd82dd7713f083170201ca78fa12a6e7f9bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15322 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 diff --git a/modules/webapp/src/main/js/sharry.js b/modules/webapp/src/main/js/sharry.js deleted file mode 100644 index c9f8a3bc..00000000 --- a/modules/webapp/src/main/js/sharry.js +++ /dev/null @@ -1,234 +0,0 @@ -elmApp.ports.setAccount.subscribe(function(state) { - localStorage.setItem('account', JSON.stringify(state)); -}); - -elmApp.ports.removeAccount.subscribe(function() { - localStorage.removeItem('account'); -}); - -elmApp.ports.reloadPage.subscribe(function() { - location.reload(); -}); - -// semantic interop - -elmApp.ports.setProgress.subscribe(function(selectorPercentError) { - var selector = selectorPercentError[0]; - var percent = selectorPercentError[1]; - var error = selectorPercentError[2]; - percent = Math.round(percent * 100); - $(selector).progress('set percent', percent); - if (error) { - $(selector).progress( "set error"); - } -}); - -elmApp.ports.initAccordionAndTabs.subscribe(function() { - //https://github.com/Semantic-Org/Semantic-UI/issues/5421 - $('.ui.accordion').accordion({animateChildren: false}); - $('.tabular.menu .item').tab({history: false}); -}); - -elmApp.ports.initEmbeds.subscribe(function() { - $('.ui.embed').embed({ - onDisplay: function () { - // For images an img tag is rendered without a width - // attribue resulting in displaying the image in original - // size. This adds a widh attribute, so it is resized to - // see the full image - $(this).find("iframe").bind("load", function() { - $(this).contents().find("img").attr("width", "100%"); - }); - } - }); -}); - - -// very nice, found here: https://gist.github.com/gordonbrander/2230317 -var genId = function (prefix) { - // Math.random should be unique because of its seeding algorithm. - // Convert it to base 36 (numbers + letters), and grab the first x characters - // after the decimal. - var gen = function() { - return Math.random().toString(36).substr(2); - }; - - var p = prefix || ""; - return p + gen() + gen(); -}; - -elmApp.ports.makeRandomString.subscribe(function(prefix) { - var s = genId(prefix); - elmApp.ports.randomString.send(s); -}); - -// resumable interop - -var sharryResumables = {}; - -elmApp.ports.resumableSetComplete.subscribe(function(handleSelector) { - var handle = handleSelector[0]; - var r = sharryResumables[handle]; - if (r) { - var page = r.opts.page; - $(handleSelector[1]).progress('set percent', 100); - elmApp.ports.resumableComplete.send(page); - } -}); - - -var registerCallbacks = function(r, browseClass, dropClass) { - var nodes0 = document.querySelectorAll(browseClass); - if (nodes0.length == 1) { - r.assignBrowse(nodes0[0]); - } else { - console.warn("No elements to bind browseButton"); - } - var nodes1 = document.querySelectorAll(dropClass); - if (nodes1.length == 1) { - r.assignDrop(nodes1[0]); - } else { - console.warn("No elements to bind dropZone"); - } - return nodes0.length + nodes1.length; -}; - -elmApp.ports.resumableRebind.subscribe(function(handle) { - var r = sharryResumables[handle]; - if (r) { - registerCallbacks(r, r.opts.browseClass, r.opts.dropClass); - } -}); - -elmApp.ports.resetResumable.subscribe(function(handle) { - var r = sharryResumables[handle]; - if (r) { - r.cancel(); - delete sharryResumables[handle]; - var cfg = r.opts; - var id = genId("u"); - elmApp.ports.resumableHandle.send([cfg.page, id]); - } -}); - -elmApp.ports.resumableStart.subscribe(function(handle) { - var r = sharryResumables[handle]; - if (r) { - r.upload(); - } -}); - -elmApp.ports.resumablePause.subscribe(function(handle) { - var r = sharryResumables[handle]; - if (r) { - r.pause(); - } -}); - -elmApp.ports.resumableCancel.subscribe(function(handle) { - var r = sharryResumables[handle]; - if (r) { - r.cancel(); - } -}); - -elmApp.ports.resumableRetry.subscribe(function(handleAndIds) { - var handle = handleAndIds[0]; - var ids = handleAndIds[1]; - var r = sharryResumables[handle]; - if (r) { - ids.forEach(function(id) { - var file = r.getFromUniqueIdentifier(id); - if (file) { - file.retry(); - } - }); - } -}); - -elmApp.ports.makeResumable.subscribe(function(cfg) { - var id = cfg.handle || genId("u"); - var page = cfg.page; - var browseClass = cfg.browseClass; - var dropClass = cfg.dropClass; - - var makeFile = function(file) { - var progress = 0; - if (file.hasOwnProperty("process")) { - progress = file.progress(); - } - var completed = false; - if (file.hasOwnProperty("isComplete")) { - completed = file.isComplete(); - } - var uploading = false; - if (file.hasOwnProperty("isUploading")) { - uploading = file.isUploading(); - } - return { - fileName: file.fileName || file.name, - size: file.size, - uniqueIdentifier: file.uniqueIdentifier || "", - progress: progress, - completed: completed, - uploading: uploading - }; - }; - if (!sharryResumables[id]) { - if (cfg.maxFiles <= 0) { - cfg.maxFiles = undefined; - } - if (cfg.maxFileSize <= 0) { - cfg.maxFileSize = undefined; - } - cfg.chunkRetryInterval = 800; - cfg.typeParameterName = ""; - cfg.method = "octet"; - cfg.query = { token: id }; - cfg.maxFileSizeErrorCallback = function(file, count) { - if (file instanceof FileList && file.length > 0) { - elmApp.ports.resumableMaxFileSizeError.send([page, makeFile(file.item(0))]); - } else { - elmApp.ports.resumableMaxFileSizeError.send([page, makeFile(file)]); - } - }; - cfg.maxFilesErrorCallback = function(file, count) { - if (file instanceof FileList && file.length > 0) { - elmApp.ports.resumableMaxFilesError.send([page, makeFile(file.item(0)), count]); - } else { - elmApp.ports.resumableMaxFilesError.send([page, makeFile(file), count]); - } - }; - var r = new Resumable(cfg); - var n = registerCallbacks(r, browseClass, dropClass); - if (n > 0) { - sharryResumables[id] = r; - - r.on('uploadStart', function() { - elmApp.ports.resumableStarted.send(page); - }); - r.on('fileAdded', function(file, event) { - elmApp.ports.resumableFileAdded.send([page, makeFile(file)]); - }); - r.on('fileSuccess', function(file, message) { - elmApp.ports.resumableFileSuccess.send([page, makeFile(file)]); - }); - r.on('progress', function() { - elmApp.ports.resumableProgress.send([page, r.progress()]); - }); - r.on('complete', function() { - elmApp.ports.resumableComplete.send(page); - }); - r.on('pause', function() { - elmApp.ports.resumablePaused.send(page); - }); - r.on('error', function(message, file) { - elmApp.ports.resumableError.send([page, message, makeFile(file)]); - }); - - elmApp.ports.resumableHandle.send([page, id]); - } - } else { - registerCallbacks(sharryResumables[id], browseClass, dropClass); - } -}); diff --git a/modules/webapp/src/main/scala/sharry/webapp/route/Url.scala b/modules/webapp/src/main/scala/sharry/webapp/route/Url.scala deleted file mode 100644 index 7b0484a0..00000000 --- a/modules/webapp/src/main/scala/sharry/webapp/route/Url.scala +++ /dev/null @@ -1,56 +0,0 @@ -package sharry.webapp.route - -import java.net.URL -import java.nio.file.{Path, Paths} -import cats.syntax.either._ -import fs2.{io, Stream} -import cats.effect.IO - -case class Url(jurl: URL) { - require(jurl != null, "url argument must not be null") - - val asString = jurl.toString - - def host = jurl.getHost - def protocol = jurl.getProtocol - def path: Option[Path] = Option(jurl.getPath).filter(_.nonEmpty).map(p => Paths.get(p)) - - def fileName: Option[String] = - path.map(_.getFileName.toString) - - def readAll(chunkSize: Int): Stream[IO, Byte] = - io.readInputStream(IO(jurl.openStream), chunkSize) - - def toJava = jurl -} - -object Url { - def apply(url: String): Url = - try { - Url(new URL(url)) - } catch { - case e: java.net.MalformedURLException => - val e2 = new java.net.MalformedURLException(e.getMessage +" ("+ url +")") - e2.setStackTrace(e.getStackTrace) - throw e2 - } - - def tryApply(url: String): Either[Throwable, Url] = - Either.catchNonFatal(apply(url)) - - def file(p: Path): Url = Url(s"file://${p.normalize.toAbsolutePath}") - - def resource(name: String): Option[Url] = - Option(getClass.getClassLoader.getResource(name)).map(Url(_)) - - object Parts { - def unapply(url: Url): Option[(String, String, Option[Path])] = - Some((url.protocol, url.host, url.path)) - } - - object Protocol { - def unapply(url: Url): Option[String] = - Some(url.protocol) - } - -} diff --git a/modules/webapp/src/main/scala/sharry/webapp/route/webjar.scala b/modules/webapp/src/main/scala/sharry/webapp/route/webjar.scala deleted file mode 100644 index c2945065..00000000 --- a/modules/webapp/src/main/scala/sharry/webapp/route/webjar.scala +++ /dev/null @@ -1,204 +0,0 @@ -package sharry.webapp.route - -import java.time.{Instant, ZoneId} -import io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._ -import fs2.{text, Stream} -import cats.effect.IO -import shapeless.{HNil, ::} -import scodec.bits.BitVector -import spinoco.fs2.http.routing._ -import spinoco.fs2.http.HttpResponse -import spinoco.protocol.mime._ -import spinoco.protocol.http.{HttpResponseHeader, HttpStatusCode} -import spinoco.protocol.http.header._ -import spinoco.protocol.http.header.value._ -import yamusca.implicits._ -import yamusca.imports._ - -import sharry.common.data._ - -object webjar { - val webjarToc: Webjars.Toc = readWebjarToc.unsafeRunSync - - private def readWebjarToc: IO[Webjars.Toc] = { - def parseToc(json: String): Webjars.Toc = - decode[Webjars.Toc](json) match { - case Right(toc) => toc - case Left(ex) => throw ex - } - - val tocUrl = Url(getClass.getResource("toc.json")) - tocUrl.readAll(32 * 1024). - through(text.utf8Decode). - fold1(_ + _). - map(parseToc). - compile.last. - map(_.get) - } - - def endpoint(config: RemoteConfig): Route[IO] = - choice(resourceGet, index(config)) - - - def ifModifiedSince: Matcher[IO, Option[Instant]] = - header[`If-Modified-Since`].? map { _.map { - v => v.value.atZone(ZoneId.of("UTC")).toInstant - }} - - def ifNoneMatch: Matcher[IO, Option[String]] = - header[`If-None-Match`].? map { - case Some(`If-None-Match`(EntityTagRange.Range(List(EntityTag(tag, false))))) => Some(tag) - case _ => None - } - - def restPath: Matcher[IO, Seq[String]] = - path.map(p => p.segments) - - - def resourceGet: Route[IO] = - Get >> ifModifiedSince :: ifNoneMatch :: "static" / as[String] :/: restPath map { - case modSince :: noneMatch :: name :: rest :: HNil => - Stream.emit { - resource.lookup(name, rest, modSince, noneMatch) match { - case res @ Find.Found((_, url)) => - makeResponse(res, rest).copy(body = url.readAll(8192)) - case res => - makeResponse(res, rest) - } - } - } - - - def index(config: RemoteConfig): Route[IO] = { - val indexHtml = html.render(config).compile.toVector.unsafeRunSync - Get >> choice(empty, "index.html") >> ifModifiedSince :: ifNoneMatch map { - case modSince :: noneMatch :: HNil => - val index = Seq("index.html") - Stream[HttpResponse[IO]] { - resource.lookup("sharry-webapp", index, modSince, noneMatch) match { - case res @ Find.Found((wj, _)) => - makeResponse(res, index, Some(indexHtml.size.toLong)).copy(body = Stream.emits(indexHtml)) - - case res => - makeResponse(res, index, Some(indexHtml.size.toLong)) - } - } - } - } - - private def makeResponse(find: Find[(Webjars.ModuleId, Url)], path: Seq[String], len: Option[Long] = None): HttpResponse[IO] = { - def parseContentType(s: String): ContentType = - ContentType.codec.decodeValue(BitVector.view(s.getBytes("UTF-8"))).require - - def make(wj: Webjars.ModuleId, status: HttpStatusCode): HttpResponse[IO] = { - val p = path.mkString("/") - HttpResponse( - HttpResponseHeader( - status = status, - reason = "", - headers = List( - Some(ETag(EntityTag(wj.hash, false))), - Some(`Last-Modified`(Webjars.lastModified.atZone(ZoneId.of("UTC")).toLocalDateTime)), - webjarToc.get(wj.hash).flatMap(_.get(p)).map(fi => `Content-Type`(parseContentType(fi.contentType))), - len.orElse(webjarToc.get(wj.hash).flatMap(_.get(p)).map(_.length)).map(`Content-Length`.apply) - ).collect({case Some(v) => v })), - Stream.empty - ) - } - find match { - case Find.Found((wj, _)) => - make(wj, HttpStatusCode.Ok) - case Find.NotModified((wj, _)) => - make(wj, HttpStatusCode.NotModified) - case Find.NotFound => - HttpResponse(HttpResponseHeader(HttpStatusCode.NotFound, ""), Stream.empty) - } - } - - sealed trait Find[+A] { - def map[B](f: A => B): Find[B] - def getOrElse[B >: A](a: => B): B - } - object Find { - case class Found[+A](value: A) extends Find[A] { - def map[B](f: A => B) = Found(f(value)) - def getOrElse[B>:A](a: => B): B = value - } - case class NotModified[+A](value: A) extends Find[A] { - def map[B](f: A => B) = NotModified(f(value)) - def getOrElse[B>:A](a: => B): B = value - } - case object NotFound extends Find[Nothing] { - def map[B](f: Nothing => B) = this - def getOrElse[B>:Nothing](a: => B): B = a - } - } - - object resource { - - def lookup(name: String, path: Seq[String], modSince: Option[Instant] = None, noneMatch: Option[String] = None): Find[(Webjars.ModuleId, Url)] = - find(name, path) match { - case Some((wj, url)) if isMatch(wj, noneMatch) || isUnmodified(modSince) => - Find.NotModified((wj, url)) - case Some((wj, url)) => - Find.Found((wj, url)) - case None => - Find.NotFound - } - - - private def find(name: String, path: Seq[String]): Option[(Webjars.ModuleId, Url)] = - for { - wj <- Webjars.modules.find(_.artifactId equalsIgnoreCase name) - url <- wj.localUrl(path.mkString("/")) - } yield (wj, url) - - def isMatch(wj: Webjars.ModuleId, noneMatch: Option[String]): Boolean = - Some(wj.hash) == noneMatch - - def isUnmodified(modSince: Option[Instant]): Boolean = - modSince match { - case Some(since) => Webjars.lastModified.isBefore(since) - case _ => false - } - - private implicit class WebjarOps(wj: Webjars.ModuleId) { - - def localUrl(path: String): Option[Url] = { - val resource = s"${wj.resourcePrefix}/$path" - Option(getClass.getResource(resource)).map(Url.apply) - } - - def cdnUrl(path: String, protocol: String = "http"): Url = { - val base = s"$protocol://cdn.jsdelivr.net/webjars/org.webjars/${wj.artifactId}/${wj.version}/$path" - Url(base) - } - } - } - - object html { - - case class Data(config: String, highlightjsTheme: String) - object Data { - implicit val dataConverter: ValueConverter[Data] = - ValueConverter.deriveConverter[Data] - } - - def render(config: RemoteConfig): Stream[IO, Byte] = { - resource.lookup("sharry-webapp", Seq("index.html")) match { - case Find.Found((wj, url)) => - val data = Data(config.asJson.spaces4, config.highlightjsTheme) - url.readAll(8192). - through(text.utf8Decode). - fold1(_ + _). - map(mustache.parse). - map(_.left.map(err => new Exception(s"${err._2} at ${err._1.pos}"))). - rethrow. - map(data.render). - through(text.utf8Encode) - - case _ => sys.error("index.html not found") - } - } - } -} diff --git a/modules/webapp/src/main/html/favicon/android-chrome-192x192.png b/modules/webapp/src/main/webjar/favicon/android-chrome-192x192.png similarity index 100% rename from modules/webapp/src/main/html/favicon/android-chrome-192x192.png rename to modules/webapp/src/main/webjar/favicon/android-chrome-192x192.png diff --git a/modules/webapp/src/main/html/favicon/android-chrome-512x512.png b/modules/webapp/src/main/webjar/favicon/android-chrome-512x512.png similarity index 100% rename from modules/webapp/src/main/html/favicon/android-chrome-512x512.png rename to modules/webapp/src/main/webjar/favicon/android-chrome-512x512.png diff --git a/modules/webapp/src/main/html/favicon/apple-touch-icon.png b/modules/webapp/src/main/webjar/favicon/apple-touch-icon.png similarity index 100% rename from modules/webapp/src/main/html/favicon/apple-touch-icon.png rename to modules/webapp/src/main/webjar/favicon/apple-touch-icon.png diff --git a/modules/webapp/src/main/html/favicon/browserconfig.xml b/modules/webapp/src/main/webjar/favicon/browserconfig.xml similarity index 100% rename from modules/webapp/src/main/html/favicon/browserconfig.xml rename to modules/webapp/src/main/webjar/favicon/browserconfig.xml diff --git a/modules/webapp/src/main/html/favicon/favicon-16x16.png b/modules/webapp/src/main/webjar/favicon/favicon-16x16.png similarity index 100% rename from modules/webapp/src/main/html/favicon/favicon-16x16.png rename to modules/webapp/src/main/webjar/favicon/favicon-16x16.png diff --git a/modules/webapp/src/main/html/favicon/favicon-32x32.png b/modules/webapp/src/main/webjar/favicon/favicon-32x32.png similarity index 100% rename from modules/webapp/src/main/html/favicon/favicon-32x32.png rename to modules/webapp/src/main/webjar/favicon/favicon-32x32.png diff --git a/modules/webapp/src/main/html/favicon/favicon.ico b/modules/webapp/src/main/webjar/favicon/favicon.ico similarity index 100% rename from modules/webapp/src/main/html/favicon/favicon.ico rename to modules/webapp/src/main/webjar/favicon/favicon.ico diff --git a/modules/webapp/src/main/html/favicon/manifest.json b/modules/webapp/src/main/webjar/favicon/manifest.json similarity index 100% rename from modules/webapp/src/main/html/favicon/manifest.json rename to modules/webapp/src/main/webjar/favicon/manifest.json diff --git a/modules/webapp/src/main/html/favicon/mstile-150x150.png b/modules/webapp/src/main/webjar/favicon/mstile-150x150.png similarity index 100% rename from modules/webapp/src/main/html/favicon/mstile-150x150.png rename to modules/webapp/src/main/webjar/favicon/mstile-150x150.png diff --git a/modules/webapp/src/main/html/favicon/safari-pinned-tab.svg b/modules/webapp/src/main/webjar/favicon/safari-pinned-tab.svg similarity index 100% rename from modules/webapp/src/main/html/favicon/safari-pinned-tab.svg rename to modules/webapp/src/main/webjar/favicon/safari-pinned-tab.svg diff --git a/modules/webapp/src/main/webjar/img/icon.svg b/modules/webapp/src/main/webjar/img/icon.svg new file mode 120000 index 00000000..c72880d8 --- /dev/null +++ b/modules/webapp/src/main/webjar/img/icon.svg @@ -0,0 +1 @@ +../../../../../../artwork/icon.svg \ No newline at end of file diff --git a/modules/webapp/src/main/webjar/img/logo.png b/modules/webapp/src/main/webjar/img/logo.png new file mode 120000 index 00000000..028b5082 --- /dev/null +++ b/modules/webapp/src/main/webjar/img/logo.png @@ -0,0 +1 @@ +../../../../../../artwork/logo.png \ No newline at end of file diff --git a/modules/webapp/src/main/webjar/img/logo.svg b/modules/webapp/src/main/webjar/img/logo.svg new file mode 120000 index 00000000..c08d1be8 --- /dev/null +++ b/modules/webapp/src/main/webjar/img/logo.svg @@ -0,0 +1 @@ +../../../../../../artwork/logo.svg \ No newline at end of file diff --git a/modules/webapp/src/main/webjar/sharry.css b/modules/webapp/src/main/webjar/sharry.css new file mode 100644 index 00000000..f308a4d2 --- /dev/null +++ b/modules/webapp/src/main/webjar/sharry.css @@ -0,0 +1,114 @@ +/* Sharry CSS */ + +.default-layout { + background: #fff; + height: 100vh; +} + +.default-layout .main-content { + margin-top: 45px; +} + +.default-layout .main-content h1 { + padding-top: 15px; +} + +.default-layout a.header.item > img.ui.image.logo-icon, +.default-layout a.icon.item > img.image.icon.logo-icon { + height: 14px; + margin-right: 16px; +} + +.default-layout .home-page > .segment { + margin-top: 110px; +} + +.default-layout .share-description { + font-size: 1.14285714rem; + line-height: 1.5; +} + +.default-layout .preview-image { + max-height: 300px; + width: 290px; +} + +.default-layout embed.full-embed { + width: 100%; + height: 90%; +} +.default-layout img.full-width { + width: 100%; + height: auto; +} + +.default-layout .full-height { + height: 100%; +} + +.login-layout, .register-layout, .newinvite-layout { + background: #aaa; + height: 101vh; +} + +.login-layout .login-view, .register-layout .register-view { + background: #fff; + position: relative; + top: 2vh; +} + +label.ui.button input[type="file"] { + display: none; +} + +.ui.form .markdown-preview { + overflow: auto; + max-height: 300px; +} +.ui.form .markdown-split > textarea.markdown-editor { + height: 100%; + max-height: 300px; +} +.ui.form textarea.markdown-editor { + max-height: 300px; +} +.ui.form .mini.menu a.help-link { + color: #4183c4 +} + +label span.muted { + font-size: smaller; + color: rgba(0,0,0,0.6); + margin-left: 0.5em; +} + +.ui > pre.url { + font-size: smaller; + margin: 5px 5px; +} + +.ui.header>img.logo.image { + width: 220px; +} + +.ui.dropdown.open { + z-index: 20; +} + +.invisible { + display: none !important; +} + +table.selectable > tbody > tr { + cursor: pointer; +} + +@media (min-height: 320px) { + .ui.footer { + position: fixed; + bottom: 0; + width: 100%; + text-align: center; + font-size: x-small; + } +} diff --git a/modules/webapp/src/main/webjar/sharry.js b/modules/webapp/src/main/webjar/sharry.js new file mode 100644 index 00000000..d7e4b755 --- /dev/null +++ b/modules/webapp/src/main/webjar/sharry.js @@ -0,0 +1,151 @@ +/* Sharry JS */ + +var elmApp = Elm.Main.init({ + node: document.getElementById("sharry-app"), + flags: elmFlags +}); + +elmApp.ports.setAccount.subscribe(function(authResult) { + console.log("Add account from local storage"); + localStorage.setItem("account", JSON.stringify(authResult)); +}); + +elmApp.ports.removeAccount.subscribe(function() { + console.log("Remove account from local storage"); + localStorage.removeItem("account"); +}); + +elmApp.ports.setProgress.subscribe(function(data) { + for (var i = 0; i < data.length; i++) { + var id = data[i][0]; + var perc = data[i][1]; + if (perc < 0) { + perc = 0; + } + if (perc > 100) { + perc = 100; + } + $("#" + id).progress({ + percent: perc + }); + } +}); + +elmApp.ports.scrollTop.subscribe(function(data) { + window.scrollTo(0, 0); +}); + +elmApp.ports.scrollToElem.subscribe(function(id) { + if (id && id != "") { + window.setTimeout(function() { + var el = document.getElementById(id); + if (el) { + if (el["scrollIntoViewIfNeeded"]) { + el.scrollIntoViewIfNeeded(); + } else { + el.scrollIntoView(); + } + } + }, 0); + } +}); + +var sharry_uploads = {}; + +elmApp.ports.submitFiles.subscribe(function(data) { + var url = data.url; + var files = data.files; + var myHeaders = {}; + if (data.aliasId) { + myHeaders["Sharry-Alias"] = data.aliasId; + } + + var doUpload = function (index, file) { + var upload = new tus.Upload( + file, + { endpoint: url, + chunkSize: sharryFlags.chunkSize, + retryDelays: sharryFlags.retryDelays, + removeFingerprintOnSuccess: true, + headers: $.extend(myHeaders, { + "Sharry-File-Name": encodeURIComponent(file.name), + "Sharry-File-Length": file.size, + "Sharry-File-Type": file.type + }), + onError: function(error) { + console.log("XX: " + error); + elmApp.ports.uploadState.send({ + id: data.id, + file: index, + progress: { + state: "failed", + error: (error || "").toString() + } + }); + }, + onProgress: function(bytesUploaded, bytesTotal) { + elmApp.ports.uploadState.send({ + id: data.id, + file: index, + progress: { + state: "progress", + uploaded: bytesUploaded, + total: bytesTotal + } + }); + }, + onChunkComplete: function(chunkSize, bytesUploaded, bytesTotal) { + elmApp.ports.uploadState.send({ + id: data.id, + file: index, + progress: { + state: "progress", + uploaded: bytesUploaded, + total: bytesTotal + } + }); + }, + onSuccess: function() { + elmApp.ports.uploadState.send({ + id: data.id, + file: index, + progress: { + state: "complete" + } + }); + var next = index + 1; + if (next < files.length) { + doUpload(next, files[next]); + } else { + delete sharry_uploads[data.id]; + } + } + }); + sharry_uploads[data.id] = upload; + upload.start(); + }; + + if (url && files && files.length > 0) { + doUpload(0, files[0]); + } else { + console.log("No files to upload"); + } +}); + +elmApp.ports.stopUpload.subscribe(function(id) { + var upload = sharry_uploads[id]; + if (upload) { + upload.abort(false, function(error) { + elmApp.ports.uploadStopped.send(error); + }); + // The callback is not called by tus-js-client … + elmApp.ports.uploadStopped.send(null); + } +}); + +elmApp.ports.startUpload.subscribe(function(id) { + var upload = sharry_uploads[id]; + if (upload) { + upload.start(); + } +}); diff --git a/modules/webapp/src/test/elm/DataTest.elm b/modules/webapp/src/test/elm/DataTest.elm deleted file mode 100644 index 5e369544..00000000 --- a/modules/webapp/src/test/elm/DataTest.elm +++ /dev/null @@ -1,43 +0,0 @@ -module DataTest exposing (..) - -import Expect -import Test exposing (Test, describe, test, fuzz) -import Fuzz exposing (string) - -import Data - -formatDate: Test -formatDate = - describe "format date times" - [ test "prepend zeros" <| - \() -> - "2017-05-21T12:03:03Z" - |> Data.formatDate - |> Expect.equal "Sun, 21. May 2017, 14:03" - ] - - -parseDuration: Test -parseDuration = - describe "parse java.time.Durations" - [ test "hours" <| - \() -> - "PT96H" - |> Data.parseDuration - |> Expect.equal (Just (96, "h")) - ] - -formatDuration: Test -formatDuration = - describe "format durations" - [ test "hours" <| - \() -> - "PT12H" - |> Data.formatDuration - |> Expect.equal "12h" - , test "days" <| - \() -> - "PT96H" - |> Data.formatDuration - |> Expect.equal "4d" - ] diff --git a/nixos-sbt b/nixos-sbt deleted file mode 100755 index f247903b..00000000 --- a/nixos-sbt +++ /dev/null @@ -1,20 +0,0 @@ -#!/usr/bin/env bash -# -# TL;DR: use this script ot start sbt if you're on NixOS > -# 18.03. Otherwise running just "sbt" should work. -# -# Sharry using Elm 0.18.0 and newer NixOSes have 0.19.0 installed. -# -# The build.nix creates a FHS environment that is also necessary to -# create the debian package. -# -# The LD_LIBRARY_PATH is set to empty, because there were strange -# errors when running elm-make: -# -# relocation error: /usr/lib/libc.so.6: symbol -# _dl_exception_create, version GLIBC_PRIVATE not defined in file -# ld-linux-x86-64.so.2 with link time reference -# -# See here: https://github.com/NixOS/nixpkgs/issues/48780 - -nix-build build.nix && ./result/bin/sharry-sbt diff --git a/project/Dependencies.scala b/project/Dependencies.scala new file mode 100644 index 00000000..7147094e --- /dev/null +++ b/project/Dependencies.scala @@ -0,0 +1,140 @@ +import sbt._ + +object Dependencies { + + val BcryptVersion = "0.4" + val BetterMonadicForVersion = "0.3.1" + val BitpeaceVersion = "0.4.1" + val CirceVersion = "0.12.3" + val DoobieVersion = "0.8.7" + val EmilVersion = "0.1.1" + val FastparseVersion = "2.1.3" + val FlywayVersion = "6.1.3" + val Fs2Version = "2.1.0" + val H2Version = "1.4.200" + val Http4sVersion = "0.21.0-M6" + val JQueryVersion = "3.4.1" + val KindProjectorVersion = "0.10.3" + val Log4sVersion = "1.8.2" + val LogbackVersion = "1.2.3" + val MariaDbVersion = "2.5.2" + val MiniTestVersion = "2.7.0" + val PostgresVersion = "42.2.9" + val PureConfigVersion = "0.12.2" + val SemanticUIVersion = "2.4.1" + val SqliteVersion = "3.28.0" + val SwaggerVersion = "3.24.3" + val TikaVersion = "1.23" + val TusClientVersion = "1.8.0-1" + val YamuscaVersion = "0.6.1" + + val fs2 = Seq( + "co.fs2" %% "fs2-core" % Fs2Version + ) + val fs2io = Seq( + "co.fs2" %% "fs2-io" % Fs2Version + ) + + val tika = Seq( + "org.apache.tika" % "tika-core" % TikaVersion + ) + + val http4s = Seq( + "org.http4s" %% "http4s-blaze-server" % Http4sVersion, + "org.http4s" %% "http4s-circe" % Http4sVersion, + "org.http4s" %% "http4s-dsl" % Http4sVersion + ) + + val http4sclient = Seq( + "org.http4s" %% "http4s-dsl" % Http4sVersion, + "org.http4s" %% "http4s-blaze-client" % Http4sVersion + ) + + val circe = Seq( + "io.circe" %% "circe-generic" % CirceVersion, + "io.circe" %% "circe-parser" % CirceVersion + ) + + // https://github.com/Log4s/log4s;ASL 2.0 + val loggingApi = Seq( + "org.log4s" %% "log4s" % Log4sVersion + ) + + val logging = Seq( + "ch.qos.logback" % "logback-classic" % LogbackVersion % Runtime + ) + + // https://github.com/melrief/pureconfig + // MPL 2.0 + val pureconfig = Seq( + "com.github.pureconfig" %% "pureconfig" % PureConfigVersion + ) + + val fastparse = Seq( + "com.lihaoyi" %% "fastparse" % FastparseVersion + ) + + // https://github.com/h2database/h2database + // MPL 2.0 or EPL 1.0 + val h2 = Seq( + "com.h2database" % "h2" % H2Version + ) + val mariadb = Seq( + "org.mariadb.jdbc" % "mariadb-java-client" % MariaDbVersion + ) + val postgres = Seq( + "org.postgresql" % "postgresql" % PostgresVersion + ) + val sqlite = Seq( + "org.xerial" % "sqlite-jdbc" % SqliteVersion + ) + val databases = h2 ++ mariadb ++ postgres ++ sqlite + + // https://github.com/tpolecat/doobie + // MIT + val doobie = Seq( + "org.tpolecat" %% "doobie-core" % DoobieVersion, + "org.tpolecat" %% "doobie-hikari" % DoobieVersion + ) + + val bitpeace = Seq( + "com.github.eikek" %% "bitpeace-core" % BitpeaceVersion + ) + + val emil = Seq( + "com.github.eikek" %% "emil-common" % EmilVersion, + "com.github.eikek" %% "emil-javamail" % EmilVersion + ) + + // https://github.com/flyway/flyway + // ASL 2.0 + val flyway = Seq( + "org.flywaydb" % "flyway-core" % FlywayVersion + ) + + val yamusca = Seq( + "com.github.eikek" %% "yamusca-core" % YamuscaVersion + ) + + val bcrypt = Seq( + "org.mindrot" % "jbcrypt" % BcryptVersion + ) + + val miniTest = Seq( + // https://github.com/monix/minitest + // Apache 2.0 + "io.monix" %% "minitest" % MiniTestVersion, + "io.monix" %% "minitest-laws" % MiniTestVersion + ).map(_ % Test) + + val kindProjectorPlugin = "org.typelevel" %% "kind-projector" % KindProjectorVersion + val betterMonadicFor = "com.olegpy" %% "better-monadic-for" % BetterMonadicForVersion + + val webjars = Seq( + "org.webjars" % "swagger-ui" % SwaggerVersion, + "org.webjars" % "Semantic-UI" % SemanticUIVersion, + "org.webjars" % "jquery" % JQueryVersion, + "org.webjars.npm" % "tus-js-client" % TusClientVersion + ) + +} diff --git a/project/ElmPlugin.scala b/project/ElmPlugin.scala deleted file mode 100644 index 54c82cc0..00000000 --- a/project/ElmPlugin.scala +++ /dev/null @@ -1,189 +0,0 @@ -package sharry.build - -import sbt._ -import sbt.Keys._ -import java.nio.file._ -import scala.util.{Failure, Success, Try} -import scala.sys.process._ -import com.google.javascript.jscomp.CommandLineRunner - -object ElmPlugin extends AutoPlugin { - - object autoImport { - val elmMakeExecuteable = settingKey[String]("The executable `elm-make'") - val elmTestExecuteable = settingKey[String]("The executable `elm-test'") - val elmMakeOutputPath = settingKey[File]("The directory to store elm-make output") - val elmDependencies = settingKey[Seq[(String, String)]]("Elm package dependencies") - val elmSources = settingKey[File]("Directory to scan for elm files") - val elmVersion = settingKey[String]("The version (range) for elm language") - val elmDebug = settingKey[Boolean]("Whether to use --debug with `elm-make'") - val elmWd = settingKey[File]("Working directory for elm-make") - val elmGithubRepo = settingKey[String]("Github url to elm package (required in elm-package.json)") - val elmReactorExecuteable = settingKey[String]("Executeable for `elm-reactor'") - val elmReactorPort = settingKey[Int]("The port for elm-reactor") - val elmMakeCompilationLevel = settingKey[String]("The compilation level passed to google closure compiler. One of WHITESPACE_ONLY, SIMPLE or ADVANCED") - val elmMinify = settingKey[Boolean]("Whether to run minifier after compilation") - val elmProject = taskKey[Seq[File]]("Create elm-package.json") - val elmMake = taskKey[Seq[File]]("Compile elm files") - val elmTest = taskKey[Seq[File]]("Run elm tests using elm-test") - val elmReactor = taskKey[Unit]("Run `elm-reactor'") - } - - import autoImport._ - - lazy val elmSettings = Seq( - elmMakeExecuteable := "elm-make", - elmTestExecuteable := "elm-test", - elmReactorExecuteable := "elm-reactor", - elmReactorPort := 8000, - elmMakeOutputPath := (resourceManaged in Compile).value/"META-INF"/"resources"/"webjars"/(name in Compile).value/(version in Compile).value, - elmSources := (sourceDirectory in Compile).value/"elm", - elmSources in Test := (sourceDirectory in Test).value/"elm", - elmDebug := false, - elmMinify := false, - elmGithubRepo := (homepage.value match { - case Some(url) if url.toString.startsWith("https://github.com") => url.toString - case _ => "https://github.com/user/repo.git" - }), - elmDependencies := Seq.empty, - elmDependencies in Test := (elmDependencies in Compile).value, - elmWd := (target in Compile).value/"elm-make", - elmMakeCompilationLevel := "SIMPLE", - elmProject := { - val wd = elmWd.value - val logger = streams.value.log - IO.createDirectories(Seq(wd)) - if (!Files.exists((wd/elmSources.value.getName).toPath) && Files.exists(elmSources.value.toPath)) { - Files.createSymbolicLink((wd/elmSources.value.getName).toPath, elmSources.value.toPath) - } - val pkgJson = wd/"elm-package.json" - val content = packageJson(elmDependencies, false).value - if (!pkgJson.exists || Hash.toHex(Hash(pkgJson)) != Hash.toHex(Hash(content))) { - logger.info("Generating elm-package.json") - IO.write(pkgJson, content) - } - - val testPkgJson = wd/"tests"/"elm-package.json" - val testContent = packageJson(elmDependencies in Test, true).value - if (!testPkgJson.exists || Hash.toHex(Hash(testPkgJson)) != Hash.toHex(Hash(testContent))) { - logger.info("Generating tests/elm-package.json") - IO.write(testPkgJson, testContent) - } - if (!Files.exists((wd/"tests"/(elmSources in Test).value.getName).toPath) && Files.exists((elmSources in Test).value.toPath)) { - Files.createSymbolicLink((wd/"tests"/(elmSources in Test).value.getName).toPath, (elmSources in Test).value.toPath) - } - - Seq(pkgJson, testPkgJson) - }, - elmMake := { - val logger = streams.value.log - val pkg = elmProject.value - val wd = elmWd.value - // need to check all files whether to decide for recompile - val allFiles: Seq[File] = sbt.Path.allSubpaths(elmSources.value). - map(_._1). - filter(_.getName.endsWith(".elm")). - toSeq - val filesToCompile = IO.listFiles(elmSources.value, GlobFilter("*.elm")). - map(f => elmSources.value.getName + java.io.File.separator + f.getName) - if (allFiles.isEmpty) { - logger.info("No elm source files found.") - Seq.empty - } else { - val newest = allFiles.sortBy(-_.lastModified).head - val out = elmMakeOutputPath.value/"elm-main.js" - val minified = elmMakeOutputPath.value/"elm-main.min.js" - if (!out.exists || newest.lastModified >= out.lastModified) { - logger.info(s"Compiling ${filesToCompile.size} elm files …") - IO.delete(Seq(out, minified)) - val opts: Seq[String] = if (elmDebug.value) Seq("--debug", "--yes") else Seq("--yes") - val proc = Process(elmMakeExecuteable.value +: (filesToCompile ++ opts ++ Seq("--output", out.toString)), Some(wd)) - runCmd(proc, logger, - "Elm files compiled successfully", - "Error compiling elm files") - if (elmMinify.value) { - logger.info("Running Closure compiler…") - val clrun = new Minify("--compilation_level", elmMakeCompilationLevel.value, "--js", out.toString, "--js_output_file", minified.toString) - clrun.compile() - IO.move(minified, out) - } - } else { - logger.info("Elm files are up to date") - } - Seq(out) - } - }, - elmTest := { - val wd = elmWd.value - val proc = Process(elmTestExecuteable.value, Some(wd)) - runCmd(proc, streams.value.log, - "Elm tests successful", - "Elm tests failed") - val out = wd/"elm-stuff"/"generated-code"/"elm-community"/"elm-test"/"elmTestOutput.js" - if (out.exists) Seq(out) else Seq.empty[File] - }, - elmReactor := { - val pkg = elmProject.value - val wd = elmWd.value - val proc = Process(Seq(elmReactorExecuteable.value, "-p", elmReactorPort.value.toString), Some(wd)) - runCmd(proc, streams.value.log, - "Started elm-reactor", - "Unable to start elm-reactor") - } - ) - - override def projectSettings = - inConfig(Compile)(elmSettings) ++ Seq( - watchSources ++= ((elmSources in Compile).value ** ("*.elm")).get ++ ((elmSources in Test).value ** ("*.elm")).get - ) - - - def packageJson(deps: SettingKey[Seq[(String, String)]], test: Boolean) = Def.task { - val sources = - if (!test) Seq((elmSources in Compile).value.getName) - else Seq((elmSources in Test).value.getName, "../"+ (elmSources in Compile).value.getName) - - s"""{ - | "version" : "${version.value.replaceAll("[^0-9\\.]", "")}", - | "summary" : "${description.value}", - | "repository" : "${elmGithubRepo.value}", - | "license" : "", - | "source-directories" : [ - | ${sources.mkString("\"", "\", \"", "\"")} - | ], - | "exposed-modules" : [], - | "dependencies" : { - | ${deps.value.map({case (k,v) => "\""+k+"\" : \""+v+"\"" }).mkString(",\n ")} - | }, - | "elm-version" : "${elmVersion.value}" - |}""".stripMargin - } - - - def runCmd(proc: ProcessBuilder, log: Logger, success: String, error: String): Unit = { - val logger = new ProcLogger(log) - Try({ - val rc = proc ! logger - if (rc != 0) sys.error("Non-zero return value") - }) match { - case Success(_) => - log.info(success) - case Failure(ex) => - throw new Exception(s"$error: ${ex.getMessage}", ex) - } - } - - final class ProcLogger(log: Logger) extends ProcessLogger { - def buffer[T](f: => T): T = f - def err(s: => String): Unit = { - log.error(s) - } - def out(s: => String): Unit = { - log.info(s) - } - } - - final class Minify(args: String*) extends CommandLineRunner(args.toArray) { - def compile() = doRun() - } -} diff --git a/project/WebjarPlugin.scala b/project/WebjarPlugin.scala deleted file mode 100644 index c9b4132d..00000000 --- a/project/WebjarPlugin.scala +++ /dev/null @@ -1,165 +0,0 @@ -package sharry.build - -import sbt._ -import sbt.Keys._ -import scala.collection.JavaConverters._ -import scala.util.Try -import org.apache.tika.Tika -import java.io.FileInputStream -import java.util.zip.ZipInputStream -import java.net.{URI, URLEncoder} -import java.util.{HashMap => JMap} -import java.time.Instant -import _root_.io.circe._, _root_.io.circe.generic.auto._, _root_.io.circe.syntax._ - -object WebjarPlugin extends AutoPlugin { - - object autoImport { - val webjarSource = taskKey[Seq[File]]("Creates a scala source file listing the webjars") - val webjarContents = taskKey[Seq[File]]("Creates a json file containing webjar toc") - val webjarFile = settingKey[String]("The source file name") - val webjarPackage = settingKey[String]("The package name") - val webjarPrefix = settingKey[String]("The path name into the jar file") - val webjarWebPackages = settingKey[Seq[Task[WebPackage]]]("More resources to add") - val webjarWebPackageResources = taskKey[Seq[File]]("Copy web package files to resource location") - - case class WebPackage(groupId: String, artifactId: String, version: String, files: Seq[(File, String)]) { - lazy val hash = Hash.toHex(Hash(files.map(f => Hash(f._1)).mkString + s"$groupId:$artifactId:$version")) - lazy val moduleID: ModuleID = groupId % artifactId % version - private[WebjarPlugin] lazy val toWebjar = Webjar(moduleID, hash, file("")) - private[WebjarPlugin] lazy val entries: Map[String, FileInfo] = files. - map({ case (f, name) => - name -> FileInfo(Webjar.detect(f.getName), f.length) - }). - toMap - } - } - - import autoImport._ - - val webjarSettings = Seq( - webjarFile in webjarSource := "Webjars.scala", - webjarPackage in webjarSource := "webjars", - webjarWebPackages := Seq.empty, - webjarSource := { - val logger = streams.value.log - val entry = packageToFile((webjarPackage in webjarSource).value) - val target = (sourceManaged in Compile).value/entry/(webjarFile in webjarSource).value - val webjars: Seq[ModuleID] = (libraryDependencies in Compile).value.filter(_.organization startsWith "org.webjars") - val files: Seq[Webjar] = Attributed.data((dependencyClasspath in Compile).value).collect(findWebjarFile(webjars)) ++ - internalResources.value.map(_.toWebjar) - val code = s"""package ${(webjarPackage in webjarSource).value} - |object ${(webjarFile in webjarSource).value.dropRight(6)} { - | case class ModuleId(groupId: String, artifactId: String, version: String, hash: String) { - | val resourcePrefix = s"/META-INF/resources/webjars/$${artifactId}/$${version}" - | } - | case class FileInfo(contentType: String, length: Long) - | type Hash = String - | type Path = String - | type Toc = Map[Hash, Map[Path, FileInfo]] - | val lastModified = java.time.Instant.parse("${Instant.now.toString}") - | val modules = ${files.map({ wj => "ModuleId(\""+wj.module.organization+"\", \""+wj.module.name+"\", \""+ wj.module.revision +"\", \""+wj.hash+"\")"})} - |}""".stripMargin - if (!target.exists || Hash.toHex(Hash(target)) != Hash.toHex(Hash(code))) { - logger.info(s"Generating ${(webjarFile in webjarSource).value}") - IO.createDirectories(Seq(target.getParentFile)) - IO.write(target, code) - } - Seq(target) - }, - webjarContents := { - streams.value.log.info("Generating webjar toc file") - val entry = packageToFile((webjarPackage in webjarSource).value) - val target = (resourceManaged in Compile).value/entry/"toc.json" - val webjars: Seq[ModuleID] = (libraryDependencies in Compile).value.filter(_.organization startsWith "org.webjars") - val files: Seq[Webjar] = Attributed.data((dependencyClasspath in Compile).value).collect(findWebjarFile(webjars)) - val libMap = files.map(wj => wj.hash -> wj.listEntries).toMap - val intMap = internalResources.value.map(r => r.hash -> r.entries) - IO.createDirectories(Seq(target.getParentFile)) - IO.write(target, (libMap ++ intMap).asJson.spaces2) - Seq(target) - }, - webjarWebPackageResources := { - val base = resourceManaged.value/"META-INF"/"resources"/"webjars" - val pkgs: Seq[WebPackage] = internalResources.value - pkgs.flatMap { wp => - wp.files.map { case (f, name) => - val target = base/wp.artifactId/wp.version/name - IO.copy(Seq(f -> target)) - target - } - } - } - ) - - override def projectSettings = - inConfig(Compile)(webjarSettings) - - - private def packageToFile(pkg: String) = - pkg.replace(".", java.io.File.separator) - - lazy val internalResources = Def.taskDyn { - evalWebPackage(webjarWebPackages.value) - } - - def evalWebPackage(ts: Seq[Task[WebPackage]]): Def.Initialize[Task[List[WebPackage]]] = Def.taskDyn { - ts.headOption match { - case None => Def.task[List[WebPackage]](Nil) - case Some(r) => Def.taskDyn { - val head = r.value - Def.task[List[WebPackage]](head :: evalWebPackage(ts.drop(1)).value) - } - } - } - - case class FileInfo(contentType: String, length: Long) - - case class Webjar(module: ModuleID, hash: String, file: File) { - val resourcePrefix = s"/META-INF/resources/webjars/${module.name}/${module.revision}" - - def listEntries: Map[String, FileInfo] = { - if (!file.exists) sys.error(file.toString) - def loop(in: ZipInputStream, entries: List[(String, FileInfo)]): List[(String, FileInfo)] = - Option(in.getNextEntry) match { - case Some(e) if e.getName.startsWith(resourcePrefix.substring(1)) && !e.getName.endsWith("/") => - loop(in, (e.getName.substring(resourcePrefix.length), FileInfo(Webjar.detect(e.getName), e.getSize)) :: entries) - case Some(_) => - loop(in, entries) - case _ => - entries - } - - closing(new ZipInputStream(new FileInputStream(file))) { zin => - loop(zin, Nil).toMap - } - } - } - - object Webjar { - private val tika = new Tika() - def detect(f: File): String = tika.detect(f) - def detect(name: String): String = tika.detect(name) - } - - def findModuleID(webjars: Seq[ModuleID], file: File): Option[ModuleID] = { - val s = file.toPath.normalize.toAbsolutePath.asScala.mkString(".") - webjars.find(m => s.contains(m.organization+ "." + m.name)) - } - - def isWebjarFile(webjars: Seq[ModuleID], file: File): Boolean = - findModuleID(webjars, file).isDefined - - def findWebjarFile(webjars: Seq[ModuleID]): PartialFunction[File, Webjar] = { - case f if isWebjarFile(webjars, f) => - Webjar(findModuleID(webjars, f).get, Hash.toHex(Hash(f)), f) - } - - private def closing[A <: AutoCloseable, B](in: A)(body: A => B): B = { - try { - body(in) - } finally { - in.close() - } - } -} diff --git a/project/build.nix b/project/build.nix new file mode 100644 index 00000000..d3a9dd8f --- /dev/null +++ b/project/build.nix @@ -0,0 +1,14 @@ +with import { }; +let + initScript = writeScript "sharry-build-init" '' + export LD_LIBRARY_PATH= + sbt "$@" + ''; +in +buildFHSUserEnv { + name = "sharry-sbt"; + targetPkgs = pkgs: with pkgs; [ + netcat jdk8 wget which zsh dpkg sbt git ncurses mc jekyll fakeroot elmPackages.elm + ]; + runScript = initScript; +} diff --git a/project/build.properties b/project/build.properties index cc041cd4..5a9ed925 100644 --- a/project/build.properties +++ b/project/build.properties @@ -1 +1 @@ -sbt.version=1.2.1 \ No newline at end of file +sbt.version=1.3.4 diff --git a/project/build.sbt b/project/build.sbt deleted file mode 100644 index 164707bf..00000000 --- a/project/build.sbt +++ /dev/null @@ -1,9 +0,0 @@ -libraryDependencies ++= Seq( - // elm plugin: minify elm js file - "com.google.javascript" % "closure-compiler" % "v20190415", - - // webjar plugin - "org.apache.tika" % "tika-core" % "1.20", - "io.circe" %% "circe-core" % "0.9.3", - "io.circe" %% "circe-generic" % "0.9.3" -) diff --git a/project/libs.scala b/project/libs.scala deleted file mode 100644 index deecdcef..00000000 --- a/project/libs.scala +++ /dev/null @@ -1,123 +0,0 @@ -import sbt._ - -object libs { - - val `scala-version` = "2.12.8" - - def webjar(name: String, version: String): ModuleID = - "org.webjars" % name % version - - // https://github.com/melrief/pureconfig - // MPL 2.0 - val pureconfig = "com.github.pureconfig" %% "pureconfig" % "0.9.2" - - // https://github.com/typelevel/cats - // MIT http://opensource.org/licenses/mit-license.php - val `cats-core` = "org.typelevel" %% "cats-core" % "1.1.0" - - // https://github.com/functional-streams-for-scala/fs2 - // MIT - val `fs2-core` = "co.fs2" %% "fs2-core" % "0.10.7" - val `fs2-io` = "co.fs2" %% "fs2-io" % "0.10.7" - - // https://github.com/Spinoco/fs2-http - // MIT - val `fs2-http` = "com.spinoco" %% "fs2-http" % "0.3.0" - - // https://github.com/scalatest/scalatest - // ASL 2.0 - val scalatest = "org.scalatest" %% "scalatest" % "3.0.5" - - // https://github.com/rickynils/scalacheck - // unmodified 3-clause BSD - // val scalacheck = "org.scalacheck" %% "scalacheck" % "1.13.5" - - // https://github.com/scodec/scodec-bits - // 3-clause BSD - val `scodec-bits` = "org.scodec" %% "scodec-bits" % "1.1.10" - - // https://github.com/tpolecat/doobie - // MIT - val `doobie-core` = "org.tpolecat" %% "doobie-core" % "0.5.4" - val `doobie-hikari` = "org.tpolecat" %% "doobie-hikari" % "0.5.4" - - // https://jdbc.postgresql.org/ - // BSD - val postgres = "org.postgresql" % "postgresql" % "42.2.5" - - // https://github.com/h2database/h2database - // MPL 2.0 or EPL 1.0 - val h2 = "com.h2database" % "h2" % "1.4.199" - - // https://github.com/circe/circe - // ASL 2.0 - val `circe-core` = "io.circe" %% "circe-core" % "0.9.3" - val `circe-generic` = "io.circe" %% "circe-generic" % "0.9.3" - val `circe-parser` = "io.circe" %% "circe-parser" % "0.9.3" - - // http://tika.apache.org - // ASL 2.0 - val tika = "org.apache.tika" % "tika-core" % "1.20" - - // https://github.com/Log4s/log4s - // ASL 2.0 - val log4s = "org.log4s" %% "log4s" % "1.8.2" - - // http://logback.qos.ch/ - // EPL1.0 or LGPL 2.1 - val `logback-classic` = "ch.qos.logback" % "logback-classic" % "1.2.3" - - // https://github.com/t3hnar/scala-bcrypt - // ASL 2.0 - // using: - // - jbcrypt: ISC/BSD - val `scala-bcrypt` = "com.github.t3hnar" %% "scala-bcrypt" % "3.1" - - // https://github.com/Semantic-Org/Semantic-UI - // MIT - val `semantic-ui` = webjar("Semantic-UI", "2.4.1") - - // https://github.com/23/resumable.js - // MIT - val resumablejs = webjar("resumable.js", "1.0.2") - - // https://github.com/jquery/jquery - // MIT - val jquery = webjar("jquery", "3.3.1") - - // https://highlightjs.org/ - // BSD - val highlightjs = "org.webjars.bower" % "highlightjs" % "9.12.0" - - // https://java.net/projects/javamail/pages/Home - // CDDL 1.0, GPL 2.0 - val `javax-mail-api` = "javax.mail" % "javax.mail-api" % "1.6.2" - val `javax-mail` = "com.sun.mail" % "javax.mail" % "1.6.2" - - // http://dnsjava.org/ - // BSD - val dnsjava = "dnsjava" % "dnsjava" % "2.1.9" intransitive() - - // https://github.com/eikek/yamusca - // MIT - val yamusca = "com.github.eikek" %% "yamusca-core" % "0.5.1" - - // https://github.com/eikek/bitpeace - // MIT - val `bitpeace-core` = "com.github.eikek" %% "bitpeace-core" % "0.2.1" - - // https://github.com/scopt/scopt - // MIT - val scopt = "com.github.scopt" %% "scopt" % "3.7.1" - - // https://github.com/vsch/flexmark-java - // BSD 2-Clause - val `flexmark-core` = "com.vladsch.flexmark" % "flexmark" % "0.32.20" - val `flexmark-gfm-tables` = "com.vladsch.flexmark" % "flexmark-ext-gfm-tables" % "0.32.20" - val `flexmark-gfm-strikethrough` = "com.vladsch.flexmark" % "flexmark-ext-gfm-strikethrough" % "0.32.20" - val `flexmark-formatter` = "com.vladsch.flexmark" % "flexmark-formatter" % "0.32.20" - - // https://github.com/jhy/jsoup - // MIT - val jsoup = "org.jsoup" % "jsoup" % "1.11.3" -} diff --git a/project/plugins.sbt b/project/plugins.sbt index e4585e76..0635754d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,5 +1,11 @@ -addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-M1") -addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.9") +addSbtPlugin("com.47deg" % "sbt-microsites" % "1.0.2") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0") +addSbtPlugin("com.github.eikek" % "sbt-openapi-schema" % "0.5.0") +addSbtPlugin("com.github.gseitz" % "sbt-release" % "1.0.12") +addSbtPlugin("com.jsuereth" % "sbt-pgp" % "2.0.1-M3") addSbtPlugin("com.typesafe.sbt" % "sbt-git" % "1.0.0") +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.4.1") addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1") +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.0.3") +addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.2.0") +addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.8.1") diff --git a/project/project/build.properties b/project/project/build.properties deleted file mode 100644 index 66fe5117..00000000 --- a/project/project/build.properties +++ /dev/null @@ -1 +0,0 @@ -sbt.version=1.1.0 \ No newline at end of file diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt deleted file mode 100644 index e7863983..00000000 --- a/project/project/plugins.sbt +++ /dev/null @@ -1 +0,0 @@ -addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-M1") diff --git a/version.sbt b/version.sbt index 54faed50..6dc05889 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ - version in ThisBuild := "0.7.0-SNAPSHOT" +version in ThisBuild := "1.0.0-SNAPSHOT"