Przypadek ten wyszedł całkowicie przypadkowo ;) i rozumiem czemu wyszedł, ale zanim przejdę do tłumaczenia to zaprezentuje w czym problem. UWAGA: podczas naszej zabawy, nasz site będzie nie dostępny!! Potem to naprawimy ;)

Zaczynamy zabawę – powtarzajcie kroki:

  1. Otwórzcie stronę w WSS/MOSS (dowolną);
  2. Jeżeli macie na niej listy lub coś to otwórzcie je w kolejnych zakładkach – jeżeli nie macie list to otwórzcie 2-3 krotnie sobie Site Settings;
  3. Wejdźcie do ~site/_layouts/prjsetng.aspx (czyli Title, Descriptionm, and Icon);
  4. W pole Logo URL wpiszcie: http://blog.gutek.pl/images/01.png – nie przejmujcie się, że nie macie takiej ścieżki :)
  5. Kliknijcie OK;
  6. Wasze logo będzie wyglądać mniej więcej tak:
    error1
  7. Operacje powtórzcie dla URL: /../Images/01.png – wynik będzie taki sam;
  8. Możecie posprawdzać sobie to na innych otwartych stronach (za pomocą F5), zawsze będzie ten czerwony krzyżyk;
  9. Teraz :) w pole Logo URL wpiszcie: http://blog.gutek.pl/images/../Images/01.png – wynik będzie taki sam :)
  10. No to teraz skoro tyle rzeczy popróbowaliśmy, to wpiszcie ~/../Images/01.png :D

error2

Taki błąd będzie się wam pojawiał wszędzie na każdej stronie na danym site – czyli jak popełnicie taki błąd to naprawdę nic już z poziomu strony oraz SharePoint Designer nie zrobicie :D

Teraz, dlaczego to w ogólne występuje

Geneza błędu jest dość prosta, skoro jesteśmy w Root site ~ to jak chcemy wyjść wyżej .. to się to nam nie uda. Jest to typowy błąd .NET i chyba dość zrozumiały.

Dlaczego więc http://blog.gutek.pl/images/../Images/01.png działało? Dlatego iż z Root wchodzimy do Images następnie z niego wychodzimy .. i wchodzimy ponownie. Czyli http://blog.gutek.pl/images/../../Images/01.png wywoła ten sam błąd co ~/../Images/01.png

Rozwiązanie

No dobrze, bo teraz macie niedziałający site ;) trzeba się nim zająć. Odpalcie SQL Management studio i odpalcie taki oto skrypt na waszej bazie contentowej:

DECLARE @fullUrl NVARCHAR(120)
SET @fullUrl = 'sites/ep/teet'
 
UPDATE Webs SET
      SiteLogoUrl = NULL,
      SiteLogoDescription = NULL
WHERE
      FullUrl = @fullUrl
 

Zmięcie SET @fullUrl na wasz adres i odpalcie skrypt.

Problem rozwiązany :)

Podsumowanie

Osobiście uważam, że jest to bug SharePoint’a, ze względu na to iż każdy administrator site może to popsuć, ale tylko i wyłącznie użytkownik z prawami dostępu do bazy danych to naprawić. IMHO, powinna być jakaś walidacja tego URL przed jego zapisaniem do bazy danych.

Aktualizacja 2009-01-08 (nr 1)

Tak jak Waldek wspomniał, da się to zrobić za pomocą kodu, np.:

using (SPSite site = new SPSite("http://crabro/sites/ep/test/tttt/"))
{
    using (SPWeb web = site.OpenWeb())
    {
        web.SiteLogoUrl = null;
        web.SiteLogoDescription = null;
 
        web.Update();
    }
}

Postaram się dzisiaj jak będę miał trochę wolnego czasu napisać extension do STSAdm by każdy mógł z tego korzystać :)

Aktualizacja 2009-01-08 (nr 2)

Udało się :) komendę STSADM można pobrać z tąd:

SetSiteLogoUrl.zip (3.99 kb)

6 KOMENTARZE

  1. @Waldek

    Szczerze nie probowalem, ale moze nie zadzialac :/ dla zabawy wywalilismy kontrolke z master odpowiedzialna za logo i site wciaz lezal :( Czyli gdzies podczas ladowania jakis danych blad zostal wywolywany – tego juz tak dokladnie nie sprawdzilem gdzie.

    Co do API to sprawdze jutro dla zabawy.

    co do licencji to masz racje, ale ja jednak czasami lubie tam pogrzebac, jednak trzeba byc swiadomy ograniczen narzuconych ze strony MS.

    Takze tak jak ja, jako programista jestem wstanie napisac sobie rozwiazanie naprawiajace strone, tak jako uzytkownik raczej jestem bezradny. Jako administrator (stricte) bez komendy w stsadm tez bedziemy bezradni.

    Wiec jezeli sie da przez API, to napisze jutro extension do stsadm i go opublikuje.

    Dzieki za zwrocenie uwagi z ta licencja.

    No i gratuluje nominacji na MVP!! bedziesz w Seattle?

    Gutek

  2. @Gutek

    Dzieki za gratulacje :D

    API powinno dzialac. Powinienes byc w stanie dostac referencje do SPWeb nawet jesli jedna strona albo Master Page nie dzialaja poprawnie. Masz racje: jako uzytkownik/SP Designer power user nie masz zadnych szans. Slabo, ze takie prozaiczne bledy powoduja wywalenie SharePointa. Z drugiej strony jest wiele innych miejsc, na ktorych ASP.NET sie moze wylozyc, wiec nieobecnosc jednej kontrolki nie powinna dziwic.

    Jak nic sie nie zmieni to bede w Seattle. Kulek do paintballa jeszcze nie zamowilem, ale postaram sie o extra porcje ;-)

    Pozdrowienia,

    Waldek

  3. @Waldek

    Dziala super z API – kod w pierwszej aktualizacji, zas STSADM extension w drugiej :) (na dole postu)

    Dzieki za pomysl :)

    Hehe dobrze wam, bedziecie sie niezle bawic, ja mam w kat. C# wiec raczej bedziemy siedziec na sali ‘wykladowej’ ;) Ale mam nadzieje, ze na dobre lokalne piwo uda nam sie wyskoczyc :)

    Pozdrawiam,
    Gutek

Comments are closed.