fix(files_external/SMB): Use 'null' explicitly for no workgroup#61622
Open
oblivioncth wants to merge 1 commit into
Open
fix(files_external/SMB): Use 'null' explicitly for no workgroup#61622oblivioncth wants to merge 1 commit into
oblivioncth wants to merge 1 commit into
Conversation
d107097 to
b919544
Compare
Robin Appleman's SMB library is designed so that 'null' is to be used
when no explicit workgroup is set:
final class BasicAuth implements IAuth {
/** @var string */
private $username;
/** @var string|null */
private $workgroup;
/** @var string */
private $password;
//...
However, it previously was loose with its checks and would still treat
any falsy value (e.g. an empty string) as "not specified" when forming
arguments for the various underlying utilities, such as `smbclient`.
icewind/SMB@4a93467905 updated it's handling to be more strict and as
such will now treat empty strings as distinct from null values for
workgroups. An empty value for workgroup often doesn't make sense,
unless the backend tool happens to convert it to "WORKGROUP". In the
case of the `smbclient` utility, passing an empty string for the
$workgroup paramters results in `-W ''` being used which is invalid
syntax and so the invocation fails resulting in the user seeing an
`[Icewind\SMB\Exception\ConnectionRefusedException]` error. Therefore,
it is important to always pass 'null' to this constructor for $workgroup
when there isn't one.
Most paths in the 'files_external' app already handle this correctly,
but this now altered path originally just took the raw value from the
app backend and passed it as-is. Assuming the user left the "Domain"
box empty in the frontend, this would be an empty string. Now the
the SMB library's interface is correctly honored in that case.
It's arguable that the SMB library should simply be updated to
formally accept '' as a valid input meaning "no workgroup", restoring
the old behavior in a canonical fashion, as there is almost no
situation where one would want to pass an empty string and have it
mean anything else; but regardless, there is no harm in being more
explicit on the nextcloud/server side as well.
Fixes nextcloud#58445.
Signed-off-by: Christian Heimlich <chris@pcserenity.com>
b919544 to
9d16cbb
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Robin Appleman's SMB library is designed so that 'null' is to be used when no explicit workgroup is set:
However, it previously was loose with its checks and would still treat any falsy value (e.g. an empty string) as "not specified" when forming arguments for the various underlying utilities, such as
smbclient.icewind/SMB@4a93467905 updated it's handling to be more strict and as such will now treat empty strings as distinct from null values for workgroups. An empty value for workgroup often doesn't make sense, unless the backend tool happens to convert it to "WORKGROUP". In the case of the
smbclientutility, passing an empty string for the $workgroup paramters results in-W ''being used which is invalid syntax and so the invocation fails resulting in no connection being made and the user seeing an inaccurate[Icewind\SMB\Exception\ConnectionRefusedException]error. Therefore, it is important to always pass 'null' to this constructor for $workgroup when there isn't one.Most paths in the 'files_external' app already handle this correctly, but this now altered path originally just took the raw value from the app backend and passed it as-is. Assuming the user left the "Domain" box empty in the frontend, this would be an empty string. Now the the SMB library's interface is correctly honored in that case.
It's arguable that the SMB library should simply be updated to formally accept '' as a valid input meaning "no workgroup", restoring the old behavior in a canonical fashion, as there is almost no situation where one would want to pass an empty string and have it mean anything else; but regardless, there is no harm in being more explicit on the nextcloud/server side as well.
Details
Just to cover all bases, this should be all of the uses of
BasicAuth().Corrected Path:
server/apps/files_external/lib/Lib/Backend/SMB.php
Lines 71 to 74 in a982b6c
Kerberos fallback path:
server/apps/files_external/lib/Lib/Backend/SMB.php
Lines 92 to 111 in a982b6c
Seems to never result in an empty workgroup.
Primary connection path:
server/apps/files_external/lib/Lib/Storage/SMB.php
Lines 82 to 84 in a982b6c
This is the only one possibly worth making further changes to. It's mostly fine as
splitUser()will correctly returnnullfor the result that goes into$workgroupif there is no workgroup separator; however if a separator exists but with no value after it (e.g.\\useror/user) it will return an array with an empty string, which will get placed into$workgroup. Since that is an invalid string for specifying workgroup/user it's possible that such strings are rejected at some point earlier before they even reach this function, and if not, I'm not sure this is the correct place to handle invalid input like that. Though, it may not hurt to handle that case here anyway just to be safe (i.e. inspect the exploded array and swap''fornull.server/apps/files_external/lib/Lib/Storage/SMB.php
Lines 126 to 134 in a982b6c
Thoughts?
Otherwise, the SMB library should probably be updated to throw some other kind of error when "smbclient" exits with an error, instead of "Connection Refused". Separately it could be made more robust against questionable arguments like a blank WORKGROUP (e.g. also defaulting
''to "WORKGROUP" or emitting a warning).Checklist
3. to review, feature component)stable32)AI (if applicable)