-
Notifications
You must be signed in to change notification settings - Fork 32
enh(Sharing): backend infrastructre for read-only link shares #2211
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
c331e92 to
ec7bd73
Compare
| #[OpenAPI(scope: OpenAPI::SCOPE_IGNORE)] | ||
| #[FrontpageRoute(verb: 'GET', url: '/s/{token}')] | ||
| public function linkShare(string $token): TemplateResponse { | ||
| Util::addScript(Application::APP_ID, 'tables-main'); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@enjeck may keep this if new functionality goes into the main script, or otherwise we can change this if course and load a different one.
The share token is being provided via initialState a few lines below.
d0a78bc to
63b0a70
Compare
63b0a70 to
9f86cfc
Compare
| $shareToken = new ShareToken($token); | ||
| $this->initialState->provideInitialState('shareToken', (string)$shareToken); | ||
|
|
||
| return new TemplateResponse(Application::APP_ID, 'main', [], TemplateResponse::RENDER_AS_GUEST); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this be RENDER_AS_GUEST? Or RENDER_AS_PUBLIC?
| $this->loadStyles(); | ||
|
|
||
| $shareToken = new ShareToken($token); | ||
| $this->initialState->provideInitialState('shareToken', (string)$shareToken); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
To properly load text editor so that rich text cells display properly, we need to add:
if (class_exists(LoadEditor::class)) {
$this->eventDispatcher->dispatchTyped(new LoadEditor());
}
I already did at https://github.com/nextcloud/tables/pull/2236/changes#diff-70e5309fcd3311d771b3db9c93490ea270fd5894769093765ec37edb68e5dd9b
|
|
||
| /** | ||
| * @psalm-import-type TablesPublicColumn from ResponseDefinitions | ||
| */ |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we don't use #[AssertShareToken] here too?
| #[PublicPage] | ||
| #[AssertShareToken] | ||
| #[ApiRoute(verb: 'GET', url: '/api/2/public/{token}/rows', requirements: ['token' => '[a-zA-Z0-9]{16}'])] | ||
| #[OpenAPI] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Since these are public, I imagine they are more prone to scraping and DoS? Do we want to throttle them?
| public function formatRowsForPublicShare(array $rows): array { | ||
| return array_map(static function (Row2 $row): array { | ||
| $rowData = $row->jsonSerialize(); | ||
| unset($rowData['tableId']); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do we unset the tableId but not the column/row ids? What makes tableId more riskier
enjeck
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
we don't seem to have a way to get the title and description of the table/view given the token?
- modifies oc_tables_share structure with two columns, token and password - adds ShareOCSController with a route to create link shares - adds a PageController front route to display the link share - adds a ApiPublicColumnsController to retrieve columns for public links. It was not added to the existing ApiColumnsController, as it requires the userId of the logged-in user and I did not want to weaken this detail. - adds an abstract controller for columns with shared functionality and make ApiColumnsController extend it. - adds a PublicRowOCSController for retrieving rows through link shares - adds a ShareToken value object - adds a ShareControlMiddleware for share token and existance validation. It comes with the AssertShareToken attribute. - extends Share entity with ShareToken and Password properties - extends ShareMapper to find a share by the share token - extends ShareService with a method to easily create link shares - extends ResponseDefinitions with TablesPublicRow and TablesPublicColumn specs. Essentially tableIDs are not exposed and also user ids in lastEditBy and createdBy are not disclosed. - extends RowService and ColumnService with methods to return such ^ formatted result arrays. - extends OpenAPI spec Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
9f86cfc to
6cc82e6
Compare
contributes to #67
links. It was not added to the existing ApiColumnsController, as it
requires the userId of the logged-in user and I did not want to weaken
this detail.
make ApiColumnsController extend it.
validation. It comes with the AssertShareToken attribute.
TablesPublicColumn specs. Essentially tableIDs are not exposed and
also user ids in lastEditBy and createdBy are not disclosed.
formatted result arrays.
Curl examples for added API endpoints
Create a share link without password
fetch column information
fetch all rows