Signed-off-by: skjnldsv <skjnldsv@protonmail.com>pull/46589/head
parent
f45d6135d7
commit
f28d933acc
@ -0,0 +1,59 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
/** |
||||
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors |
||||
* SPDX-License-Identifier: AGPL-3.0-or-later |
||||
*/ |
||||
namespace OCA\Files_Sharing\Listener; |
||||
|
||||
use OCA\Files_Sharing\AppInfo\Application; |
||||
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent; |
||||
use OCP\AppFramework\Http\TemplateResponse; |
||||
use OCP\EventDispatcher\Event; |
||||
use OCP\EventDispatcher\IEventListener; |
||||
use OCP\Share\IManager; |
||||
use OCP\Util; |
||||
|
||||
/** @template-implements IEventListener<BeforeTemplateRenderedEvent> */ |
||||
class LoadPublicFileRequestAuthListener implements IEventListener { |
||||
public function __construct( |
||||
private IManager $shareManager, |
||||
) { |
||||
} |
||||
|
||||
public function handle(Event $event): void { |
||||
if (!$event instanceof BeforeTemplateRenderedEvent) { |
||||
return; |
||||
} |
||||
|
||||
// Make sure we are on a public page rendering |
||||
if ($event->getResponse()->getRenderAs() !== TemplateResponse::RENDER_AS_PUBLIC) { |
||||
return; |
||||
} |
||||
|
||||
$token = $event->getResponse()->getParams()['sharingToken'] ?? null; |
||||
if ($token === null || $token === '') { |
||||
return; |
||||
} |
||||
|
||||
// Check if the share is a file request |
||||
$isFileRequest = false; |
||||
try { |
||||
$share = $this->shareManager->getShareByToken($token); |
||||
$attributes = $share->getAttributes(); |
||||
if ($attributes === null) { |
||||
return; |
||||
} |
||||
|
||||
$isFileRequest = $attributes->getAttribute('fileRequest', 'enabled') === true; |
||||
} catch (\Exception $e) { |
||||
// Ignore, this is not a file request or the share does not exist |
||||
} |
||||
|
||||
if ($isFileRequest) { |
||||
// Add the script to the public page |
||||
Util::addScript(Application::APP_ID, 'public-file-request'); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,23 @@ |
||||
/** |
||||
* SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors |
||||
* SPDX-License-Identifier: AGPL-3.0-or-later |
||||
*/ |
||||
|
||||
import { spawnDialog } from '@nextcloud/dialogs' |
||||
import { defineAsyncComponent } from 'vue' |
||||
import logger from './services/logger' |
||||
|
||||
const nick = localStorage.getItem('nick') |
||||
const publicAuthPromptShown = localStorage.getItem('publicAuthPromptShown') |
||||
|
||||
// If we don't have a nickname or the public auth prompt hasn't been shown yet, show it
|
||||
// We still show the prompt if the user has a nickname to double check
|
||||
if (!nick || !publicAuthPromptShown) { |
||||
spawnDialog( |
||||
defineAsyncComponent(() => import('./views/PublicAuthPrompt.vue')), |
||||
{}, |
||||
() => localStorage.setItem('publicAuthPromptShown', 'true'), |
||||
) |
||||
} else { |
||||
logger.debug(`Public auth prompt already shown. Current nickname is '${nick}'`) |
||||
} |
@ -0,0 +1,136 @@ |
||||
<!-- |
||||
- SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors |
||||
- SPDX-License-Identifier: AGPL-3.0-or-later |
||||
--> |
||||
|
||||
<template> |
||||
<NcDialog class="public-auth-prompt" |
||||
dialog-classes="public-auth-prompt__dialog" |
||||
:can-close="false" |
||||
:name="dialogName"> |
||||
<h3 v-if="owner" class="public-auth-prompt__subtitle"> |
||||
{{ t('files_sharing', '{ownerDisplayName} shared a folder with you.', { ownerDisplayName }) }} |
||||
</h3> |
||||
|
||||
<!-- Header --> |
||||
<NcNoteCard type="info" class="public-auth-prompt__header"> |
||||
<p id="public-auth-prompt-dialog-description" class="public-auth-prompt__description"> |
||||
{{ t('files_sharing', 'To upload files, you need to provide your name first.') }} |
||||
</p> |
||||
</NcNoteCard> |
||||
|
||||
<!-- Form --> |
||||
<form ref="form" |
||||
aria-describedby="public-auth-prompt-dialog-description" |
||||
class="public-auth-prompt__form" |
||||
@submit.prevent.stop=""> |
||||
<NcTextField ref="input" |
||||
class="public-auth-prompt__input" |
||||
:label="t('files_sharing', 'Enter your name')" |
||||
name="name" |
||||
:required="true" |
||||
:minlength="2" |
||||
:value.sync="name" /> |
||||
</form> |
||||
|
||||
<!-- Submit --> |
||||
<template #actions> |
||||
<NcButton ref="submit" |
||||
:disabled="name.trim() === ''" |
||||
@click="onSubmit"> |
||||
{{ t('files_sharing', 'Submit name') }} |
||||
</NcButton> |
||||
</template> |
||||
</NcDialog> |
||||
</template> |
||||
|
||||
<script lang="ts"> |
||||
import { defineComponent } from 'vue' |
||||
import { t } from '@nextcloud/l10n' |
||||
|
||||
import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' |
||||
import NcDialog from '@nextcloud/vue/dist/Components/NcDialog.js' |
||||
import NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js' |
||||
import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js' |
||||
import { loadState } from '@nextcloud/initial-state' |
||||
|
||||
export default defineComponent({ |
||||
name: 'PublicAuthPrompt', |
||||
|
||||
components: { |
||||
NcButton, |
||||
NcDialog, |
||||
NcNoteCard, |
||||
NcTextField, |
||||
}, |
||||
|
||||
setup() { |
||||
return { |
||||
t, |
||||
|
||||
owner: loadState('files_sharing', 'owner', ''), |
||||
ownerDisplayName: loadState('files_sharing', 'ownerDisplayName', ''), |
||||
label: loadState('files_sharing', 'label', ''), |
||||
note: loadState('files_sharing', 'note', ''), |
||||
filename: loadState('files_sharing', 'filename', ''), |
||||
} |
||||
}, |
||||
|
||||
data() { |
||||
return { |
||||
name: '', |
||||
} |
||||
}, |
||||
|
||||
computed: { |
||||
dialogName() { |
||||
return this.t('files_sharing', 'Upload files to {folder}', { folder: this.label || this.filename }) |
||||
}, |
||||
}, |
||||
|
||||
beforeMount() { |
||||
// Pre-load the name from local storage if already set by another app |
||||
// like Talk, Colabora or Text... |
||||
const talkNick = localStorage.getItem('nick') |
||||
if (talkNick) { |
||||
this.name = talkNick |
||||
} |
||||
}, |
||||
|
||||
methods: { |
||||
onSubmit() { |
||||
const form = this.$refs.form as HTMLFormElement |
||||
if (!form.checkValidity()) { |
||||
form.reportValidity() |
||||
return |
||||
} |
||||
|
||||
if (this.name.trim() === '') { |
||||
return |
||||
} |
||||
|
||||
localStorage.setItem('nick', this.name) |
||||
this.$emit('close') |
||||
}, |
||||
}, |
||||
}) |
||||
</script> |
||||
<style lang="scss"> |
||||
.public-auth-prompt { |
||||
&__subtitle { |
||||
// Smaller than dialog title |
||||
font-size: 16px; |
||||
margin-block: 12px; |
||||
} |
||||
|
||||
&__header { |
||||
// Fix extra margin generating an unwanted gap |
||||
margin-block: 12px; |
||||
} |
||||
|
||||
&__form { |
||||
// Double the margin of the header |
||||
margin-block: 24px; |
||||
} |
||||
} |
||||
</style> |
Loading…
Reference in new issue