It seems iOS doesn't like us to change the location. So now we submit it
to the server that geneartes the redirect.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Because the redirect from the SAML/SSO endpoint is a POST the lax/strict
cookies are not properly send.
Note that it is not strictly requried on this endpoint as we do not need
the remember me data. Only the real session info is enough. The endpoint
is also already protected by a state token.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The second execute statement should be inside the if block. Else it gets
executed twice which makes no sense.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
c23a66cda4 broke the system address book.
We now move the ACL rules for this special case up and all is good in
the world again.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#12498
This means that we set that it is a proper app token once it is
validated. This will allow the 2FA middleware to just run the same
check.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* fixes#9305 by not being prone to the race condition in insertIfNotExists
* fixes#6899 by not using a query that can result in a deadlock
* replaces the insertIfNotExists call with an insert which is wrapped into a try-catch block
* followup to #12371
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* fixes#6160 by not being prone to the race condition in insertIfNotExists
* fixes#12228 by not using a query that can result in a deadlock
* replaces the insertIfNotExists call with an insert which is wrapped into a try-catch block
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Fixes#1020
When an external storage is shared with you in full the root is ''
(empty). This adds an extra check for an empty jail basically.
Because if the jail is on the empty string. It matches all paths.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
If doing achunked upload the mimetype of the folder would otherwise be
guessed from the path. Which always returned application/octet-stream.
If an access control rule to block that is in place this means that all
chunked uploads fail hard in directories as the isCreatable on the
directory always fails.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#12131
If we hit an expired token there is no need to continue checking. Since
we know it is a token.
We also should not register this with the bruteforce throttler as it is
actually a valid token. Just expired. Instead the authentication should
fail. And buisness continues as usual.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When using atoken obtained via OAuth the token expires. Resulting in
brute force attempts hitting the requesting IP.
This resets the brute force attempts for that UID on a valid refresh of
the token.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
only write when the displayname differs, but then announce it
refs #5212 and fixes#9112
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
do not run into UniqueConstraintViolationException
… when an unmapped user logs in for the first time when background job
mode is ajax and no memcache was configured.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This will make it possible to act propely on moves of future files if we
need to know the size (like for max size virus scanning).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When obtaining the SourceRootInfo we can call init. If this fails the
cache is set to a failed cache and the storage to a failed storage.
However we did not check for this. Which means that if the storage was
invalid it would fail later on.
Now we will properly error out.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
If you now keep calling $node->getParent() you will at some point get
the RootFolder back. This is a nice termination check and will prevent
endless loops if an exit condition is slightly off.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The custom handler for "URL changed" events were added to reload the
file list whenever the sections for favorites and shares were opened;
this was used to fix the problem of not reloading the file lists when
opening them for a second time. However, besides that the handlers were
not really necessary, and as the root of the bug was fixed in the
previous commit those handlers are now removed.
The file list for tags uses the handler for a different purpose, though,
so that one was kept.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a section is open in the Files app a "show" event is triggered.
File list objects handle that event by reloading themselves, but only
if the file list was shown at least once. However, the file list objects
of plugins are created when the "show" event is triggered for the first
time for their section; as the file list objects register their handler
for the "show" event when they are created they never handle the first
triggered "show" event, as the handler is set while that event is being
already handled. Therefore, from the point of view of the handler, the
second time that a "show" event was triggered it was seen as if the file
list was shown for the first time, and thus it was not reloaded. Now the
"shown" property is explicitly set for those file lists that are created
while handling a "show" event, which causes them to be reloaded as
expected when opening their section again.
Note that it is not possible to just reload the file list whenever it is
shown; the file list is reloaded also when the directory changes, and
this can happen when the web page is initially loaded and the URL is
parsed. In that case, if file lists were reloaded when shown for the
first time then it could be reloaded twice, one with the default
parameters due to the "show" event and another one with the proper
parameters once the URL was parsed, and the files that appeard in the
list would depend on which response from the server was received the
last.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Before it quit right after finding the theme version of the l10n file which results in a not translated part of the UI.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
The old code would emit the hooks twice. Thus having the version written
twice. Which is not very performant as it is first read twice as well.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
We use the same logic for creating accounts without a password and there the 12h is a bit short. Users don't expect that the signup link needs to be clicked within 12h - 7d should be a more expected behavior.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
When "session_lifetime" can not be converted to a number the interval
becomes a NaN due to dividing it by 2. This NaN was "dragged" over all
the other mathematical operations and caused the heartbeat to be post
again and again due to an infinite loop with no pauses in "setInterval".
Now, the interval is set to the default value instead if the
"session_lifetime" can not be converted to a number.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
To allow us to create previews of files stored in appdata we need to
construct the view differently.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
For some reason the docker image does not setup the permissions correctly,
by using a different name the nextcloud installer will create the database instead
with the correct permissions
Signed-off-by: Robin Appelman <robin@icewind.nl>
The check is run only if its last parameter is true; data() tries to
convert the HTML attribute string to an actual JavaScript value, so
"true" is returned as an actual boolean instead of an string; as a
strict comparison against "true" was used the result was false and thus
the checks were not run.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Large files are not uploaded in a single operation, but uploaded in
several chunks; once all the chunks are uploaded then the server needs
to assemble them to get the final file.
Before, once the chunks were uploaded the progress bar was hidden.
However, this was confusing for the users, as the file could still need
some time to appear in the file list due to the assembling. Now once all
the chunks are uploaded the text in the progress bar changes to inform
the user that there are still some pending operations, and only when the
file is finally assembled the progress bar is hidden.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Before each scenario of the acceptance tests is run the Nextcloud server
is reset to a default state. To do this the full directory of the
Nextcloud server is commited to a local Git repository and then reset to
that commit when needed.
Unfortunately, Git does not support including empty directories in a
commit. Due to this, when the default state was restored, it could
happen that the file cache listed an empty directory that did not exist
because it was not properly restored (for example,
"data/appdata_*/css/icons"), and that in turn could lead to an error
when the directory was used.
Currently the only way to force Git to include an empty directory is to
add a dummy file to the directory (so it will no longer be empty,
but that should not be a problem in the affected directories, even if
the dummy file is not included in the file cache); although Git FAQ
suggests using a ".gitignore" file a ".keep" file was used instead, as
it conveys better its purpose.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
With 689df9a843 the behaviour to assign only
non-empty config IDs was introduced. Only, this was only effective for CLI
and OCS API.
Related to #3270.
The web UI creates now also a full configuration on first load. This fixes
#5094.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
OCA.Sharing.SharedFileInfo was never defined and that stopped execution.
Interestingly, FF never showed me an error.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
only update the encrypted version after the write operation is finished and the stream is closed
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
When the ownership of a user share is transfered to the receiver the
share is removed, as the receiver now owns the original file. However,
due to a missing condition, any share with a group, link or remote with
the same id as the user was removed, not only the user shares.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
\\b matches any non-word character, including \@ and \-
In order to not detect urls in the middle of email-addresses,
we need to check for white space characters and beginning of the
message instead.
Signed-off-by: Joas Schilling <coding@schilljs.com>
This can be caused by the code releasing more locks then it acquires,
once the lock value becomes negative it's likely that it will never be able
to change into an exclusive lock again.
Signed-off-by: Robin Appelman <robin@icewind.nl>
Sometimes when we force a session regeneration we want to update the
current token for this session.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Apperently Sabre and Onedrive are not friends when requesting a single
404 property. I need to dig deeper on why this is. Anyways requesting a
valid property makes it work like a charm.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Add "PARENT (2)" and its subdirectories to the paths to be checked, as
before only the own "PARENT" folder was being checked, but not the
shared one.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a file is shared and the receiver of the share already has a file
with the same name that file is left untouched, and "(2)" is appended to
the name of the shared file.
As "textfile0.txt" is included in the user folder skeleton all the users
in the integration test have that file, so when it is shared the
receiver sees the share as "/textfile0 (2).txt", and her own file as
"/textfile0.txt".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Refers to issue #8220
user_ldap configured with custom filters for active directory access
(group-member-association is "member"). Then it can happen that the
members of a group contain members that don't belong to the users
available in Nextcloud (the most trivial reason is that the user filter
contains "(!(UserAccountControl:1.2.840.113556.1.4.803:=2))" to exclude
disabled users from being imported).
This can be fixed by applying the ldapUserFilter when resolving the UID
for a DN fetched from the group's member list.
Signed-off-by: Roland Tapken <roland@bitarbeiter.net>
When the browser reports a drag of items other than files (for example,
text) and then triggers a drop event with no files no error message
should be shown to the user, as in that case there would be no highlight
of the drop zone and no indication that the drop would be valid (except
for the mouse cursor); the error message should be shown only when
the drop event with no files follows a file drag.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The highlighting was removed in Firefox when the cursor was no longer
moving to handle the behaviour of reporting a file drag and then
providing no files in the drop event. That behaviour (which was only
present in Firefox 48 and 49) is already handled with the "dropnofiles"
callback, so that special handling is no longer needed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a file is dragged from the desktop to the file list the file list
is highlighted, and when the file is finally dropped or the drag
operation is cancelled the highlighting is removed. In some cases, due
to a wrong implementation, a browser may end a file drag with a drop
with no files (for example, when a folder or text is dragged), which
would cause the highlight to not be removed. Now those cases are handled
with the "dropnofiles" callback, which restores the UI and also shows a
message to the user.
The error message is just a generic one, as in some cases it is not even
possible to know whether the problem came from a text drag or a folder
drag, and whether the problem appears or not depends on the browser,
version and even operating system.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The jQuery Plugin triggers the "dragover" callback when the browser
triggers the "dragover" event and the types in their DataTransfer
include a "Files" item. It also triggers the "drop" callback when the
browser triggers the "drop" event and the list of files in its
DataTransfer is not empty.
Unfortunately some browsers may trigger "dragover" events with a
DataTransfer that includes a "Files" item and then trigger a "drop"
event with an empty list of files. When that happens the actions
performed in the "dragXXX" callbacks could be left hanging if they were
expected to be finished in the "drop" callback (for example, if the drop
zone was highlighted during the drag to be then restored when the file
was finally dropped). This commit adds the "dropnofiles" callback to be
able to handle those situations.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
"disableDropState" was set as the event handler in 8d4e5747f3, but
the duplicated code was accidentally added back in 786e858d23.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Some bad databases don't respect the default null apprently.
Now even if they cast it to 0 it should work just fine.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
If a PUT request comes in that is not JSON or from encoded. Then we can
only read it (exactly) once. If that is the case we must assume no
shared secret is set.
If we don't then we either are the first to read it, thus causing the
real read of the data to fail.
Or we are later and then it throws an exception (also failing the
request).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When using fake servers with Sinon.JS, the JavaScript test framework,
the XHR objects are also fake. In Sinon 5.0.8 the "setRequestHeader" of
XMLHttpRequest was modified to normalize the header values (as requested
by the spec), but since then only string values are accepted; null or
integer values can no longer be passed to "setRequestHeader", as it
expects the "replace" function to be available in the object. However,
in the tests null and integer values are passed to "setRequestHeader",
which causes them to fail.
Both Firefox and Chromium accept passing non-string values to their
"setRequestHeader" implementation, and it is done, for example, in
davclient.js; it is not clear yet whether Sinon got too restrictive or
the code calling "setRequestHeader" was too loose. Given that
davclient.js is an external dependency, as a temporary measure Sinon
version is forced to be 5.0.7 at most until either Sinon or davclient.js
are updated.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#9469
When a version of a file is restored the previews are no longer valid.
Thus we should remove them so they are regenerated.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Ignore unavailable files when fetching the share's mtime
or reading directory listings. This can happen on servers using a
distributed file system (DFS) with unavailable destinations, for example
when the remote server is offline.
Signed-off-by: Roland Tapken <roland@bitarbeiter.net>
However due to the nature of what we store in the token (encrypted
passwords etc). We can't just delete the tokens because that would make
the oauth refresh useless.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The escaping of special characters was needed when the ids of the
permission checkboxes for shares were based on the "shareWith" field.
Since they are based on the "shareId" field the escaping is no longer
needed, as the "sharedId" is expected to always contain compatible
characters.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The ids of permission checkboxes for shares were generated using the
"shareWith" field of the share. The "shareWith" field can contain spaces
(as spaces are allowed, for example, in user or circle names), so this
could cause the id attribute of the HTML element to contain spaces too,
which is forbidden by the HTML specification.
It is not just a "formal" issue, though; when the list was rendered
after a permission change, if the id contained a space the selector to
get the checkbox element was wrong (as it ended being something like
"#canEdit-view1-name with spaces") and thus the updated state of the
checkbox was not properly set.
Besides that, "shareWith" can contain too single quotes, which would
even cause the jQuery selector to abort the search and leave the UI in
an invalid state.
Instead of adding more cases to the regular expression to escape special
characters and apply it too when the ids are created now the ids of
permission checkboxes for shares are based on the "shareId" field
instead of on "shareWith", as "shareId" is expected to always contain
compatible characters.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Before any upload is submitted the upload is registered in a list of
known uploads; this is needed to retrieve the upload object at several
points of the upload process. When a chunked upload is submitted first a
directory to upload all the chunks is created and, once that is done,
the chunks are sent; in order to send a chunk the upload object needs to
be retrieved from the list of known uploads.
When all the active uploads were finished the list of known uploads was
cleared. However, an upload is not active until it actually starts
sending the data, so while waiting for the upload directory to be
created the upload is already in the list of known uploads yet not
active. Due to all this, if the active uploads finished while another
pending upload was waiting for the upload directory to be created that
pending upload would be removed from the list of known uploads too, and
once the directory was created and thus the chunks were sent a field of
a null upload object would be accessed thus causing a failure.
Instead of removing all the known uploads at once when the active
uploads finish now each upload is explicitly removed when it finishes.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Related to #8929
We should get the version of the app. Not of the appfolder. Else there
is no way to properly compare the versions.
Now note that installing in 1 go will still fail. But at least on the
next page load the new version will be properly detected.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The jQuery File Upload plugin triggers the "stop" event once there are
no more files being uploaded (even if some of them were added when
another upload was already in progress). Therefore, the progress bar
should be hidden in the "fileuploadstop" callback.
In some cases the "stop" event is not triggered and thus the progress
bar is not hidden once no more files are being uploaded. This is caused
by a race condition and it will be fixed in another commit; except in
buggy cases like that one (that need to be fixed anyway) it is safe to
hide the progress bar in the "fileuploadstop" callback.
In any case, note that the callbacks in "fileuploaddone" may be called
after the "stop" event was triggered and handled when using chunked
uploads. In that case once all the chunks are uploaded the assembled
file is moved to its final destination, so its promise could be resolved
after the "stop" event was triggered. Therefore a different approach
would be needed to keep the progress bar visible until the chunked
upload is truly finished, but for the time being the current one is good
enough.
Before this commit the progress bar was being hidden when the first
upload finished, either successfully or with an error, no matter if
there were other files being uploaded too.
The progress bar was being explicitly hidden also when the upload was
cancelled. When an upload is cancelled all the single uploads are
aborted, which triggers a "fail" event for each of them. However, the
"stop" event is always triggered when no more files are being uploaded,
so it is triggered too once all the single uploads were aborted. As all
the single uploads are immediately aborted in a loop when the general
upload is cancelled it makes no difference to hide the progress bar when
the first single upload is aborted or when all the single uploads were
aborted, so the progress bar is no longer explicitly hidden in the
former case.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#9028
For federated shares the share table holds no target information (since
it is on the other server). So when a node is actually invalid and not
found we should not display it anymore in the shared with sections etc
and thus throw the proper exceptions.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#8890
In case you have access to a file via multiple ways, for example:
1. the file is shared with you with permission read only
2. the folder containing the file is shared with your read/write
Requesting the getById function on the userFolder would give back two
entries but both with the same permissions. Depending on the node you
picked this is not right.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Before, the avatar for a circle share was generated using the
"share_with" field as the seed for "imageplaceholder". Due to this, when
the "share_with" field is set to the circle ID the character shown in
the avatar was just a random character instead of the first character of
the display name. Now the "share_with" is still used as the seed for the
colour, but the display name is used as the text of the avatar.
This adds support for "share_with" fields set to the circle ID while
being backwards compatible with "share_with" fields set to the circle
name.
Note that when "share_with" fields is set to the circle name the colour
of the avatar is different in the list of suggested sharees and in the
list of current sharees, but that also happened before these changes
(due to a different seed being used in each place).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a share is shared with a circle the "share_with" field returned by
the API endpoint was always set to the name of the circle. However, the
name is not enough to identify a circle. The Circles app now provides
the ID of the circle in the "shared with" field of a Share, so this
commit modifies the API endpoint to set the "share_with" field to the ID
of the circle when provided by the Circles app.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "FileListContext" provides steps to interact with and check the
behaviour of a file list. However, the "FileListContext" does not know
the right file list ancestor that has to be used by the file list steps,
so until now the file list steps were explicitly wired to the Files app
and they could be used only in that case.
Instead of duplicating the steps with a slightly different name (for
example, "I create a new folder named :folderName in the public shared
folder" instead of "I create a new folder named :folderName") the steps
were generalized; now contexts that "know" that certain file list
ancestor has to be used by the FileListContext steps performed by
certain actor from that point on (until changed again) set it
explicitly. For example, when the current page is the Files app then the
ancestor of the file list is the main view of the current section of the
Files app, but when the current page is a shared link then the ancestor
is set to null (because there will be just one file list, and thus its
ancestor is not relevant to differentiate between instances)
A helper trait, "FileListAncestorSetter", was introduced to reduce the
boilerplate needed to set the file list ancestor from other contexts.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The file list is used in other places besides the Files app (for
example, the File sharing app); in those cases the locators for the file
list elements are the same, but not for the ancestor of the file list.
To make possible to reuse the file list locators in those cases too now
they receive the ancestor to use.
Note that the locators for the file actions menu were not using an
ancestor locator because it is expected that there is only one file
actions menu at a time in the whole page; that may change in the future,
but for the time being it is a valid assumption and thus the ancestor
was not added to those locators in this commit.
Although the locators were generalized the steps themselves still use
the "FilesAppContext::currentSectionMainView" locator as ancestor; the
steps will be generalized in a following commit.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Besides the extraction some minor adjustments (sorting locators for file
action menu entries to reflect the order of the menu entries in the UI,
moving parametrized locators like "createMenuItemFor" above the locators
that use them and placing "descendantOf" calls always in a new line)
were made too.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Avoids errors when the size exceeds MAX_INT because of the cast to int. Better cast it to float to avoid this.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Fixes#8705
If the file does not exist (for whatever reason). It is never cached. No
matter what the depscache etc tell you.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
NoSuchElement exceptions are sometimes thrown instead of
StaleElementReference exceptions. This can happen when the Selenium2
driver for Mink performs an action on an element through the WebDriver
session instead of directly through the WebDriver element. In that case,
if the element with the given ID does not exist, a NoSuchElement
exception would be thrown instead of a StaleElementReference exception,
so those cases are handled like StaleElementReference exceptions.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
MoveTargetOutOfBounds exceptions are sometimes thrown instead of
ElementNotVisible exceptions. This can happen when the Selenium2 driver
for Mink moves the cursor on an element using the "moveto" method of the
Webdriver session, for example, before clicking on an element. In that
case, if the element is not visible, "moveto" would throw a
MoveTargetOutOfBounds exception instead of an ElementNotVisible
exception, so those cases are handled like ElementNotVisible exceptions.
Note that MoveTargetOutOfBounds exceptions could be thrown too if the
element was visible but "out of reach"; there is no problem in handling
those cases as if the element was not visible, as the exception will be
thrown again anyway once it is verified that the element is indeed
visible.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Nextcloud 13RC4, error in logfile, triggered by "occ config:list":
Invalid argument supplied for foreach() at lib/private/AppConfig.php#297
PHP Undefined index: workflowengine at lib/private/AppConfig.php#297
Fix: Check if index exists in array before using it.
The check in URLGenerator.php#169 and Server.php#945 are different and thus the DI container could return a \OC_Defaults object which does not provide the wanted method caising a PHP error.
Fixes#8420
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
MySQL databases with the ANSI_QUOTES mode enabled treat " as an identifier
quote (see https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_ansi_quotes).
So for such databases the 'occ upgrade' fails with an error message like this:
... unknown column 'oc_*' in where clause.
This fix replaces the doulbe quotes with single quotes that should be always
used in MySQL queries to quote literal strings.
Signed-off-by: Robin Müller <robin.mueller@1und1.de>
if file_get_contents fails remove the file. And traverse up the tree
checking if the other folders are there.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
test creating comments with numeric user ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix creating comments when file is accessible to users with numeric ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
tests for systemtags related to numeric user ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
fix systemtags event with numeric user ids
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Menu and home are not always visible; home is always visible, but menu
is shown only when needed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
"getTotalWidth" is not more accurate; it is simply not clamped.
Moreover, "width/outerWidth" could be used in tests too, and also even
if "getTotalWidth" could be used in tests while others not that would
not be something to be stated in the API documentation, but in a
comment.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
After the changes in the previous commit "_showCrumb" no longer shows
the menu, only the same crumb that was hidden by the last call to
"_hideCrumb". Therefore, if the crumb was hidden because it did not fit
there is no need to try to show it again, as it will still not fit.
Moreover, the calculated width for a hidden element is not always
accurate; in some cases the calculated width is lower than the actual
width (it happens, for example, when using a background image like the
"Share" icon), which causea the crumb to be shown even if there is not
enough room, which in the end causes the siblings to overflow the
contents.
No unit tests for this one, though; you will have to trust me on this,
sorry ;-)
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The crumb for the menu was shown like any other crumb when calling
"_showCrumb", but it was also shown when other crumbs were hidden
without taking into account the available width. This caused several
related problems, like the breadcrumbs taking too much space when the
menu was sometimes shown after the rest of the crumbs were adjusted to
the available width, or the menu being shown instead of the last crumb
even if there was room for it when the available width was increased.
Now the menu is always hidden before starting the resizing of the crumbs
to ensure that whether it was previously shown or not does not affect
the result. In a similar way, the menu will no longer be shown by
"_showCrumb", as it is not a regular crumb that has to be shown simply
if there is enough room. The menu is now shown as soon as any other
crumb is hidden; this ensures that the menu width will be taken into
account in further width checks. As when _updateMenu" is called it no
longer needs to take care of showing the menu this fixes the issue
revealed when fixing the test setup in the previous commit.
Finally, this implicitly fixes the failure in the breadcrumbs tests when
run on Firefox, as it was caused by the menu interfering in the
calculations of the other crumbs when increasing the width.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "Shows only items not in the breadcrumb" test was failing when run
on Firefox, but not on PhantomJS. This was caused by the differences in
the starting width between both browsers and an incorrect setup of the
test (the width set for the crumbs was overriden when the breadcrumbs
were rendered again, and the breadcrumb was resized to 300 from an
indeterminate initial width).
Now the crumbs are rendered and then its width, padding and margin are
set to a known value. Then it is resized to 1000px, which ensures that
there will be enough room for all the crumbs and thus the menu will be
hidden, and finally it is resized to 300, which causes the middle crumb
to be hidden and the menu to be shown.
Note, however, that the test now always fails, no matter if it is run on
PhantomJS or on Firefox; if the menu crumb is hidden when "_updateMenu"
is called it will show it, but it will also wrongly try to add the menu
itself to the menu. As the "crumb-id" of the menu crumb is "-1" this
causes the last regular crumb to be added to the menu. This will be
fixed with other related issues in the next commit.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When calculating the total width of the crumbs only its padding was
taken into account; now the margin is too. In a similar way, before
showing a crumb only its width was taken into account; now its padding
and margin are taken into account too.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This ensures that the resize tests do not depend on the values set in
the CSS files.
Note that this change causes a test to fail with Firefox, but not with
PhantomJS. This is due to a difference in the starting width used by
Firefox and by PhantomJS, and it will be fixed in a following commit.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When the parent element of the breadcrumbs was resized to a larger width
and the siblings of the breadcrumbs expanded to fill all the available
width some crumbs could be hidden even if there was enough room for
them. The reason was that the width of the siblings being used to
calculate the available width for the breadcrumbs was the expanded width
of the siblings. Now as many crumbs as possible (that is, fitting in the
parent, no matter the siblings) are first shown so the expanding
siblings are compressed before calculating the available width.
Due to the lack of support for flexboxes in PhantomJS the related unit
test is skipped; it has to be run in other browser, like Firefox.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Other apps could add elements to the controls outside the creatable
actions div (for example, the button to switch to the gallery), so the
widths of all the visible siblings of the breadcrumbs have to be taken
into account in the size calculations.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
There are some differences in width handling between the browsers used
to run the tests, most likely due to their support (or lack of) of
certain CSS features: PhantomJS requires "width" to be set (probably
because it does not handle flex displays and treats it like a block, so
"min-width" does not matter in this case), while Firefox requires
"min-width" to be set (otherwise the children of "#controls" could be
compressed due to its use of flex display and the elements would end
with a different width than the one needed for the tests). Due to all
that the width of the breadcrumb siblings must be specified in the tests
using both "width" and "min-width".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
There is no need to call "setDirectory" again in resize tests; it is
enough to simply resize them (and isolates them better to just test the
resizing behaviour).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "usedWidth" attribute was not used elsewhere outside the "_resize"
method, so it was replaced with a local variable. Moreover, it was also
renamed to a more suitable name ("availableWidth").
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Setting the width of the parent element of the breadcrumbs and then
explicitly calling "_resize" is enough to test the resizing behaviour.
This makes possible to remove the "setMaxWidth" method and its related
code, which was used only for testing purposes.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The div that contains the elements related to the creation of new files,
and thus the upload button, is always present in the DOM; it is hidden
or shown based on the folder permissions by adding or removing the
"hidden" CSS class. However, as the other CSS classes for the div are
"actions" and "creatable" and a "display: flex" rule was defined for
".actions.creatable" below the "display: none" rule for
".actions.hidden" the last one took precedence and the div ended being
always visible, even if the "hidden" CSS class was set. Now the rules
for the ".actions.hidden" selector are defined below the rules for the
".actions.creatable" selector and thus the "display: none" rule is
applied as expected.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Currently, the theming app assumes it's in the serverroot. However, with
Nextcloud's flexibility regarding configurable app paths, this is not a
safe assumption to make. If it happens to be an incorrect assumption,
the theming app fails to work.
Instead of relying on the serverroot, just use the path from the
AppManager and utilize relative paths for assets from there.
Fix#8462
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
* adds a 107 error code together with the hint of the exception
* logs the exception as warning
* fixes#7946
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
This fixes#8451 where the first character is a non-ASCII character. The `$string[0]` notation only extracted one byte and thus resulting in an invalid code. The `mb_strtoupper` method also allows to convert characters independently from the current locale on the server.
See also http://php.net/manual/en/function.mb-strtoupper.php
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
1. Local users should not be returned when searching for empty string
2. The limit of the response should be respected
Signed-off-by: Joas Schilling <coding@schilljs.com>
Instead of checking that the list contains one comment it is now checked
that a comment with certain message is visible. This makes the step (and
the locator) more reusable in future tests and also simplifies the code.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Depending on the previous steps the new comment field may be already
shown or not when the step to create a new comment is executed.
Therefore, the timeout was increased from 2 to the "standard" 10 seconds
used in other tests.
If the new comment field was found there is no need to use a timeout
when looking for the new comment button; it is either there or not, it
will not appear after some time.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The locators are moved above the step definitions for consistency with
other context files; besides that I made some minor adjustments for
consistency too in the locator descriptions and identation, and moved
the locators for ".newCommentRow" descendants together.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#8047
If we can't find the file by id there we should just return null instead
of trying to get the jailed path of null.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Exposing the encrypted property is required for E2E. However, there is
no need to expose this on files as then it is server side encryption
(which the clients don't care about).
Better to not confuse the output.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* We first try the email as username but this fails
* Then we get the uid from the email and try again
We should not log the first attempt since it polutes the log with failed
login attempts while the login actually is valid.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The clipboard icon in shared links appears either directly on the link
input field or, if any social sharing app is enabled, in a menu. The
clipboard icon uses the same CSS rules as other icons (like the
information icon) to be posioned on the end of the input field, and
those rules have to be "cancelled" when the icon is shown in the menu.
Fixes#7990
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
* delete it
* throw a NotFound Exception
- This should a proper 404 to the user
- Next time it is then regenerated
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
comments should compile mentions also if done by author
it is used by clients for formatting reasons, there is no reason not format
the author if her handle is included in the comment body.
It is unrelated to sending out notifications.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
do not offer the handle of the current user for auto completion
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
add types to php doc
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
without recursion we have issues with internal states. paged search status
are set to false, cookies are not being set. In the end we have endless
requests which pile up enormously with a high initial offset.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
The message is not helpful anyway for an admin, and oftentimes is just
valid (e.g. when searching with an offset beyond users in LDAP).
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
To show the password in plain text "showPassword" adds a text input
after the password input and swaps their visibility depending on whether
the password has to be shown in plain text or not. In a similar way,
"strengthify" by default adds the strength bar after the input element
it was called on. Due to this, if "showPassword" is called before
"strengthify" on the same password input then the strength bar ends
between the password input and the text input, and when the text input
is shown it appears below the strength bar.
To fix this now the strength bar is added after the text input in those
places in which "strengthify" was called after "showPassword" on the
same element.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
"FileList._updateDetailsView" expects either a file name (as a string)
or a file model (as an "OCA.File.FileInfoModel"), but when called
through "updateInList" an "OC.Files.FileInfo" object was given instead.
As the given attribute was not a model "_updateDetailsView" treated it
as a file name and tried to get the model for that file, which failed
and caused the details view to be emptied.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
All the tests in the "Renaming files" section added the test files,
although those calling "doRename()" added them by setting a path for the
file too. However, the path is ignored in the other tests, so adding the
files can be unified and moved to "beforeEach()".
This would be needed, for example, to show the details view for a file
before calling "doRename()".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This fixes a regression caused by 9b668d0, where the css filters to
preview color inversion of the app menu was applied by default. This
commit makes the css filters sensitive on what the current state of the
app menu is.
Signed-off-by: Julius Härtl <jus@bitgrid.net>
It can happen for all kinds of reasons that a setting is not available.
(A user removes a folder, a setting got deleted). So don't polute the
log on default settings.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Use the lazy functions is possible. This avoids getting the node if not
required.
Possible fix for #7751
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes#7106
- Echoing the current server time via a JS variable and storing the current time on page load in JS.
- Calculating the diff and taking it into account when deciding whether to show the password confirmation.
Signed-off-by: Abijeet <abijeetpatro@gmail.com>
With HiDPI screens. And even normal HD screens you want more detail from
your pictures. Or the ability to somewhat zoom on you previews. For this
we need somewhat larger previews.
Moving the default to 4096x4096 is a step up. Users that want the old
behavior can still set the values in config.php
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The avatar plugin should not change the display element, since the
avatar is always shown by default and the display value is up to the
developers
Signed-off-by: Julius Härtl <jus@bitgrid.net>
The "New" menu is a descendant of the controls bar, and the controls bar
and the multiselect header belong to the same stacking context. As they
had the same z-index but the multiselect header appears after the
controls bar in the DOM the controls bar and its descendants, including
the "New" menu, were rendered behind the multiselect header. Now the
controls bar has a z-index value higher than the one used for the
multiselect header to ensure that the "New" menu is rendered in front of
the multiselect header.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Throw proper exception if we can't get the mimetype for a preview. Catch
it later on so we can just return a not found for the preview.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
For legacy reasons we stored all the previews with a png extention.
However we did not put png data in them all the time.
This caused the preview endpoints to always report that a preview is a
png file. Which was a lie.
Since we abstract away from the storage etc in the previewmanager. There
is no need anymore to store them as .png files and instead we can use
the actual file extention.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When the favourite icon in the details view is clicked the "Favorite"
action is triggered. However, if the action name given to
"triggerAction" is not found then the "Download" action is triggered
instead. As the "Favorite" action is not available in some file lists
(like "Recents") the "Download" action was executed instead in those
cases, which was a strange behaviour. Now the favourite icon is
hidden if its action is not available.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When finishing the setup of Nextcloud through the WebUI (setting admin
user and database) Firefox offers to save the username and password.
However, the password was shown in both the username and password fields
of the Firefox password manager dialog.
The problem was that the password input element (in the HTML form) is
cloned in a text input element, which is used to show the password in
plain text when clicking on the "Show password" button. As it was a text
input immediately followed by a password input Firefox seemed to assume
that it had to be the username and ignored the real username field, no
matter the value set for the "autocomplete" attribute. Now the cloned
text input is added after the password input, so Firefox no longer
thinks that the cloned text input is the username field and the password
manager dialog shows the proper username instead.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#7697
When using the new login flow a token will be generated since we login.
However after that we generate yet another token to return (as we
should).
However we should kill the current session token as we are done with it.
And will never use it again.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
"click" events are handled by several elements in user settings, and
some of them (like the edit icon in the user name) stop the propagation
of the event. Due to this the event never reaches the document and thus
the menu was not closed in those cases. "click" events are always
preceded by "mouseup" events (as "click" events are generated when
"mousedown" and "mouseup" events occur in the same element), so now the
menu is closed when a "mouseup" is received in the document.
The described problem would happen too if an element stopped the
propagation of the "mouseup" event; currently no element does that in
the user settings, so now the menu is always closed as expected.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
A popover menu is displayed when its element has the "open" CSS class.
That class is added when clicking on the menu toggle, but it was removed
only when clicking again on the toggle, so the popover menu in user
settings could be closed only by clicking again on the menu toggle. Now
the "open" CSS class is removed too when clicking on the body, either
directly or through event propagation.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The selected files summary shown in the multiselect header has a margin
to align it with the names of the files in the contents of the file
list. However, on very narrow screens, and depending on the verbosity of
the language, the summary can overlap with the actions when the
selection contains files and folders. To try to mitigate this, besides
showing only the icons for the actions, the summary margin is removed
too in very narrow screens.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
On narrow screens only the action icons are shown in the multiselect
header of the file list. In that case the padding of those icons is
increased to provide a larger touch area (the padding used is the same
as in the inline actions of the file list).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#7539
Also fixes overlap of text on mobile devices by resorting to just icons on lower resolutions.
Signed-off-by: Abijeet <abijeetpatro@gmail.com>
It is sometimes annoying to have users come here and complain about wrong priorities, especially when they are clearly running a (large) corporate instance. They should either contribute themselves or get a support contract...
Some parts of the file list contents (file name and actions) had a
higher z-index than the file list multiselect header. That header is
fixed in place, so when the file list contents were scrolled and those
parts with a higher z-index overlapped the multiselect header they were
fully visible. Now the z-index for the multiselect header has a higher
value (the same used in the controls bar) to ensure that the contents
are shown behind the header.
Fixes#7540
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#7184
The SyncJob can be very resource intensive. Since it requests all users
on the system to create the system addressbook. In order to do this it
creates a vcard for every user and updates the addressbook.
There is no need for this job since the proper signals are emitted and
handled in the carddav backend to update the addressbook live.
Worst comes to worst there is always the occ command to bring the
address book in sync again.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
- With root installation
- Core css
- App inside server root
- Secondary apps directory outside server root
- With an installation in a sub directory
- Core css
- App inside server root
- Secondary apps directory outside server root
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
If we can't connect to the appstore for some reason we don't have to log
the exception just an info entry is enough.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When the checkbox was moved to where the favourite icon was shown before
the layout of the file list was modified. The checkbox is no longer a
descendant of the ".filename" element, so it is no longer removed by the
"External storages" file list.
However, even before the checkbox was moved, explicitly removing it was
not the best approach, as file list rows could still be selected using
"Ctrl/Shift+click". This did not provide much value, as the selection
header has no actions; it simply states the number of selected elements.
The proper way to disable the selection is by setting "_allowSelection"
to false in the file list instead.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When the checkbox was moved to where the favourite icon was shown before
the layout of the file list was modified. The first column is no longer
the file name, so neither the thumbnail nor the name link were found.
Due to this the thumbnail was not set to the appropriate icon, and the
dummy event handler was not removed from the name link, so clicks on the
name were basically ignored. Now the selectors are based on the
".filename" CSS class instead of relying on the column position.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When an empty area of a file row was clicked and the "Details" action
was executed "fileActions.currentFile" was not guaranteed to be set to
the appropriate object (it depended on the previous actions of the
user), so when it was used by "getCurrentMimeType()" and other
FileActions functions they may not work as expected. Now it is
explicitly set to the appropriate value before its use.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When clicking on "Share link" in the "Sharing" tab of the Files app an
input field with the link appears. That input field already exists in
the DOM, although empty, before clicking on "Share link", and when that
is done the proper value is set and then the input field is shown.
In the acceptance tests "getValue()" can return the value of hidden
elements too, so as long as an element exists its value is returned
without waiting for the field to be visible. Due to this if the test
code runs too fast the "I write down the shared link" step could be
executed before the proper value was set, so the shared link got in that
case would be an empty value, and this would lead to failures when the
following steps were executed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The share menu toggle and some share menu items included an 'href="#"'
attribute, so they were handled as internal links by the browser, which
changed the current anchor when they were clicked. However, there was no
real need to change the anchor in those cases, and it could interfere
with other apps (for example, the PDF viewer sets the current anchor to
"#pdfviewer" when it is shown and it hides itself when that anchor is
modified). According to the HTML 5 spec the "href" attribute is not
mandatory for "a" elements, so they were removed.
Other options would have been to change the elements from "a" to "div"
or something like that, but that would have required changes to the CSS
rules too, or to prevent the default event handling for those elements
through JavaScript, which would have been a workaround instead of the
proper solution.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a "mouseup" event was triggered on any element except on the share
menu or its descendants the share menu was closed. The share menu toggle
is not a descendant of the share menu, so clicking on it when the share
menu was shown closed it by removing its "open" CSS class. However, once
that happened the click event was then handled by the share menu toggle,
which toggled the "open" CSS class in the share menu and thus added it
again. So, from the user point of view, nothing happened when clicking
on the share menu toggle if the share menu was open.
Now a "mouseup" event on the share menu toggle no longer closes the
share menu, and thus toggling the "open" CSS class when handling the
"click" event works as expected.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Clicking on an empty space in a file row causes the details view to be
shown. As it is a user initiated action on the file list now it is done
by triggering the Details action instead of directly calling
"_updateDetailsView"; the result is the same in both cases, but using
the action is more consistent (clicking on the file name triggers the
default action, and clicking on the inline actions triggers those
actions) and also makes possible to use the "beforeTriggerAction" and
"afterTriggerAction" listeners.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
* unify shadow blur from 3px to 10px
* remove opacity of background of app labels
* for IE: use box-shadow as fallback (because the filter: drop-shadow is not supported)
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
With the new avatar endpoint there is no difference between unknown
users and errors when generating the placeholder avatar. Therefore the
avatar function will now show the old placeholder if both a user and
displayname was given as parameters.
In case there is no displayname provided we cannot build the proper
placeholder so the unknown user placeholder is shown.
The displayname is not required for the avatar anymore, so we can
get rid of the old code path for placeholders.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The js and php code differ ever so slightly. So having the placeholder
for a second and then the image is just weird.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
In the same way that other elements can know when a FileAction is
registered or a default action is set this commit makes possible to be
notified before and after a FileAction is executed.
This is achieved by wrapping the registered action handler in a custom
function that notifies the listeners before and after executing the
handler itself. Due to this approach only FileActions registered through
"registerAction" trigger the events, although that is not a problem as
this is how the actions should be added to the FileActions anyway.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#7574
During some refactoring the event linked to password reset got removed.
This ment that we just submitted a normal POST but without the CSRF
token. And none of the js magic to redirect afterwards.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
".popovermenu" elements are visible or not depending on whether they
also have the "open" CSS class or not. "#header .menu" elements were
always hidden, so when both rules applied to the same element, like in
the menu of a Share page, the element was always hidden due to
"#header .menu" being more specific than ".popovermenu" and thus
overriding its rules. Now, "#header .menu" elements are hidden only if
they are not a ".popovermenu" too.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
If the parsed data is not a valid response we should not cache it and only cache the preprocessed result set.
Fixes#7442
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
When a Snap was disabled it stopped listening to the events, but if a
drag gesture was being performed it was kept as active. Thus, when the
Snap was enabled again move events were handled as if the Snap had never
been disabled, causing the gesture handling to continue where it was
left.
When the Snap for the navigation bar is disabled by an app it could be
as a result of a different gesture being recognized by the app (for
example, a vertical swipe) once both gestures have started. In that case
when the other gesture ends and the Snap is enabled again any pointer
movement will cause the navigation bar to slide until an "up" event is
triggered again (obviously not the desired behaviour).
Due to all this now when the Snap for the navigation bar is disabled by
an app the current drag gesture for the navigation bar is ended.
Note that this was added as a parameter to "Snap.disable()" instead of
done unconditionally to keep back-compatibility with the previous
behaviour (probably not really needed as it is unlikely that any app is
using the Snap library relying on that behaviour... but just in case).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
On narrow screens a slide gesture can be used to open or close the
navigation bar. However that gesture could conflict at times with the
gestures used by certain apps (for example, if the right sidebar is open
the user may expect to close it by dragging it to the right, but that
could open the navigation bar instead depending on how the events are
handled). This commit makes possible for apps to disallow and allow
again that slide gesture.
In any case, note that applications can only disallow the gesture,
but they can not enable it. That is, they can prevent the gesture from
being used on narrow screens, but they can not make the gesture work on
wide screens; they are always limited by the base rules set by the core.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The slide gesture is enabled or disabled depending on the width of the
browser window. In order to easily control that width the karma-viewport
plugin is now used in the unit tests.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a file from the file list is dragged a drag shadow (a copy of the
file row that follows the cursor position) is created. The drag shadow
element is created as a direct child of the body element, so it needs a
higher "z-index" than the one used for the file list to be visible.
In narrow screens the "#app-content" uses a "z-index" of 1000 in order
to be visible over the "#navigation-bar" when they overlap, so the
"z-index" of the drag shadow must be at least 1000 to be visible over
the file list.
Instead of updating the hardcoded "z-index" it was removed and replaced
by CSS rules for ".dragshadow" elements to ease theming.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
* Cache it for a day so we will retry eventually
* Cache the status.php response as well so we will try it once a day as
well
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Fixes following error in the logs: "ini_set(): A session is active. You cannot change the session module's ini settings at this time"
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Just to avoid users from trying this with a to new (untested) php version
* Moved the check logic to 1 place
* All directly callable scripts just require this on top
* exit hard (-1) so we know scripts won't continue
* Return status 500 so no sync clients will try fancy stuff
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Add a "searchPrincipals" function to the NC principal backend.
Fix the "findByUri" function to respect the prefixPath.
Signed-off-by: Christoph Seitz <christoph.seitz@posteo.de>
Case: email is set to null, but the avatar is set. In the old case the
email would set $emptyValue but $noImage would still be false. This we
would set the empty string as email.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When a constructor is spied using Sinon it is wrapped by a proxy
function, which calls the original constructor when invoked. When "new
Foo()" is executed a "Foo" object is created, "Foo" is invoked with the
object as "this", and the object is returned as the result of the whole
"new" expression.
Before Sinon 4.1.3 the proxy called the original constructor directly
using the "thisValue" of the spied call; "thisValue" was the object
created by the "new" operator that called the proxy. The proxy assigned
"thisValue" to "returnValue", so it was also the value returned by the
proxy and, in turn, the value returned by the whole "new" expression.
Since Sinon 4.1.3 (see pull request 1626) the proxy calls the original
constructor using "new" instead of directly. The "thisValue" created by
the outermost "new" (the one that called the proxy) is no longer used by
the original constructor; the internal "new" creates a new object, which
is the one passed to the original constructor and returned by the
internal "new" expression. This object is also the value returned by the
proxy ("returnValue") and, in turn, the value returned by the whole
outermost "new" expression.
Thus, now "returnValue" should be used instead of "thisValue" to get the
object created by the spied constructor.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#7158. Adds a # on the color if missing.
Increased maxlength, added hash:true for jscolor, and adding a # if not present on the change event.
Since the input element now allows a hex code, changed values to hexcode.
In addition, added a function to get RGB array from hex or rgb values. Calling it in both methods and using it to perform comparison.
Also changed the way we were determining whether the jscolor component had loaded.
Changed the control to use data-jscolor rather than defining opts in the class.
Signed-off-by: Abijeet <abijeetpatro@gmail.com>
When the autocomplete popover is shown the At.js plugin listens on the
message input field for key down events, and when Enter is pressed it
adds the selected item to the message. However, as "_onTypeComment" also
handles key down events for the message input field, when Enter was
pressed the comment was submitted and At.js had no chance to add the
item before that happened. Now when Enter is pressed and the
autocomplete popover is shown the comment is not submitted, and thus
At.js adds the selected item to the message as expected.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
We have to double check. Since getting the info of the root returns a
generic entry. But actually the stroage is not available. Else we get
very weird sync and web behavior.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When finding ".message" elements on "view.$el" the message area for the
new comment form and all the comments were matched. Now the selector was
restricted to match only the message area for the new comment form.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
* l10n in Nextcloud works by extracting the values only passed on their location and not based on the first parameter
* we need to change the translation pool from `core` to `settings` then
* fixes#7345
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Even if no avatar is set we should just generate the image. This to not
duplicate the code on all the clients. And only server images from the
avtar endpoint.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Otherwise its a normal string[] with the user ids, in that
case the array_merge did it's job just fine, apart from it
not being deduplicated.
The array+array is only needed when the user id is the key,
so integer only user ids are kept as they are instead of being
reindexed.
Regression from 3820d6883d
Signed-off-by: Joas Schilling <coding@schilljs.com>
Although #7256 was merged cleanly some of the changes really conflicted
with those introduced by the last commit of #7251, and this broke the
appearance of the author row of comments. This commit fixes those silent
conflicts and restores the appearance of the author row.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
In PHP 7.X hexadecimal notation support was removed from "is_numeric",
so "sanitizeMtime" directly rejected those values; in PHP 5.X, on the
other hand, "sanitizeMtime" returned 0 when a string with hexadecimal
notation was given (as it was the behaviour of "intval"). To provide a
consistent behaviour between PHP versions, and given that it does not
make much sense to send X-OC-MTime in hexadecimal notation, now
X-OC-MTime is always rejected if given as a string with hexadecimal
notation.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Directly calling "header" in the PHPUnit process causes the "Cannot
modify header information - headers already sent by" error to be thrown.
Instead of running the test in a separate process, which is slower, this
commit wraps the call to "header" in a method that can be mocked in the
tests.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit is based on the commits from pull request 28066 (included in
018d45cad97e0) from ownCloud by Artur Neumann and Phil Davis.
Unit tests are currently run only on systems that support negative
mtimes, so no special handling of negative values was included in the
tests to keep the test code more manageable.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This will be used in a following commit to test how the X-OC-MTime
header is handled.
This commit is based on the "make File::put() more testable" commit
(included in 018d45cad97e0) from ownCloud by Artur Neumann.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This commit extends the changes introduced in pull request #3793 also to
chunked uploads.
The "sanitizeMTime" method name is the same used in the equivalent pull
request to this one from ownCloud (28066).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This adds back the support for `\OCP\Share\IShare::getMailSend`, one example is creating bulk shares via API which where previously blocking due to the share notification emails.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
The contacts menu is not shown for avatars and user names in the author
row if they represent the current user. For consistency, and because the
contacts menu provides no value when shown for the current user, this
commit also disables the contacts menu for mentions to the current user.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The contacts menu does not provide too much value for users mentioned in
a message being composed, so it is now disabled in this case.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When it was on an author row the cursor was shown as a pointer, even if
clicking on the author row itself does nothing. On the other hand,
avatars used the default cursor, even if clicking on them either shows
the contacts menu (in the case of the author row, only when the avatar
is for a different user than the current one) or inserts a mention (for
avatars shown in the list of suggested mentions), depending on the case.
Now, the author row uses the default cursor, and avatars (and their
associated user name) use a pointer cursor if clicking on them will
trigger an action (either showing the contacts menu or inserting a
mention).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The code tried to find the apps with updates and thus was called for every available app. This caused to get the full appstore content as often as apps are available. The appstore request itself was cached nevertheless in an appdata dir, but with an object storage this is still a lot of round trips to read this cached result. Thus the instantiated list is now cached in a static variable (because it's a static method call).
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
When a comment was being deleted the submit working icon was shown. Now
the submit working icon is kept hidden in that case and a specific
delete working icon, which is shown at the same position as the delete
icon, is used instead.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The submit confirm icon is shown as the background image of an
absolutely positioned input element, so the CSS rules for the submit
working icon were modified to match those of the submit confirm icon.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When a comment is being deleted the "disabled" class is added to the
comment div, which causes it to look disabled. However, the input
elements and the content editable div were not truly disabled, and thus
it was still possible to interact with them. This commit ensures that
they are properly disabled while the comment is being deleted.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
fileInfo is composed of data from sharing, however additional data is
pulled when sidebar opens, e.g. the size. Then, existing data is
overwritten by data from the other source (files). The data points that
would be lost are not dirty however and still used, so we keep them.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Since the change of the text area to a content editable div the input
field was no longer disabled while a new comment was being sent. It was
caused by still trying to disable the div using the "disabled" property,
which works only on real input fields; when using a content editable div
the way to disable it is by setting "contenteditable" to "false".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The contacts menu was being shown as "inline-block", which caused the
top of the menu to be aligned to the top of the author row.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
the contacts popovermenu is also present and is being replaces, ending
up in two permission popupmenus with checkboxes duplicating the id,
breaking further permission changes.
plus, fixing a selector
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This should allow better reports as often the app id is passed
as context. While this is not used right now, I'd like to have this
for NC13 as adding it later will break the interface for existing apps
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
This adds a crash reporter registry, which is meant for third party apps
to hook into the error logging/reporting chain. This way, external tools
like Sentry can be used to track and aggregate system crashes.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
In case of error, instead of a generic error message, an upload will
display whichever message is returned in the Sabre Exception, if
applicable.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Mocked getAppValue to deliver a value of 1800 when updateAttributesInterval is requested by needsRefresh.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Makes the time between needsRefresh configurable via app config option updateAttribuesInterval.
Default is still 86400 secons which is one day.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
This seems to be the only way to have the same helpers used between
tests in a manner that works for both standalone phpunit and
autotest.sh.
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
Fixed transition bug of grouptop
Fix password submit and error handling
Fixed multiple form send
Fix submit loading state
fix login form sending state
Replace loader type
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
Currently, if the app path includes a symlink, the calculated webDir
will be incorrect when generating CSS and URLs will be pointing to the
wrong place, breaking CSS.
Use realpath when retrieving app path, and these issues go away.
Fix#6028
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
core/js/setup.js has logic to show the spinner upon form submission, but
ever since v12 was released the spinner was never hidden in the first
place.
Modify core/css/guest.css to hide it, which allows core/js/setup.js to
do its thing.
Fix#5532
Signed-off-by: Kyle Fazzari <kyrofa@ubuntu.com>
This commit adds chunked uploads in the Web UI (for authenticated users,
but not for public uploads). To do that the server endpoint used by the
uploader is changed from WebDAV v1 to WebDAV v2. The chunking itself is
done automatically by the jQuery-File-Upload plugin when the
"maxChunkSize" parameter is set; in "fileuploadchunksend" the request is
adjusted to adapt the behaviour of the plugin to the one expected by
"uploads/" in WebDAV v2.
The chunk size to be used by the Web UI can be set in the
"max_chunk_size" parameter of the Files app configuration. By default it
is set to 10MiB.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Now that the permissions returned by the server specify whether a file
is readable or not the frontend no longer needs to assume that every
file is readable.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Now that these tests are executed they are revealed to be partially
obsolete; they were fixed to match the current parsing behaviour.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The first parameter of "apply" must be the object to act as "this", and
the Promise callback gets the parameters provided in the "resolve".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The Details and the Favorite actions do not require any permission on
the files to be performed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Now a file gets its directory permissions only if it contained no
permissions (they were undefined or null), but not if its permissions
were set to "NONE".
Besides that, now file actions that do not require any permission on the
file to be performed can be used on files that have no permissions.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Until now it was safe to assume that every file was readable by its
owner, so there was no need to return whether the file was readable or
not. However, with the introduction of end to end encryption that is no
longer the case, and it is now necessary to explicitly provide that
information.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When several files are selected and one of them can not be deleted the
"Delete" file action is not shown in the summary. This commit extends
that behaviour too to the other file actions in the summary ("Move or
copy" and "Download"), so now an action is shown in the summary only if
it can be executed on all the currently selected files.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixes#6967
This allows clients to check for Walled Garden connections.
The endpoint just responds with a 204 (which is very unlikely with such
a connection)
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Some providers had issues when using the preview link (since it was
double encoded).
Now we actually serve the max size preview so it looks better
The image isn't cropped anymore so supporting platforms can just embed
the whole image.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
background: we have a flat hierarchy of comments, not a tree. therefore we
can also remove again the unnecessary additions.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Seeking is not needed if the $from is 0, because then the pointer is already at the correct position. Additionally another fallback is added, that if the fseek fails it just uses an fread to skip the beginning of the file until it is at the correct position. This skipping is done with a chunked fread.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Object storage instances always fall back to the content based mimetype detection, because the file name for object storage was always random due to the fact that it was temporarily storage in a generated temp file. This patch adds a check before that to make sure to use the original file name for this purpose and also remove possible other extensions like the versioning or part file extension.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
There is no need to cache routes distributed. It even has the downside
that the router might return different routes then the ones in the local
routes.php files.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
When sharing a folder via Facebook, WhatsApp or any other platform that makes use of OpenGraph, the display title was "Nextcloud - a safe home for all your data" and the description was the actual name of the folder. This should not be the case, so the display title has been changed to display the folder name and the description now displays the former OpenGraph title.
Signed-off-by: Sascha Sambale <mastixmc@gmail.com>
Fixing whitespaces and empty line.
Fixes#6821
This makes sure that (supported) browsers will not prefill the password
field if a user has a password saved for that nextcloud.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
App code will not be executable if the app is not enabled, because the autoloader refuses to load that class.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* introduce a Controller for requests
* introduce result sorting mechanism
* extend Comments to retrieve commentors (actors) in a tree
* add commenters sorter
* add share recipients sorter
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Firefox and Chrome drivers for Selenium refuse to click on an element if
the point to be clicked is covered by a different element, throwing an
UnknownError exception with message "Element is not clickable at point
({x}, {y}). Other element would receive the click: {element}". Although
in general that would be a legit error (as the user would not be able to
click on the element) due to a bad layout, sometimes this can be just a
temporal issue caused by an animation, in which case there would be no
problem once the animation finished and the elements are all in their
final location.
Unfortunately, automatically handling those situations in which the
problem is caused by an animation by just retrying a few times if the
element to be clicked is covered before giving up would probably cause
confusion instead of easing test writing.
The reason is that if the center of the element is covered by another
one the Firefox driver for Selenium tries to click on the corners of the
element instead. The problem is that the coordinates used for the click
are integer values, but Firefox has sub-pixel accuracy, so sometimes
(depending on which corner is not covered and whether the left, top,
width or height properties of the element to be clicked have a decimal
component or not) the clicks silently land on a different HTML element
(and that is with squared borders; with round borders they always land
on a different HTML element. That was partially addressed for Selenium
3.0 by clicking first on the edges, but it would still fail if the
middle point of the edges is covered but not the corners).
It is not possible to fix or even detect all that from the tests (except
maybe with some extreme hacks involving accessing private PHP members
from Mink and bypassing or replacing the standard JavaScript executed by
the Firefox driver with a custom implementation...), so it is not
possible to ensure that clicks during an animation will land on the
right element (in fact it is not possible even on static elements,
although except when the layout is wrong there should be no problem);
sometimes retrying a click when the element is covered would solve the
problem, sometimes it would cause a different element to be clicked (and
sometimes there would be even no retry, as the first click would have
silently landed on a different element than the expected one).
Therefore, a different approach must be used. Instead of trying to
automatically handle clicks during animations the tests must be written
being aware of the problem and thus waiting somehow for the animations
that can cause a problem to end before performing the clicks.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Now that the checkbox was moved to its own column clicking on the
thumbnail should behave like clicking on the file name. To achieve this
the left position was replaced with a padding, so the element is kept at
the same place while extending its clickable area to cover the
thumbnail.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The selection column is not only a visual column, but also a real column
of the file list table. Unlike other columns whose width is reduced in
space constrained screens the selection column must stay the same so the
tapping area is large enough to be easily usable
The selection column does not appear in the search results table, so its
contents have to be explicitly aligned with those of the main table
based on whether the main table has a selection column or not (using the
"has-selection" CSS class in the same way as the "has-favorite" CSS
class was being used when there was a column for favorite actions).
In the tests the ":visible" selector can no longer be used. That
selector matches elements with a width or height that is greater than
zero, but the dimensions calculated in the unit tests are not reliable;
the width of the link was zero before these changes, and now moving the
checkbox to its own column causes the height of the link to become zero
too, so it no longer matches the ":visible" selector even if it is not
hidden. As hidding and showing the link is based on its "display" CSS
property its value is the one checked now.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "has-favorites" CSS class is no longer used after moving the
favorite mark to the top right corner of the thumbnail, so there is no
need to add it to the table.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The favorite icon was shown on its own "column" (not a real column in
the table, but a visual column achieved through margins and left
positions). Now the icon was moved to the top right corner of the file
thumbnail, and the thumbnail and file name were moved to the left to
fill the space left by the "column".
To keep the markup in line with its visual representation (and to ease
the placing through CSS), the favorite mark is no longer prepended to
the row, but appended to the thumbnail instead. In the same way, the
thumbnail is no longer appended to the checkbox label, but to the link
with the name of the file instead (although the checkbox is still shown
at the bottom right corner of the thumbnail, and clicking on the
thumbnail still selects the file). In order to show the "busy" state on
a file the "icon-loading-small" CSS class is set to the parent element
of the thumbnail, so the thumbnail is also wrapped now by another div
with the same size and position as the label.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The checkbox is not shown always with full opacity, though, in order to
reduce the visual noise (specially later, once the checkbox is moved to
its own column).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This is a preparatory step for a following commit in which the position
of the favorite icon and the checkbox will be swapped; in that new
design the favorite icon is no longer expected to be an action but just
a simple mark on whether the file is favorited or not (the action is
expected to be triggered then only from the file actions menu).
The favorite icon is now fully shown or completely hidden depending on
whether the file is favorited or not. As the icon is just informative
but no longer an action now it does not change when hovered or focus. In
the same way, the alternative text when the file is not favorited now it
is not "Favorite" (an action) but "Not favorited" instead.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Currently a file can be favorited either through the inline action or
through the file actions menu. However, the inline action will be
removed in a following commit and then it will be possible to do it only
through the file actions menu.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The new FileAction for the menu is essentially the same as the old
inline FileAction, except for the rendering; in this case the FileAction
is shown in the menu in a standard way, so there is no need to provide a
custom renderer (although the menu entry text and icon change depending
on whether the file is currently a favorite or not, but that can be done
just with displayName and iconClass functions).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Icon class function properties make possible to render a different icon
class depending on the context of the file action.
Inline file actions had support for them already and called them passing
the file name and context of the file action as parameters. Due to this
the FileActionsMenu passes those parameters too to icon class functions
instead of just the context like done for display name functions.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This will allow apps to also have a proper classmap and authorative
autoloader.
Currently if a file: <appdir>/composer/autoload.php exists we will use
it. Else we keep the current behavior.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
IE11 triggers an 'input' event whenever an input is focussed
or loses focus. Thus this causes an endless loading loop as soon
as the view is re-rendered. To prevent this, this remembers the
previous search term and ignores events where the term has not
changed.
Fixes https://github.com/nextcloud/server/issues/5281
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
discovered a bug in the integration test which lead to following a
different code path and giving a false-positive success feedback.
Also listens now to the evendispatcher instead of old hook system
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
however it does not dedupe (appears too complex/expensive while we don't
havve the issue currently)
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
There are currently no "img" or "span" descendants of "td.quota"
elements, so those rules can be removed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The quota is set through a dropdown, and this dropdown is only shown
when clicking on the select element itself. Therefore, the cell should
not show a pointer when hovering on it but outside the select element.
Note that although the removed "&.quota" selector also set a "width"
declaration that declaration was later overriden by
"#userlist td.quota", so it was not needed.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Clicking anywhere on the cell shows the input field to set the email
address, so the cursor is set as a pointer not only on the text and
icon, but on the whole cell as well (like done for the full name and the
password).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
If there is an exception in the template handling then a white page is shown.
This improves the handling of this and shows text only about the internal
error.
To test this just setup redis as cache and then disable the php-redis module.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
On a remembered login session, we create a new session token
in the database with the values of the old one. As we actually
don't need the old session token anymore, we can delete it right
away.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
The seed of the image placeholder is needed to generate the background
color of the image, but as the background color is later overriden any
seed could be used. When no text is explicitly given the seed is used as
text too, so there is no need to pass the user ID and simply using "?"
as seed is enough.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When calling the jQuery avatar plugin with a user that did not exist
(that is, users for which "/avatar/{user}/{size}" return a JSON response
with an empty "displayname" value) "?" on a grey background was shown.
However, if the jQuery avatar plugin was called with an undefined
JavaScript value then "?" was shown on a bluish background. This commit
unifies both cases to use the grey background.
The unit tests were also modified to ensure that the grey background is
used in both cases.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
If extraction fails we should not continue the installation/update
process as the info.xml cannot be loaded and an unrelated error
occurs.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Basically we did in almost all cases did a query to much.
This resulted in an extra query for each share type.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This adjusts the contacts menu to also support searching by email address which is relevant in scenarios where no UID is known such as LDAP, etc.
Furthermore, if `shareapi_allow_share_dialog_user_enumeration` is disabled only results are shown that match the full user ID or email address.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
- Groups, which are excluded from sharing should not see local users at all
- If sharing is restricted to users own groups, he should only see contacts from his groups:
Signed-off-by: Tobia De Koninck <tobia@ledfan.be>
This fixes an issue with custom filesystem themes that can define title, name
and entity differently, but the theming app was only using the name as fallback
(see #5374).
Signed-off-by: Joachim Bauch <bauch@struktur.de>
The current implementation breaks installations with symlinks to
directories inside the webroot (i.E. apps).
With this change both variants, directory and symlinks, will be detected
correctly.
Fixes: #6028
Signed-off-by: Axel Helmert <axel.helmert@luka.de>
The CSP nonce is based on the CSRF token. This token does not change,
unless you log in (or out). In case of the session data being lost,
e.g. because php gets rid of old sessions, a new CSRF token is gen-
erated. While this is fine in theory, it actually caused some annoying
problems where the browser restored a tab and Nextcloud js was blocked
due to an outdated nonce.
The main problem here is that, while processing the request, we write
out security headers relatively early. At that point the CSRF token
is known/generated and transformed into a CSP nonce. During this request,
however, we also log the user in because the session information was
lost. At that point we also refresh the CSRF token, which eventually
causes the browser to block any scripts as the nonce in the header
does not match the one which is used to include scripts.
This patch adds a flag to indicate whether the CSRF token should be
refreshed or not. It is assumed that refreshing is only necessary
if we want to re-generate the session id too. To my knowledge, this
case only happens on fresh logins, not when we recover from a deleted
session file.
Signed-off-by: Christoph Wurst <christoph@winzerhof-wurst.at>
Keep mount point visible and also ext storage config visible when
dealing with configs relating to storage backends or auth mechanisms
that were provided by an app that is currently disabled.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
- Move to SCSS so we use theming color values
- Apply tab style from files sidebar to ui-tabs (e.g. in user_ldap)
- Move select style to the jquery-ui-fixes file and make those only apply to ui-autocomplete elements
Signed-off-by: Julius Härtl <jus@bitgrid.net>
homesToKill was not set in runtime since some changes some place else. It
required deleteUser() to be called first. The method acts independent of it
now.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
* Store the auth state in the session so we don't have to query it every
time.
* Added some tests
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
The helper funtion did not handle the response correctly and basically
only returned the last share with tags.
This is a simple rewrite. That is still understandable. Loops maybe more
than strictly required. But preformance is not the issue here.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
If the estimated upload time is bigger than 4 hours it shows the text
"Uploading..." because the time then doesn't give any good hint to the
user anyways.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
```
1) OCA\FederatedFileSharing\Tests\Settings\AdminTest::testGetForm with data set #0 (true)
PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
2) OCA\FederatedFileSharing\Tests\Settings\AdminTest::testGetForm with data set #1 (false)
PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
3) OCA\FederatedFileSharing\Tests\Settings\AdminTest::testGetSection
PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
4) OCA\FederatedFileSharing\Tests\Settings\AdminTest::testGetPriority
PHPUnit_Framework_TestCase::getMock() is deprecated, use PHPUnit_Framework_TestCase::createMock() or PHPUnit_Framework_TestCase::getMockBuilder() instead
```
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
As "singleFileUpload" is used the "add" callback (which in turn calls
"addFileToUpload") will always be called with a single file. Therefore
there is no need to iterate over the files (and it is not done in the
other callbacks either, so this aligns the code with the rest of the
callbacks).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
There is no need to store the file name, as the "data" parameter given to
all the callbacks provides a "files" attribute with all the files that
the callback refers to; moreover, it will always be a single file due to
the use of "singleFileUploads" in the jQuery File Upload plugin.
This also fixes the loading icon not disappearing when several files were
uploaded at once. "singleFileUploads" causes the "add" callback to be
called once for each file to be uploaded, so "fileName" was overwritten
with the name of each new file in the upload set; when "fileName" was
later used in the "done" callback to find the file in the list whose
loading icon replace with the MIME type icon "fileName" always had the
name of the last file, and thus its icon was the only one replaced.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The "done" and "fail" callbacks both update the item for the uploaded
file using "setFileIcon". "setFileIcon" updates the contents of the
"<li>" element for the file, but the "fail" callback was giving
"setFileIcon" an element generated by the template, so the resulting
HTML contained a "<li>" element nested in another "<li>" element.
However, generating the HTML is better done through a template, so the
template now receives the icon to show in order to be used by a
successful upload and a failed one, and "setFileIcon" was changed to
"updateFileItem".
Note that the mimeTypeUrl does no longer need to be escaped, as
Handlebars templates escape the needed characters automatically.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
When the "fail" callback is called, "errorThrown" is a property of the
data object instead of a parameter.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Any `\OCP\Authentication\IApacheBackend` previously had to implement `getLogoutAttribute` which returns a string.
This string is directly injected into the logout `<a>` tag, so returning something like `href="foo"` would result
in `<a href="foo">`.
This is rather error prone and also in Nextcloud 12 broken as the logout entry has been moved with
054e161eb5 inside the navigation manager where one cannot simply inject attributes.
Thus this feature is broken in Nextcloud 12 which effectively leads to the bug described at nextcloud/user_saml#112,
people cannot logout anymore when using SAML using SLO. Basically in case of SAML you have a SLO url which redirects
you to the IdP and properly logs you out there as well.
Instead of monkey patching the Navigation manager I decided to instead change `\OCP\Authentication\IApacheBackend` to
use `\OCP\Authentication\IApacheBackend::getLogoutUrl` instead where it can return a string with the appropriate logout
URL. Since this functionality is only prominently used in the SAML plugin. Any custom app would need a small change but
I'm not aware of any and there's simply no way to fix this properly otherwise.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
PHP's json_encode only accept proper UTF-8 strings, loop over all
elements to ensure that they are properly UTF-8 compliant or convert
them manually.
Without this somebody passing an invalid User Agent may make json_encode
return false which will get logged as empty newline.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
`\OC\User\Database::createUser` can throw a PHP exception in case the UID is longer than
permitted in the database. This is against it's PHPDocs and we should cast this to `false`,
so that the regular error handling triggers in.
The easiest way to reproduce is on MySQL:
1. Create user `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` in admin panel
2. Create user `aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa` in admin panel again
3. See SQL exception as error message
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
There was a setting to disable the last execution of cron. There is no known
problem with this write access and it was also questioned when this feature
was build in https://github.com/owncloud/core/pull/7689#issuecomment-38264707
Recently there was also a bug report about a non-visible last cron execution
(#6088) - let's better remove this.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
If you set the permissions on a public share the SHARE permission makes
no sense. So instead of throwing a warning. Just filter out the share
permission.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
If the share input field is unfocused, the autocomplete list is closed. Once
the field was focused again it was not properly opened again. This adds a
trigger to redo the search and show the results again.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Pull request #5429 made cached SCSS files depend on a hash of the base
URL, so the "/css/core/server.css" file does no longer exist; as the
file can not be loaded the "Loading preview" message is never removed
and the "Saved" message is never shown.
As it now depends on the hash of the base URL the file to be reloaded
can no longer be hardcoded, so the full URL to the "server.css" file
that has to be reloaded (if any) is now got from the DataResponse
provided by the controller.
Fixes#5975
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This is a preparatory step for a following change in which
reloadStylesheets will have to be able to receive absolute URLs.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Pull request #5429 made cached SCSS files depend on a hash of the base
URL, so the "/css/core/server.css" file does no longer exist. The
"server.css" URL must be known by the Theming app in order to update the
stylesheets when previewing the changes to the theme, so the
DataResponse from the controller now provides the full URL to the
"server.css" file that has to be reloaded (if any).
The "server.css" URL provided by the response will be taken into account
by the JavaScript front-end in a following commit.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
This is a preparatory step for a following commit in which the
properties present in the response will change depending on whether the
request was successful or not.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
In some cases the acceptance tests have to explicitly wait for something
to happen without using the "find" method from the actor; in those cases
the timeout multiplier needs to be taken into account too, so the test
cases must be able to retrieve it from the actor.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
If we have a jailed storage we must also fix the internal path on copy.
Else we pass in the wrong path.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Pull request #5969 fixed the vertical alignment of loading icon and
status message in Theming app, but in doing so it broke the loading icon
inside the upload button.
When an image is being uploaded the upload icon is replaced by a loading
icon, so the loading icon and the upload icon have to share their CSS
rules, but only in that specific case.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Visually, the icon positioned on the login button is part of the login
button, so clicking on the icon should be the same as clicking on the
button. As the icon is a different element this commit sets the icon to
ignore mouse events so they are received and handled by the login button
instead.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The pure CSS loading icon uses an ::after pseudo-element, and thus it
can only be used on container elements; the input element is not a
container element, so when the class "icon-loading-small" is set on an
input element it falls back to a loading icon GIF.
This commit modifies the markup of the login button to add a div element
that holds the confirm icon and the loading icon (depending on the
case). In order to position the icon in the same place as before the
input and the icon are both wrapped by another div making possible to
set the absolute position of the icon relative to the input.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
As both elements are inline/inline-block and belong to the same line
they can be aligned vertically using "vertical-align: middle".
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The loading icon is used in a totally different way than the upload icon
and thus it should not share its CSS rules.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The removed rules were either always overriden by other rules or never
used due to not matching any element.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Just fetch the first 10kb. This should be more than enough in 99% of the
cases. And avoid downloading a 10mb text file just to display a tiny
portion.
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
* Now listeners for those events get proper share objects.
* Legacy hooks still fired
* Updated tests
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This is broken and will never work as the phan CI step pointed out.
Pro-tip of the day: Check why CI fails before merging 🙈
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
Sometimes it could be the case that after a channel change the last updated
timestamp is reset, but the check for updates is not yet completed. In this
case the update notification showed "You are up to date" and the date was
"1970-01-01 00:00:00". With this fix the state is properly shown.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
The private API here doesn't have the backends yet properly initialized, probably another bug but let's go with the easy bug fix here. Next step is to write integration tests and then figure out why changing this to the private API (which it actually calls) doesn't work.
Fixes https://github.com/nextcloud/server/issues/5950
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
This is public API and breaks the middlewares of existing apps. Since this also requires maintaining two different code paths for 12 and 13 I'm at the moment voting for reverting this change.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* Inject the timefacotry so we can mock it properly in the tests.
* Extended unit tests to cover the new paths
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This code is a leftover from the old Shibboleth implementation from ownCloud days, nowadays it causes more issues than it does good (such as https://github.com/nextcloud/user_saml/pull/137). Let's remove it for the future thus.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
* fix the show password button on the personal page
* before: if the password change failed the show password icon was not shown again
* after: show password icon is visible
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
* Nextcloud is not properly loaded in the standalone version (especially the theming)
* it is already not listed anymore in the Nginx config (see nextcloud/documentation#392)
* the index.php-free version doesn't support this
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
- [x] Highlight for selected date should be bold text.
- [x] Hover highlight for day should be the same as for the selected date.
- [x] Remove hover effect on the week.
- [x] Row for days of the week should indeed stay, but non-bold and at 50% opacity so it doesn't take away the focus.
- [x] Dates of previous and next months a bit lighter.
- [x] Remove marking the weekend blue.
- [x] The box centered below the date field, with triangle in the middle.
Signed-off-by: Marin Treselj <marin@pixelipo.com>
This ensures that only a secure connection to the LDAP server will be used,
if Start TLS has been enabled.
Signed-off-by: Jarkko Lehtoranta <devel@jlranta.com>
* shows the filename and sharer on the public page
* allows the user to identify, that this is a user page and not an official page of the Nextcloud hosting
* remove link on logo that redirects to login (fixes#5720)
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
first, it does not work (at least not everywhere/reliably), second if it
did it was not reset properly. Removes a bit of complexity.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
check if table was updated successfully and only then send a notification
mail and return "true".
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
This adds a phan plugin which checks for SQL injections on code using our QueryBuilder, while it isn't perfect it should already catch most potential issues.
As always, static analysis will sometimes have false positives and this is also here the case. So in some cases the analyzer just doesn't know if something is potential user input or not, thus I had to add some `@suppress SqlInjectionChecker` in front of those potential injections.
The Phan plugin hasn't the most awesome code but it works and I also added a file with test cases.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
- This kind of hook signal used to be emitted in the old Share library but it was missing from Share 2.0
Signed-off-by: Pauli Järvinen <pauli.jarvinen@gmail.com>
In order to decide if a recovery key needs to be added we always
need to check the files owner settings and not the settings of
the currently logged in user.
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
in case a user is already logged in on the same server from
which the public link comes from, we need to setup the owners
file system in order to show the preview
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
Running the acceptance tests on Drone relied on the pod-style networking
used by services (service containers were available at 127.0.0.1 from
the build containers). However, in Drone 0.7 service and build
containers must be accessed from each other using their domain name
instead. Thus, acceptance tests had to be disabled on Drone.
Now that the acceptance test system supports setting a different domain
for the Selenium server and for the Nextcloud test server the acceptance
tests can be enabled again on Drone.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
By default "127.0.0.1:4444" is used, so nothing needs to be set when the
acceptance tests and the Selenium server share the same network (like
when called by "run.sh").
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
By default "127.0.0.1" is used, so nothing needs to be set when the
Selenium server and the Nextcloud test server share the same network
(like when called by "run.sh").
Besides passing the domain to the acceptance tests the Nextcloud test
server configuration must be modified to see the given domain as a
trusted domain; otherwise the access would be forbidden.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The NextcloudTestServerLocalHelper started the PHP built-in web server
for the Nextcloud test server at 127.0.0.1; as the Selenium server has
to access the Nextcloud test server they were forced to share the same
network. Now, the domain at which the PHP built-in web server is started
can be specified when the NextcloudTestServerLocalHelper is created,
which removes the need of sharing the same network, as the Selenium
server now can access the Nextcloud test server at an arbitrary domain.
However, by default "127.0.0.1" is still used if no domain is given.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Previously this container used a very old CentOS version. It has been migrated to Debian Jessie now using the deb.sury.org repositories.
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
- When a file was unshared, the legacy hook pre_unshare fired twice and the hook post_unshare did not fire at all. This was obviously a copy-paste error.
Signed-off-by: Pauli Järvinen <pauli.jarvinen@gmail.com>
Fix service container host name
check current folder
fix redis for integration test
Fix more hostnames
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
The toggleSelect extension for Select2 makes possible to unselect items
in a multi-select dropdown by clicking on them; this behaviour should be
enabled in all the multi-select dropdowns used in the server.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
"select2-toggleselect.js" provides an extension to Select2 that makes
possible to unselect items in a multi-select dropdown by clicking on
them. It seems that its load slipped through when moving things around
in commit 6a470e59356b8c52115fe2790666027f38977604; this commit adds it
to the JavaScript files to be loaded in the same position that it should
have had in that commit (based on how the other declarations were
moved).
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The app navigation is not exclusive to the Files app but a generic
component used by other apps too, so its locators and steps should be in
its own context.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The sort comparator checks the "isFavorite" property of the FileInfo
objects to compare. That property is set when the file list is loaded
and the response from the server is parsed, and thus a freshly loaded
file list has the proper sorting for favorite files. However, the
property is not set in other cases, like when the FileInfo objects are
derived from FileInfoModels due to a file being marked as a favorite or
a text editor being closed, which causes the file to be sorted in the
wrong position.
There is no need to add the property in those situations, though; in all
cases the TagsPlugin adds a "tags" array property that contains an
OC.TAG_FAVORITE tag, so that tag can be checked instead of "isFavorite".
Moreover, although "isFavorite" was added by the main "_parseFileInfo"
function it did not really belong there but to the "FileInfoParser" from
the TagsPlugin; however, as that property now is not used anywhere it
was removed altogether.
A cleaner solution would have been to make the sort comparator
extensible by plugins like other behaviours of the file list and then
add the sorting logic related to favorite files to the TagsPlugin.
However, right now only the TagsPlugin would need to alter the main
sorting logic, and it seems like a corner case anyway. Even if it is
implemented as a plugin, favorite files is a core feature, so for the
time being it will be taken into account directly in the main sorting
logic; making the sort comparator extensible by plugins is defered until
there are other use cases for that.
Fixes#5410
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
Fixme:
- Install and update of apps
- No revert on live systems (debug only)
- Service adjustment to our interface
- Loading via autoloader
Signed-off-by: Joas Schilling <coding@schilljs.com>
Move the inline <script> after the external <script> because the internal JS between CSS <link> and external JS makes firefox loading CSS and JS not in parallel.
The internal js is now parsed last but will still be executed first since everything else is deferred js.
Signed-off-by: Michael Letzgus <michaelletzgus@users.noreply.github.com>
Most of the time, when people have multiple backends or add a
custom backend, they want to create the users there and not in
the default backend. But since that is registered first, users
were always created there.
Signed-off-by: Joas Schilling <coding@schilljs.com>
In some not yet completely determined configurations, the following error could occur while writing a file:
Error: Call to a member function getUsers() on null
/var/www/nextcloud/lib/private/Share20/Manager.php - line 1277: OC\Share20\DefaultShareProvider->getAccessList(Array, true)
/var/www/nextcloud/lib/private/Share20/ShareHelper.php - line 51: OC\Share20\Manager->getAccessList(Object(OC\Files\Node\Folder), true, true)
/var/www/nextcloud/apps/activity/lib/FilesHooks.php - line 616: OC\Share20\ShareHelper->getPathsForAccessList(Object(OC\Files\Node\File))
/var/www/nextcloud/apps/activity/lib/FilesHooks.php - line 196: OCA\Activity\FilesHooks->getUserPathsFromPath('/path/to/file', 'user')
/var/www/nextcloud/apps/activity/lib/FilesHooks.php - line 157: OCA\Activity\FilesHooks->addNotificationsForFileAction('/path/to/file', 'file_changed', 'changed_self', 'changed_by')
/var/www/nextcloud/apps/activity/lib/FilesHooksStatic.php - line 55: OCA\Activity\FilesHooks->fileUpdate('/path/to/file')
/var/www/nextcloud/lib/private/legacy/hook.php - line 106: OCA\Activity\FilesHooksStatic fileUpdate(Array)
/var/www/nextcloud/lib/private/Files/View.php - line 1245: OC_Hook emit('OC_Filesystem', 'post_update', Array)
/var/www/nextcloud/lib/private/Files/View.php - line 1173: OC\Files\View->runHooks(Array, '/path/to/file', true)
/var/www/nextcloud/lib/private/Files/View.php - line 679: OC\Files\View->basicOperation('file_put_conten...', '/path/to/file', Array, '<?xml version="...')
/var/www/nextcloud/lib/private/Files/Node/File.php - line 64: OC\Files\View->file_put_contents('/path/to/file', '<?xml version="...')
[...]
Signed-off-by: Jan-Philipp Litza <janphilipp@litza.de>
The unit of `data.bitrate` is bit, but the argument unit of
`humanFileSize` function is byte, so it should be divided by 8.
Signed-off-by: Yaojin Qian <i@ume.ink>
The upload remaining time is always 'a few second' whatever a big or a
small file uploading.
This commit fixes it. The `new Date().getMilliseconds()` only return a
three digits number. When time arrived the next second, the millisecond
start from ZERO again. So `new Date().getTime()` is the righe choice.
And remaining time variables shoule be initialized when the file starts
uploading, otherwise the remaining time of a new upload will always be
'Infinity years' until you refresh the page.
Signed-off-by: Yaojin Qian <i@ume.ink>
Treat PHP Errors on User session regenerate
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
remove unnecessary lines…
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
change PHP errors to ErrorException in the session (PHP >=7)
Otherwise it might be that authentication apps are being disabled on
during operation while in fact the session handler has hiccup.
Signed-off-by: Arthur Schiwon <blizzz@arthur-schiwon.de>
Overrides \Sabre\DAV\Auth\Backend\AbstractBearer::challenge to prevent sending a second WWW-Authenticate header which is standard-compliant but most DAV clients simply fail hard.
Fixes https://github.com/nextcloud/server/issues/5088
Signed-off-by: Lukas Reschke <lukas@statuscode.ch>
The SystemTagsInfoViewToggleView is a basic view that renders a label
that, when clicked, toggles the visibility of an associated
SystemTagsInfoView.
In order to keep the view parent agnostic its attachment and detachment
to/from the MainfFileInfoView is done in the FilesPlugin.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
SystemTagsInfoView now provides public methods related to its visibility
in preparation to be used by external objects.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The toggle element was added to the MainFileInfoView element when
SystemTagsInfoView was rendered. However, if the MainFileInfoView was
rendered again after that the toggle element was removed. Therefore,
instead of adding it when SystemTagsInfoView is rendered, the toggle
element has to be added when MainFileInfoView triggers its "post-render"
event.
Note, however, that when MainFileInfoView is rendered all the events are
removed from its child elements. As the toggle uses a "click" event
either the event has to be added back or the element has to be detached
before the MainFileInfoView is rendered.
Fixes#4944
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
The post-render event makes possible to modify the
MainFileInfoDetailsView element once it has been rendered, which is
needed by OCA.SystemTags.FilesPlugin to add the "Tags" label to the file
details, while the pre-render event makes possible to detach added
elements if needed before the MainFileInfoDetailsView is rendered again,
as that removes the events from the child DOM elements even if they
belong to other views.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
In some cases, an app may need to act on a detail view registered by
another app or the core, for example, to add extra elements to the
element of the detail view.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
* password form overlaps upload button and doesn't allow to click it
* regression from #5259
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
make sure that we always clear all floating rules after the user settings parts
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
Fixed typo and removed doclink symbol.
Reported at transifex
Update util.php
Another l10n improvement from transifex.
Signed-off-by: Morris Jobke <hey@morrisjobke.de>
Use Unified function to emit <link> tags for css loading, obey "Don't Repeat Yourself" ;-)
(Next step might by to combine this with the emit <script> function (even more DRY?) AND move all this to a better place?)
Signed-off-by: Michael Letzgus <michaelletzgus@users.noreply.github.com>
Else when an upgrade happens we will recompile all the SCSS files all
the time (until the cache expires).
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
Acceptance tests opened the details view by clicking on the middle of
the file row, but due to the changes made in issue #4921 that now opens
the file instead; this commit updates the acceptance tests to open the
details view through the "Details" item in the file actions menu.
Signed-off-by: Daniel Calviño Sánchez <danxuliu@gmail.com>
* Create generalized function for emmitting <script defer src=""> tags to templates
* Remove type attribute from inline_js
* Add defer attribute to external <script> tags
Signed-off-by: Michael Letzgus <michaelletzgus@users.noreply.github.com>
In the Nextcloud community, participants from all over the world come together to create Free Software for a free internet. This is made possible by the support, hard work and enthusiasm of thousands of people, including those who create and use Nextcloud software.
Our code of conduct offers some guidance to ensure Nextcloud participants can cooperate effectively in a positive and inspiring atmosphere, and to explain how together we can strengthen and support each other.
The Code of Conduct is shared by all contributors and users who engage with the Nextcloud team and its community services. It presents a summary of the shared values and “common sense” thinking in our community.
You can find our full code of conduct on our website: https://nextcloud.com/code-of-conduct/
Please, keep our CoC in mind when you contribute! That way, everyone can be a part of our community in a productive, positive, creative and fun way.
* :package: **Sync your Data** You keep your files, contacts, calendars and more synchronized amongst your devices.
* :arrows_counterclockwise: **Share your Data** …by giving others access to the stuff you want them to see or to collaborate with.
* :rocket: **Expandable with dozens of Apps** ...like [Calendar](https://github.com/nextcloud/calendar), [Contacts](https://github.com/nextcloud/contacts), [Mail](https://github.com/nextcloud/mail) and all those you can discover in our [App Store](https://apps.nextcloud.com)
* :lock: **Security** with our encryption mechanisms, [HackerOne bounty program](https://hackerone.com/nextcloud) and two-factor authentification.
* :lock: **Security** with our encryption mechanisms, [HackerOne bounty program](https://hackerone.com/nextcloud) and two-factor authentication.
*You want to learn more about how you can use Nextcloud to access, share and protect your files, calendars, contacts, communication & more at home and at your Enterprise?* [**Learn about all our Features**](https://nextcloud.com/features).
[…learn more about how to get support for Nextcloud here!](https://nextcloud.com/support)
@@ -59,7 +60,7 @@ More information how to contribute: [https://nextcloud.com/contribute/](https://
Third-party components are handled as git submodules which have to be initialized first. So aside from the regular git checkout invoking `git submodule update --init` or a similar command is needed, for details see Git documentation.
Several apps by default included in regular releases like [firstrunwizard](https://github.com/nextcloud/firstrunwizard) or [gallery](https://github.com/nextcloud/gallery) are missing in `master` and have to be installed manually as required.
Several apps that are included by default in regular releases such as [firstrunwizard](https://github.com/nextcloud/firstrunwizard) or [gallery](https://github.com/nextcloud/gallery) are missing in `master` and have to be installed manually.
That aside Git checkouts can be handled the same as release archives.
"%1$s commented on %2$s":"%1$s het op %2$s kommentaar gelewer",
"{author} commented on {file}":"{outeur} het op {lêer} kommentaar gelewer",
"<strong>Comments</strong> for files":"<strong>Kommentare</strong> vir lêers",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Jy was genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Jy is genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"{user} mentioned you in a comment on “{file}”":"{gebruiker} het u in ’n kommentaar oor “{lêer}” genoem",
"Unknown user":"Onbekende gebruiker",
"A (now) deleted user mentioned you in a comment on “%s”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “%s” genoem",
"A (now) deleted user mentioned you in a comment on “{file}”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “{lêer}” genoem",
"%1$s mentioned you in a comment on “%2$s”":"%1$s het u in ’n kommentaar op “%2$s” genoem",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is."
"Files app plugin to add comments to files":"Lêertoepinprop om kommentaar op lêers te lewer",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s het u in ’n kommentaar op “%2$s” genoem"
"%1$s commented on %2$s":"%1$s het op %2$s kommentaar gelewer",
"{author} commented on {file}":"{outeur} het op {lêer} kommentaar gelewer",
"<strong>Comments</strong> for files":"<strong>Kommentare</strong> vir lêers",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Jy was genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Jy is genoem op “{lêer}”, in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"{user} mentioned you in a comment on “{file}”":"{gebruiker} het u in ’n kommentaar oor “{lêer}” genoem",
"Unknown user":"Onbekende gebruiker",
"A (now) deleted user mentioned you in a comment on “%s”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “%s” genoem",
"A (now) deleted user mentioned you in a comment on “{file}”":"’n (Nou) geskrapte gebruiker het u in ’n kommentaar op “{lêer}” genoem",
"%1$s mentioned you in a comment on “%2$s”":"%1$s het u in ’n kommentaar op “%2$s” genoem",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is."
"Files app plugin to add comments to files":"Lêertoepinprop om kommentaar op lêers te lewer",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Jy was genoem op \"%s\", in die kommentaar van 'n gebruiker wat intussen geskrap is.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s het u in ’n kommentaar op “%2$s” genoem"
"No comments yet, start the conversation!":"Все-още няма коментари, започни разговор!",
"No comments yet, start the conversation!":"Всеоще няма коментари, започнете разговор!",
"More comments …":"Още коментари...",
"Save":"Запазване",
"Allowed characters {count} of {max}":"Позволени символи {count} от {max}",
@@ -26,10 +26,7 @@ OC.L10N.register(
"<strong>Comments</strong> for files":"<strong>Коментари</strong> за файлове",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Бяхте споменат/а към “{file}”, в коментар от потребител, който вече е изтрит",
"{user} mentioned you in a comment on “{file}”":"{user} те спомена в коментар за “{file}”",
"Unknown user":"Непознат потребител",
"A (now) deleted user mentioned you in a comment on “%s”":"(Токущо) изтрит потребител те коментира в “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"(Токущо) изтрит потребител те спомена в коментар за “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s те спомена в коментар за “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит",
"%1$s mentioned you in a comment on “%2$s”":"%1$s те спомена в коментар за “%2$s”"
"No comments yet, start the conversation!":"Все-още няма коментари, започни разговор!",
"No comments yet, start the conversation!":"Всеоще няма коментари, започнете разговор!",
"More comments …":"Още коментари...",
"Save":"Запазване",
"Allowed characters {count} of {max}":"Позволени символи {count} от {max}",
@@ -24,10 +24,7 @@
"<strong>Comments</strong> for files":"<strong>Коментари</strong> за файлове",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Бяхте споменат/а към “{file}”, в коментар от потребител, който вече е изтрит",
"{user} mentioned you in a comment on “{file}”":"{user} те спомена в коментар за “{file}”",
"Unknown user":"Непознат потребител",
"A (now) deleted user mentioned you in a comment on “%s”":"(Токущо) изтрит потребител те коментира в “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"(Токущо) изтрит потребител те спомена в коментар за “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s те спомена в коментар за “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Бяхте споменат/а на “%s”, в коментар от потребител, който вече е изтрит",
"%1$s mentioned you in a comment on “%2$s”":"%1$s те спомена в коментар за “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentaris</strong> per arxius",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Has estat mencionat a \"{file}\" en un comentari d'un usuari que ja no existeix",
"{user} mentioned you in a comment on “{file}”":"{user} us ha nomenat en un comentari de “{file}”",
"Unknown user":"Usuari desconegut",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuari (ara) esborrat us ha nomenat en un comentari a “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuari (ara) esborrat us ha nomenat en un comentari de “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s us ha nomenat en un comentari a “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix",
"%1$s mentioned you in a comment on “%2$s”":"%1$s us ha nomenat en un comentari a “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentaris</strong> per arxius",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Has estat mencionat a \"{file}\" en un comentari d'un usuari que ja no existeix",
"{user} mentioned you in a comment on “{file}”":"{user} us ha nomenat en un comentari de “{file}”",
"Unknown user":"Usuari desconegut",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuari (ara) esborrat us ha nomenat en un comentari a “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuari (ara) esborrat us ha nomenat en un comentari de “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s us ha nomenat en un comentari a “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Has estat mencionat a \"%s\" en un comentari d'un usuari que ja no existeix",
"%1$s mentioned you in a comment on “%2$s”":"%1$s us ha nomenat en un comentari a “%2$s”"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Byli jste zmíněni v souboru “{file}”, v komentáři od uživatele, který byl později smazán",
"{user} mentioned you in a comment on “{file}”":"{user} vás zmínil(a) v komentáři u „{file}“",
"Files app plugin to add comments to files":"Zásuvný modul do aplikace Soubory pro přidávání komentářů k souborům",
"Unknown user":"Neznámý uživatel",
"A (now) deleted user mentioned you in a comment on “%s”":"(Nyní) už smazaný uživatel vás zmínil v komentáři na „%s“.",
"A (now) deleted user mentioned you in a comment on “{file}”":"Nyní už smazaný uživatel vás zmínil v komentáři u „{file}“",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vás zmínil(a) v komentáři u %2$s",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Byli jste zmíněni v „%s“, v komentáři od uživatele, který byl později smazán"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Byli jste zmíněni v „%s“, v komentáři od uživatele, který byl později smazán",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vás zmínil(a) v komentáři u %2$s"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Byli jste zmíněni v souboru “{file}”, v komentáři od uživatele, který byl později smazán",
"{user} mentioned you in a comment on “{file}”":"{user} vás zmínil(a) v komentáři u „{file}“",
"Files app plugin to add comments to files":"Zásuvný modul do aplikace Soubory pro přidávání komentářů k souborům",
"Unknown user":"Neznámý uživatel",
"A (now) deleted user mentioned you in a comment on “%s”":"(Nyní) už smazaný uživatel vás zmínil v komentáři na „%s“.",
"A (now) deleted user mentioned you in a comment on “{file}”":"Nyní už smazaný uživatel vás zmínil v komentáři u „{file}“",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vás zmínil(a) v komentáři u %2$s",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Byli jste zmíněni v „%s“, v komentáři od uživatele, který byl později smazán"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Byli jste zmíněni v „%s“, v komentáři od uživatele, který byl později smazán",
"%1$s mentioned you in a comment on “%2$s”":"%1$s vás zmínil(a) v komentáři u %2$s"
"<strong>Comments</strong> for files":"<strong>Kommentarer</strong> for filer",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du blev nævnt i \"{file}”, I en kommentar af en bruger der siden er blevet slettet",
"{user} mentioned you in a comment on “{file}”":"{user} nævnte dig i en kommentarer på \"{file}\"",
"Unknown user":"Ukendt bruger",
"A (now) deleted user mentioned you in a comment on “%s”":"En (nu) slettet bruger nævnte dig i en kommentarer på “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"En (nu) slettet bruger nævnte dig i en kommentarer på \"{file}\"",
"%1$s mentioned you in a comment on “%2$s”":"%1$s nævnte dig i en kommentarer på “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende",
"%1$s mentioned you in a comment on “%2$s”":"%1$s nævnte dig i en kommentarer på “%2$s”"
"<strong>Comments</strong> for files":"<strong>Kommentarer</strong> for filer",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du blev nævnt i \"{file}”, I en kommentar af en bruger der siden er blevet slettet",
"{user} mentioned you in a comment on “{file}”":"{user} nævnte dig i en kommentarer på \"{file}\"",
"Unknown user":"Ukendt bruger",
"A (now) deleted user mentioned you in a comment on “%s”":"En (nu) slettet bruger nævnte dig i en kommentarer på “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"En (nu) slettet bruger nævnte dig i en kommentarer på \"{file}\"",
"%1$s mentioned you in a comment on “%2$s”":"%1$s nævnte dig i en kommentarer på “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du blev nævnt i \"%s”, I en kommentar af en bruger der er blevet slettet efterfølgende",
"%1$s mentioned you in a comment on “%2$s”":"%1$s nævnte dig i en kommentarer på “%2$s”"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"{user} mentioned you in a comment on “{file}”":"{user} hat Dich in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu “{file}” erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"{user} mentioned you in a comment on “{file}”":"{user} hat Dich in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Dich in einem Kommentar zu “{file}” erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Du wurdest in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Dich in einem Kommentar zu “%2$s” erwähnt"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"{user} mentioned you in a comment on “{file}”":"{user} hat Sie in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu “{file}” erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt.",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt."
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"{file}\" von einem bereits gelöschten Nutzer erwähnt",
"{user} mentioned you in a comment on “{file}”":"{user} hat Sie in einem Kommentar zu “{file}” erwähnt",
"Files app plugin to add comments to files":"Ein Plugin für die Dateien-App zum Kommentieren von Dateien",
"Unknown user":"Unbekannter Benutzer",
"A (now) deleted user mentioned you in a comment on “%s”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu \"%s\" erwähnt",
"A (now) deleted user mentioned you in a comment on “{file}”":"Ein (nun) gelöschter Benutzer hat Sie in einem Kommentar zu “{file}” erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt.",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Sie wurden in einem Kommentar auf \"%s\" von einem bereits gelöschten Nutzer erwähnt",
"%1$s mentioned you in a comment on “%2$s”":"%1$s hat Sie in einem Kommentar zu “%2$s” erwähnt."
"<strong>Comments</strong> for files":"<strong>Comments</strong> for files",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"You were mentioned on “{file}”, in a comment by a user that has since been deleted",
"{user} mentioned you in a comment on “{file}”":"{user} mentioned you in a comment on “{file}”",
"Unknown user":"Unknown user",
"A (now) deleted user mentioned you in a comment on “%s”":"A (now) deleted user mentioned you in a comment on “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"A (now) deleted user mentioned you in a comment on “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mentioned you in a comment on “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"You were mentioned on “%s”, in a comment by a user that has since been deleted"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"You were mentioned on “%s”, in a comment by a user that has since been deleted",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mentioned you in a comment on “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comments</strong> for files",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"You were mentioned on “{file}”, in a comment by a user that has since been deleted",
"{user} mentioned you in a comment on “{file}”":"{user} mentioned you in a comment on “{file}”",
"Unknown user":"Unknown user",
"A (now) deleted user mentioned you in a comment on “%s”":"A (now) deleted user mentioned you in a comment on “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"A (now) deleted user mentioned you in a comment on “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mentioned you in a comment on “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"You were mentioned on “%s”, in a comment by a user that has since been deleted"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"You were mentioned on “%s”, in a comment by a user that has since been deleted",
"%1$s mentioned you in a comment on “%2$s”":"%1$s mentioned you in a comment on “%2$s”"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te han mencionado en \"{file}\", en un comentario de un usuario que después ha sido eliminado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Files app plugin to add comments to files":"Plugin de la app de Archivos para añadir comentarios a archivos.",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te han mencionado en \"{file}\", en un comentario de un usuario que después ha sido eliminado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Files app plugin to add comments to files":"Plugin de la app de Archivos para añadir comentarios a archivos.",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) eliminado, te mencionó en un comentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te han mencionado en \"%s\", en un comentario por un usuario que después ha sido eliminado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"Allowed characters {count} of {max}":"Caracteres permitidos {count} of {max}",
"Error occurred while retrieving comment with ID {id}":"Se produjo un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se ha producido un error al actualizar el comentario con id {id}",
"Error occurred while posting comment":"Se ha producido un error al publicar un comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
@@ -24,10 +25,9 @@ OC.L10N.register(
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> en archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Usted fue mencionado en “{file}”, en un comentario de un usuario que ya ha sido eliminado",
"{user} mentioned you in a comment on “{file}”":"{user} te ha mencionado en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un (now) usuario borrado te ha mencionado en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un (now) usuario borrado the ha mencionado en un comentario en “{file}”",
"Files app plugin to add comments to files":"Complemento de aplicación de archivos para agregar comentarios a los archivos.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te ha mencionado en un comentario en “%2$s”"
"Allowed characters {count} of {max}":"Caracteres permitidos {count} of {max}",
"Error occurred while retrieving comment with ID {id}":"Se produjo un error al recuperar el comentario con ID {id}",
"Error occurred while updating comment with id {id}":"Se ha producido un error al actualizar el comentario con id {id}",
"Error occurred while posting comment":"Se ha producido un error al publicar un comentario",
"_%n unread comment_::_%n unread comments_":["%n comentarios sin leer","%n comentarios sin leer"],
@@ -22,10 +23,9 @@
"%1$s commented on %2$s":"%1$s comentó en %2$s",
"{author} commented on {file}":"{author} comentó en {file}",
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> en archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Usted fue mencionado en “{file}”, en un comentario de un usuario que ya ha sido eliminado",
"{user} mentioned you in a comment on “{file}”":"{user} te ha mencionado en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un (now) usuario borrado te ha mencionado en un comentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un (now) usuario borrado the ha mencionado en un comentario en “{file}”",
"Files app plugin to add comments to files":"Complemento de aplicación de archivos para agregar comentarios a los archivos.",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te ha mencionado en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
"<strong>Comments</strong> for files":"<strong>Comentarios</strong> de los archivos",
"You were mentioned on “{file}”, in a comment by a user that has since been deleted":"Te mencionaron en \"{file}\", en un comentario de un usuario que ya ha sido borrado",
"{user} mentioned you in a comment on “{file}”":"{user} te mencionó en un comentario en “{file}”",
"Unknown user":"Usuario desconocido",
"A (now) deleted user mentioned you in a comment on “%s”":"Un usuario (ahora) borrado te mencionó en un commentario en “%s”",
"A (now) deleted user mentioned you in a comment on “{file}”":"Un usuario (ahora) borrado te mencionó en un commentario en “{file}”",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”",
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado"
"You were mentioned on “%s”, in a comment by a user that has since been deleted":"Te mencionaron en \"%s\", en un comentario de un usuario que ya ha sido borrado",
"%1$s mentioned you in a comment on “%2$s”":"%1$s te mencionó en un comentario en “%2$s”"
},"pluralForm":"nplurals=2; plural=(n != 1);"
}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.