View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0000957 | Plugins | Network | public | 2009-06-29 15:48 | 2012-01-11 17:48 |
Reporter | pm_kan | Assigned To | |||
Priority | normal | Severity | minor | Reproducibility | always |
Status | new | Resolution | open | ||
Platform | x86 | OS | Windows | OS Version | XP SP3 |
Product Version | 2.0 | ||||
Summary | 0000957: Невозможно перейти в скрытые Samba-шары | ||||
Description | Невозможно перейти в скрытые Samba-шары по cd. Скрытые Samba-шары (browseable=no) не могут быть перечислены способом, используемым для перечисления скрытых Win-шар. Переход по cd <имя_шары> не отрабатывает, т.к. данных шар нет в списке. | ||||
Steps To Reproduce | 1. Создать на Samba-сервере шару с параметром browseable=no (Samba ver. 3.2.12) 2. В Far'е перейти на этот Samba-сервер, и попытаться зайти в шару используя cd. | ||||
Additional Information | Приложенный патч, проверяет существование шары (GetResourceInfo), если она не была найдена в списке. | ||||
Tags | No tags attached. | ||||
2009-06-29 15:48
|
hidden_samba.patch (8,353 bytes)
Index: NetClass.cpp =================================================================== --- NetClass.cpp (revision 3202) +++ NetClass.cpp (working copy) @@ -897,110 +897,130 @@ if (AnsiDir [1] == _T('/')) AnsiDir [1] = _T('\\'); - for (unsigned I=0;I<NetList.Count();I++) + NETRESOURCE *foundResPtr=NULL; + NETRESOURCE nr; + NetResourceList::InitNetResource (nr); + + for (unsigned I=0;!foundResPtr&&(I<NetList.Count());I++) { TCHAR RemoteName[NM]; GetRemoteName(&NetList[I],RemoteName); if (FSF.LStricmp(AnsiDir,RemoteName)==0) + foundResPtr=&NetList[I]; + } + if (PCurResource && !foundResPtr){ + TCHAR HiddenDir[NM]; + HiddenDir[0]=_T('\0'); + if ((AnsiDir[0]!=_T('\\'))||(AnsiDir[1]!=_T('\\'))){ + lstrcpy(HiddenDir, PCurResource->lpRemoteName); + if (lstrlen(HiddenDir)<NM-1) + FSF.AddEndSlash(HiddenDir); + } + if (lstrlen(AnsiDir)<NM-lstrlen(HiddenDir)){ + lstrcat(HiddenDir, AnsiDir); + if (GetResourceInfo(HiddenDir,&nr)) + foundResPtr=&nr; + } + } + if (foundResPtr) + { + if (CheckFavoriteItem(foundResPtr)) { - if (CheckFavoriteItem(&NetList[I])) - { - NetResourceList::CopyNetResource (CurResource, NetList [I]); - PCurResource = &CurResource; - //RootResources.Push (CurResource); + NetResourceList::CopyNetResource (CurResource, *foundResPtr); + PCurResource = &CurResource; + //RootResources.Push (CurResource); - return TRUE; - } - if ((NetList[I].dwUsage & RESOURCEUSAGE_CONTAINER)==0 && - (NetList[I].dwType & RESOURCETYPE_DISK) && - NetList[I].lpRemoteName!=NULL) - { - if (IsFind) - return(FALSE); - TCHAR NewDir[NM],LocalName[NM]; - GetLocalName(NetList[I].lpRemoteName,LocalName); - if (*LocalName) - if(IsReadable(LocalName)) - lstrcpy(NewDir,LocalName); - else + return TRUE; + } + if ((foundResPtr->dwUsage & RESOURCEUSAGE_CONTAINER)==0 && + (foundResPtr->dwType & RESOURCETYPE_DISK) && + foundResPtr->lpRemoteName!=NULL) + { + if (IsFind) + return(FALSE); + TCHAR NewDir[NM],LocalName[NM]; + GetLocalName(foundResPtr->lpRemoteName,LocalName); + if (*LocalName) + if(IsReadable(LocalName)) + lstrcpy(NewDir,LocalName); + else + { + Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, + NULL, (const TCHAR **) GetMsg (MError), 0, 0); + return TRUE; + } + else + { + BOOL ConnectError = FALSE; + lstrcpy(NewDir,foundResPtr->lpRemoteName); + CharToOEM(NewDir,NewDir); + if (IsExplicit) { - Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, - NULL, (const TCHAR **) GetMsg (MError), 0, 0); - return TRUE; + if (!AddConnectionExplicit (foundResPtr) || !IsReadable (NewDir)) + ConnectError = TRUE; } - else - { - BOOL ConnectError = FALSE; - lstrcpy(NewDir,NetList[I].lpRemoteName); - CharToOEM(NewDir,NewDir); - if (IsExplicit) - { - if (!AddConnectionExplicit (&NetList [I]) || !IsReadable (NewDir)) + else { + if (!IsReadable(NewDir)) + if (!AddConnection(foundResPtr) || !IsReadable (NewDir)) ConnectError = TRUE; - } - else { - if (!IsReadable(NewDir)) - if (!AddConnection(&NetList[I]) || !IsReadable (NewDir)) - ConnectError = TRUE; - } - if (ConnectError) - { - DWORD res = GetLastError(); - if(!IsExplicit) - if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_INVALID_HANDLE) - ConnectError = !((AddConnectionFromFavorites(&NetList[I]) || - AddConnectionExplicit(&NetList[I])) && IsReadable (NewDir)); - if(ConnectError) - { - ChangeDirSuccess = FALSE; - if (GetLastError() != ERROR_CANCELLED) - Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, - NULL, (const TCHAR **) GetMsg (MError), 0, 0); - return TRUE; - } - } } + if (ConnectError) + { + DWORD res = GetLastError(); + if(!IsExplicit) + if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_INVALID_HANDLE) + ConnectError = !((AddConnectionFromFavorites(foundResPtr) || + AddConnectionExplicit(foundResPtr)) && IsReadable (NewDir)); + if(ConnectError) + { + ChangeDirSuccess = FALSE; + if (GetLastError() != ERROR_CANCELLED) + Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, + NULL, (const TCHAR **) GetMsg (MError), 0, 0); + return TRUE; + } + } + } #ifndef UNICODE - Info.Control(this,FCTL_CLOSEPLUGIN,NewDir); + Info.Control(this,FCTL_CLOSEPLUGIN,NewDir); #else - Info.Control(this,FCTL_CLOSEPLUGIN,0,(LONG_PTR)NewDir); + Info.Control(this,FCTL_CLOSEPLUGIN,0,(LONG_PTR)NewDir); #endif - return(TRUE); - } - if (IsExplicit?!AddConnectionExplicit(&NetList[I]):!IsResourceReadable (NetList [I])) + return(TRUE); + } + if (IsExplicit?!AddConnectionExplicit(foundResPtr):!IsResourceReadable (*foundResPtr)) + { + int res = GetLastError(); + if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_LOGON_TYPE_NOT_GRANTED) + ChangeDirSuccess = IsExplicit?FALSE:(AddConnectionFromFavorites(foundResPtr) || AddConnectionExplicit(foundResPtr)); + else + ChangeDirSuccess = FALSE; + if(!ChangeDirSuccess) { - int res = GetLastError(); - if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_LOGON_TYPE_NOT_GRANTED) - ChangeDirSuccess = IsExplicit?FALSE:(AddConnectionFromFavorites(&NetList[I]) || AddConnectionExplicit(&NetList[I])); - else - ChangeDirSuccess = FALSE; - if(!ChangeDirSuccess) - { - if (GetLastError() != ERROR_CANCELLED) - Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, - NULL, (const TCHAR **) GetMsg (MError), 0, 0); - return FALSE; - } + if (GetLastError() != ERROR_CANCELLED) + Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, + NULL, (const TCHAR **) GetMsg (MError), 0, 0); + return FALSE; } - NetResourceList::CopyNetResource (CurResource, NetList [I]); - PCurResource = &CurResource; - if (!IsMSNetResource (CurResource)) - { + } + NetResourceList::CopyNetResource (CurResource, *foundResPtr); + PCurResource = &CurResource; + if (!IsMSNetResource (CurResource)) + { #ifdef NETWORK_LOGGING - LogData(_T("Resource is not MSN")); - LogNetResource(CurResource); + LogData(_T("Resource is not MSN")); + LogNetResource(CurResource); #endif - RootResources.Push (CurResource); - } + RootResources.Push (CurResource); + } #ifdef NETWORK_LOGGING - else - { - LogData(_T("Resource is MSN")); - LogNetResource(CurResource); - } + else + { + LogData(_T("Resource is MSN")); + LogNetResource(CurResource); + } #endif - return(TRUE); - } + return(TRUE); } return FALSE; } |
|
вот только не пойму причем тут плагин? "net:блабла" - это плагин "cd блабла" - это мимо кассы, т.е. ФАР сам, без помощи плагинов, справляется. |
|
дело в том, что по net:\\server мы попадаем в список шар server'а, который является плагиновой панелью, поэтому по cd зовется SetDirectory из плагина, который отфутболивает в случае, если шары нет в списке. net:\\server\share тоже не спасает, т.к. в настоящий момент это реализовано как "открыть список шар server, после чего переместить курсор на share". |
|
правильно я понимаю, что "cd" делается из панели плагина (из списка шар)? а... chdir как себя ведет? |
|
> правильно я понимаю, что "cd" делается из панели плагина (из списка шар)? да > а... chdir как себя ведет? ╔════ Ошибка ════╗ ║ Файл не найден ║ ║ tmp ║ ║ Продолжить ║ ╚════════════════╝ |
|
в hidden_samba.patch возможны утечки памяти: не освобождались строковые ресурсы (nr, если был переход в скрытую шару). Исправлено в hidden_samba_fix.patch (после получения данные кладутся в NetList, а затем происходит освобождение выделенной памяти) |
2009-07-01 10:15
|
hidden_samba_fix.patch (8,435 bytes)
Index: NetClass.cpp =================================================================== --- NetClass.cpp (revision 3204) +++ NetClass.cpp (working copy) @@ -897,110 +897,133 @@ if (AnsiDir [1] == _T('/')) AnsiDir [1] = _T('\\'); - for (unsigned I=0;I<NetList.Count();I++) + NETRESOURCE *foundResPtr=NULL; + NETRESOURCE nr; + NetResourceList::InitNetResource (nr); + + for (unsigned I=0;!foundResPtr&&(I<NetList.Count());I++) { TCHAR RemoteName[NM]; GetRemoteName(&NetList[I],RemoteName); if (FSF.LStricmp(AnsiDir,RemoteName)==0) + foundResPtr=&NetList[I]; + } + if (PCurResource && !foundResPtr){ + TCHAR HiddenDir[NM]; + HiddenDir[0]=_T('\0'); + if ((AnsiDir[0]!=_T('\\'))||(AnsiDir[1]!=_T('\\'))){ + lstrcpy(HiddenDir, PCurResource->lpRemoteName); + if (lstrlen(HiddenDir)<NM-1) + FSF.AddEndSlash(HiddenDir); + } + if (lstrlen(AnsiDir)<NM-lstrlen(HiddenDir)){ + lstrcat(HiddenDir, AnsiDir); + if (GetResourceInfo(HiddenDir,&nr)){ + NetList.Push(nr); + foundResPtr=NetList.Top(); + NetResourceList::DeleteNetResource (nr); + } + } + } + if (foundResPtr) + { + if (CheckFavoriteItem(foundResPtr)) { - if (CheckFavoriteItem(&NetList[I])) - { - NetResourceList::CopyNetResource (CurResource, NetList [I]); - PCurResource = &CurResource; - //RootResources.Push (CurResource); + NetResourceList::CopyNetResource (CurResource, *foundResPtr); + PCurResource = &CurResource; + //RootResources.Push (CurResource); - return TRUE; - } - if ((NetList[I].dwUsage & RESOURCEUSAGE_CONTAINER)==0 && - (NetList[I].dwType & RESOURCETYPE_DISK) && - NetList[I].lpRemoteName!=NULL) - { - if (IsFind) - return(FALSE); - TCHAR NewDir[NM],LocalName[NM]; - GetLocalName(NetList[I].lpRemoteName,LocalName); - if (*LocalName) - if(IsReadable(LocalName)) - lstrcpy(NewDir,LocalName); - else + return TRUE; + } + if ((foundResPtr->dwUsage & RESOURCEUSAGE_CONTAINER)==0 && + (foundResPtr->dwType & RESOURCETYPE_DISK) && + foundResPtr->lpRemoteName!=NULL) + { + if (IsFind) + return(FALSE); + TCHAR NewDir[NM],LocalName[NM]; + GetLocalName(foundResPtr->lpRemoteName,LocalName); + if (*LocalName) + if(IsReadable(LocalName)) + lstrcpy(NewDir,LocalName); + else + { + Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, + NULL, (const TCHAR **) GetMsg (MError), 0, 0); + return TRUE; + } + else + { + BOOL ConnectError = FALSE; + lstrcpy(NewDir,foundResPtr->lpRemoteName); + CharToOEM(NewDir,NewDir); + if (IsExplicit) { - Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, - NULL, (const TCHAR **) GetMsg (MError), 0, 0); - return TRUE; + if (!AddConnectionExplicit (foundResPtr) || !IsReadable (NewDir)) + ConnectError = TRUE; } - else - { - BOOL ConnectError = FALSE; - lstrcpy(NewDir,NetList[I].lpRemoteName); - CharToOEM(NewDir,NewDir); - if (IsExplicit) - { - if (!AddConnectionExplicit (&NetList [I]) || !IsReadable (NewDir)) + else { + if (!IsReadable(NewDir)) + if (!AddConnection(foundResPtr) || !IsReadable (NewDir)) ConnectError = TRUE; - } - else { - if (!IsReadable(NewDir)) - if (!AddConnection(&NetList[I]) || !IsReadable (NewDir)) - ConnectError = TRUE; - } - if (ConnectError) - { - DWORD res = GetLastError(); - if(!IsExplicit) - if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_INVALID_HANDLE) - ConnectError = !((AddConnectionFromFavorites(&NetList[I]) || - AddConnectionExplicit(&NetList[I])) && IsReadable (NewDir)); - if(ConnectError) - { - ChangeDirSuccess = FALSE; - if (GetLastError() != ERROR_CANCELLED) - Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, - NULL, (const TCHAR **) GetMsg (MError), 0, 0); - return TRUE; - } - } } + if (ConnectError) + { + DWORD res = GetLastError(); + if(!IsExplicit) + if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_INVALID_HANDLE) + ConnectError = !((AddConnectionFromFavorites(foundResPtr) || + AddConnectionExplicit(foundResPtr)) && IsReadable (NewDir)); + if(ConnectError) + { + ChangeDirSuccess = FALSE; + if (GetLastError() != ERROR_CANCELLED) + Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, + NULL, (const TCHAR **) GetMsg (MError), 0, 0); + return TRUE; + } + } + } #ifndef UNICODE - Info.Control(this,FCTL_CLOSEPLUGIN,NewDir); + Info.Control(this,FCTL_CLOSEPLUGIN,NewDir); #else - Info.Control(this,FCTL_CLOSEPLUGIN,0,(LONG_PTR)NewDir); + Info.Control(this,FCTL_CLOSEPLUGIN,0,(LONG_PTR)NewDir); #endif - return(TRUE); - } - if (IsExplicit?!AddConnectionExplicit(&NetList[I]):!IsResourceReadable (NetList [I])) + return(TRUE); + } + if (IsExplicit?!AddConnectionExplicit(foundResPtr):!IsResourceReadable (*foundResPtr)) + { + int res = GetLastError(); + if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_LOGON_TYPE_NOT_GRANTED) + ChangeDirSuccess = IsExplicit?FALSE:(AddConnectionFromFavorites(foundResPtr) || AddConnectionExplicit(foundResPtr)); + else + ChangeDirSuccess = FALSE; + if(!ChangeDirSuccess) { - int res = GetLastError(); - if (res == ERROR_INVALID_PASSWORD || res == ERROR_LOGON_FAILURE || res == ERROR_ACCESS_DENIED || res == ERROR_LOGON_TYPE_NOT_GRANTED) - ChangeDirSuccess = IsExplicit?FALSE:(AddConnectionFromFavorites(&NetList[I]) || AddConnectionExplicit(&NetList[I])); - else - ChangeDirSuccess = FALSE; - if(!ChangeDirSuccess) - { - if (GetLastError() != ERROR_CANCELLED) - Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, - NULL, (const TCHAR **) GetMsg (MError), 0, 0); - return FALSE; - } + if (GetLastError() != ERROR_CANCELLED) + Info.Message (Info.ModuleNumber, FMSG_WARNING | FMSG_ERRORTYPE | FMSG_MB_OK | FMSG_ALLINONE, + NULL, (const TCHAR **) GetMsg (MError), 0, 0); + return FALSE; } - NetResourceList::CopyNetResource (CurResource, NetList [I]); - PCurResource = &CurResource; - if (!IsMSNetResource (CurResource)) - { + } + NetResourceList::CopyNetResource (CurResource, *foundResPtr); + PCurResource = &CurResource; + if (!IsMSNetResource (CurResource)) + { #ifdef NETWORK_LOGGING - LogData(_T("Resource is not MSN")); - LogNetResource(CurResource); + LogData(_T("Resource is not MSN")); + LogNetResource(CurResource); #endif - RootResources.Push (CurResource); - } + RootResources.Push (CurResource); + } #ifdef NETWORK_LOGGING - else - { - LogData(_T("Resource is MSN")); - LogNetResource(CurResource); - } + else + { + LogData(_T("Resource is MSN")); + LogNetResource(CurResource); + } #endif - return(TRUE); - } + return(TRUE); } return FALSE; } |
|
Не могу понять в чём проблема и зачем её чинить. Как я понимаю cd шара в списке шар не работает, если шара не показана в этом списке, так? Если так, то почему это этот cd вообще должен работать? |
|
> Не могу понять в чём проблема и зачем её чинить. Samba-шары с параметром browseable=no не обнаруживаются стандартными способами, но в них можно попасть указав полный путь в проводнике или в Far по `cd \\server\share` из файловой панели. Если гостевой доступ в данную шару запрещён, то проводник запрашивает имя/пароль, а Far запрашивает повышение привилегий, после чего рисует ╔════ Ошибка ═════╗ ║ Доступ запрещён ║ ╟─────────────────╢ ║ { OK } ║ ╚═════════════════╝ т. к. для входа с именем и паролем нужно использовать плагин. > Как я понимаю cd шара в списке шар не работает, если шара не показана в этом списке, так? Да. > Если так, то почему это этот cd вообще должен работать? Потому, что шара всё-таки существует и доступна (а простой переход через cd из файловых панелей не запрашивает имя/пароль). |
Date Modified | Username | Field | Change |
---|---|---|---|
2009-06-29 15:48 | pm_kan | New Issue | |
2009-06-29 15:48 | pm_kan | File Added: hidden_samba.patch | |
2009-06-30 18:46 | vskirdin | Note Added: 0003656 | |
2009-07-01 05:30 | pm_kan | Note Added: 0003662 | |
2009-07-01 07:46 | vskirdin | Note Added: 0003663 | |
2009-07-01 08:11 | pm_kan | Note Added: 0003664 | |
2009-07-01 10:15 | pm_kan | Note Added: 0003667 | |
2009-07-01 10:15 | pm_kan | File Added: hidden_samba_fix.patch | |
2012-01-10 21:46 | alexy | Note Added: 0008359 | |
2012-01-10 21:47 | alexy | Status | new => feedback |
2012-01-11 17:48 | pm_kan | Note Added: 0008380 | |
2012-01-11 17:48 | pm_kan | Status | feedback => new |