View Issue Details

IDProjectCategoryView StatusLast Update
0000957PluginsNetworkpublic2012-01-11 17:48
Reporterpm_kan Assigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
Platformx86OSWindowsOS VersionXP SP3
Product Version2.0 
Summary0000957: Невозможно перейти в скрытые Samba-шары
DescriptionНевозможно перейти в скрытые Samba-шары по cd. Скрытые Samba-шары (browseable=no) не могут быть перечислены способом, используемым для перечисления скрытых Win-шар. Переход по cd <имя_шары> не отрабатывает, т.к. данных шар нет в списке.
Steps To Reproduce1. Создать на Samba-сервере шару с параметром browseable=no (Samba ver. 3.2.12)
2. В Far'е перейти на этот Samba-сервер, и попытаться зайти в шару используя cd.
Additional InformationПриложенный патч, проверяет существование шары (GetResourceInfo), если она не была найдена в списке.
TagsNo tags attached.

Activities

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;
 }
hidden_samba.patch (8,353 bytes)   

vskirdin

2009-06-30 18:46

administrator   bugnote:0003656

вот только не пойму причем тут плагин?
"net:блабла" - это плагин
"cd блабла" - это мимо кассы, т.е. ФАР сам, без помощи плагинов, справляется.

pm_kan

2009-07-01 05:30

reporter   bugnote:0003662

дело в том, что по net:\\server мы попадаем в список шар server'а, который является плагиновой панелью, поэтому по cd зовется SetDirectory из плагина, который отфутболивает в случае, если шары нет в списке.
net:\\server\share тоже не спасает, т.к. в настоящий момент это реализовано как "открыть список шар server, после чего переместить курсор на share".

vskirdin

2009-07-01 07:46

administrator   bugnote:0003663

правильно я понимаю, что "cd" делается из панели плагина (из списка шар)?
а... chdir как себя ведет?

pm_kan

2009-07-01 08:11

reporter   bugnote:0003664

> правильно я понимаю, что "cd" делается из панели плагина (из списка шар)?
да
> а... chdir как себя ведет?
 ╔════ Ошибка ════╗
 ║ Файл не найден ║
 ║ tmp ║
 ║ Продолжить ║
 ╚════════════════╝

pm_kan

2009-07-01 10:15

reporter   bugnote:0003667

в 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;
 }
hidden_samba_fix.patch (8,435 bytes)   

alexy

2012-01-10 21:46

administrator   bugnote:0008359

Не могу понять в чём проблема и зачем её чинить.
Как я понимаю cd шара в списке шар не работает, если шара не показана в этом списке, так?
Если так, то почему это этот cd вообще должен работать?

pm_kan

2012-01-11 17:48

reporter   bugnote:0008380

> Не могу понять в чём проблема и зачем её чинить.

Samba-шары с параметром browseable=no не обнаруживаются стандартными способами, но в них можно попасть указав полный путь в проводнике или в Far по `cd \\server\share` из файловой панели. Если гостевой доступ в данную шару запрещён, то проводник запрашивает имя/пароль, а Far запрашивает повышение привилегий, после чего рисует
 ╔════ Ошибка ═════╗
 ║ Доступ запрещён ║
 ╟─────────────────╢
 ║ { OK } ║
 ╚═════════════════╝
т. к. для входа с именем и паролем нужно использовать плагин.

> Как я понимаю cd шара в списке шар не работает, если шара не показана в этом списке, так?

Да.

> Если так, то почему это этот cd вообще должен работать?

Потому, что шара всё-таки существует и доступна (а простой переход через cd из файловых панелей не запрашивает имя/пароль).

Issue History

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