RSS
sobota, 17 października 2015
Poczta Polska – Śledzenie Przesyłek w .NET / C#

Całkiem przypadkiem, czekając na przesyłkę, zauważyłem na stronie Poczty Polskiej usługę webservice umożliwiającą sprawdzenie, co się dzieje z moją paczuszką. Jako, że mam zacięcie programistyczne postanowiłem szybko sprawdzić jak to działa.

 

Korzystanie z serwisu nie jest skomplikowane. Wszystko zaczęło działać po drugiej kompilacji (to dużo biorąc pod uwagę jak prosty był kod, który napisałem).

 

 

using System;
using PPSledzenie.PocztaPolskaSledzenieSrv;

namespace PPSledzenie
{
    class Program
    {
        static void Main(string[] args)
        {
            SledzeniePortTypeClient ppService = new SledzeniePortTypeClient();
            ppService.ClientCredentials.UserName.UserName = "sledzenie";
            ppService.ClientCredentials.UserName.Password = "PPSA";
            Przesylka paczkaSzczegoły = ppService.sprawdzPrzesylke("testk-1"); //testowy numer przesylki
        }
    }
}

 

Na początku nie mogłem się wcale pod serwis podłączyć („Add Service Reference…” – end point: https://tt.poczta-polska.pl/Sledzenie/services/Sledzenie?wsdl). Mój błąd.

Zapomniałem, że jestem za Proxy i konieczna jest nieznaczna modyfikacja pliku konfiguracyjnego:

 

 20151017_222906

 

Po tej drobnej zmianie nie było już problemu z dodaniem referencji. Niestety po pierwszej kompilacji, próba odczytu danych przesyłki zakończyła się wystąpienie wyjątku:

 

System.ServiceModel.FaultException was unhandled
  HResult=-2146233087
  Message=WSDoAllReceiver: Incoming message does not contain required Security header
  ...

 

Konieczna była wiec kolejna modyfikacja pliku konfiguracyjnego. Wprowadzone zmiany zaznaczyłem na czerowno.

 

20151017_223239

 

Mimo mojego „czujnego oka” przesyłka priorytetowa nie dotarła dzisiaj (piątek), a ponieważ w weekendy poczta lokalna nie pracuje musze czekać do poniedziałku.

 

A… jeśli przypadkiem natkniecie się na poniższy wyjątek:

 

System.ServiceModel.FaultException was unhandled
  HResult=-2146233087
  Message=WSDoAllReceiver: security processing failed
...

 

Zanim zaczniecie rwać sobie włosy z głowy, sprawdźcie czy nazwa użytkownika i hasło są poprawne :)

 

Na poniższym screenie widać przykładowe dane o przesyłce (debug).

 

Poczta Polska – Śledzenie Przesyłek w .NET / C#

 

Aby sprawdzić, co dokładnie oferuje web service, polecam zapoznanie się z dokumentacją (otwiera sie w nowym oknie).

 

www.poczta-polska.pl/pliki/webservices/Metody i struktury uslugi sieciowej Poczty Polskiej SA.pdf

środa, 14 października 2015
Oracle - bezpieczeństwo na poziomie wierszy (ang. row level security)

 

Jeśli masz dostęp do edycji Enterprise Oracle, masz również możliwość wykorzystania mechanizmu VPD – Virtual Private Database, który może być użyty do implementacji bezpieczeństwa na poziomie wierszy (ang. row level security).

 

Bezpieczeństwo oparte o VPD działa w oparciu o dodawanie, do każdego wykonywanego polecenia SQL, predykatu zdefiniowanego w odpowiedniej funkcji jak pokazuje to poniższy przykład:

 

select /*+ zapytanie rls */ * from ( 
    select /*+ nasze zapytanie */ ... from TABELA
    where WARTOSC = 42 )
where rls_policy.FUNKCJA_NA_TABELI = 'true'

 

Podstawowe elementy mechanizmu VPD to:

 

1. Kontekst (ang. Context) – specyficzny dla danej aplikacji, możliwy do ustawianie tylko i wyłącznie za pomocą specyficznej procedury.
2. Procedura Kontekstu (ang. Context Procedure) – procedura definiująca pary klucz – wartość dla danego kontekstu.
3. Polisa (ang. Policy) – określa, jakiego obiektu / tabeli będą dotyczyły restrykcje.
4. Funkcja Polisy (ang. Policy Function) – zwraca definicje predykaty, który powinien być dodany do każdego polecenia SQL.

 

A jak to wygląda w praktyce?

 

Kontekst

 

Pierwsza rzeczą, której potrzebujemy, jest obiekt kontekstu. Za pomocą klauzuli USING określamy zaufany obiekt, który będzie mógł modyfikować pary klucz – wartość kontekstu.

 

CREATE CONTEXT USER_CTX1 USING SECURITY_PACKAGE1;
/

 

Procedura Kontekstu

 

Następnym elementem jest procedura kontekstu odpowiadająca za ustawianie odpowiednich wartości utworzonego właśnie obiektu kontekstu.

 

CREATE OR REPLACE PACKAGE SECURITY_PACKAGE1
IS

   PROCEDURE SET_USER_CTX (ps_key IN VARCHAR2, ps_val IN VARCHAR2);

END SECURITY_PACKAGE1;
/

CREATE OR REPLACE PACKAGE BODY SECURITY_PACKAGE1
IS

   GS_USER_CTX_VNAME VARCHAR2(30) := 'USER_CTX1';
   
   PROCEDURE SET_USER_CTX (ps_key IN VARCHAR2, ps_val IN VARCHAR2)
   IS
   BEGIN
      DBMS_SESSION.SET_CONTEXT (GS_USER_CTX_VNAME, ps_key, ps_val);
   END SET_USER_CTX;

END SECURITY_PACKAGE1;
/

 

Polisa

 

W trzecim kroku utworzymy polisę, w której określamy, jakiego obiektu/tabeli nasze restrykcje dotyczą:

 

BEGIN
   DBMS_RLS.ADD_POLICY (
      object_schema     => 'HR',
      object_name       => 'EMPLOYEES',
      policy_name       => 'HR_DEPARTMENT_ID_POLICY',
      function_schema   => 'HR',
      policy_function   => 'SECURITY_PACKAGE1.DEPARTMENT_ID_RESTRICTION',
      statement_types   => 'INSERT, UPDATE, DELETE, SELECT',
      update_check      => TRUE,
      policy_type       => DBMS_RLS.SHARED_CONTEXT_SENSITIVE);
END;
/

 

Nie będę tu wnikał w szczegóły przekazywanych parametrów, zainteresowanych odsyłam do źródła:

 

Oracle 11g:

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_rls.htm#ARPLS052

Oracle 12c:

https://docs.oracle.com/database/121/ARPLS/d_rls.htm#ARPLS052

 

 

Funkcja Polisy

 

W ostatnim kroku implementacji musimy utworzyć funkcje polisy (predykatu). Dodany kod w pakiecie zaznaczyłem na czerwono.

 

CREATE OR REPLACE PACKAGE SECURITY_PACKAGE1
IS

   PROCEDURE SET_USER_CTX (ps_attr IN VARCHAR2, ps_val IN VARCHAR2);

   FUNCTION DEPARTMENT_ID_RESTRICTION (ps_schema_name   IN VARCHAR2,
                                       ps_object_name   IN VARCHAR2) RETURN VARCHAR2;

END SECURITY_PACKAGE1;
/

CREATE OR REPLACE PACKAGE BODY SECURITY_PACKAGE1
IS

   GS_USER_CTX_VNAME VARCHAR2(30) := 'USER_CTX1';
   
   PROCEDURE SET_USER_CTX (ps_attr IN VARCHAR2, ps_val IN VARCHAR2)
   IS
   BEGIN
      DBMS_SESSION.SET_CONTEXT (GS_USER_CTX_VNAME, ps_attr, ps_val);
   END SET_USER_CTX;

   FUNCTION DEPARTMENT_ID_RESTRICTION (ps_schema_name   IN VARCHAR2,
                                       ps_object_name   IN VARCHAR2) RETURN VARCHAR2
   IS
      ls_return_val   VARCHAR2 (200);
   BEGIN
      
      IF ps_schema_name = USER                --wlasciciel widzi wszystko
      THEN
         ls_return_val := NULL;
      ELSIF SYS_CONTEXT (GS_USER_CTX_VNAME, 'DEPARTMENT_ID') IS NOT NULL
      THEN
         ls_return_val := 'DEPARTMENT_ID IN (' || SYS_CONTEXT (GS_USER_CTX_VNAME, 'DEPARTMENT_ID') || ')';
      ELSE    -- just for testing to simulate the user not having anything set
         ls_return_val := '1=1';
      END IF;

      RETURN ls_return_val;
      
   END DEPARTMENT_ID_RESTRICTION;
   
END SECURITY_PACKAGE1;
/

 

Pamiętaj! Funkcje predykatów powinny być szybkie i wydaje, ponieważ ewaluowane są dla każdego wykonywanego polecenia SQL.

 

Testowanie

 

Przykłady poniższe wykorzystują standardowe tabele schematu HR.

 

SELECT COUNT (*), DEPARTMENT_ID
    FROM EMPLOYEES
GROUP BY DEPARTMENT_ID;

 

Po wykonaniu powyższego zapytania w moim wypadku otrzymałem 12 wiersze. Jeśli teraz zmienimy nieco kontekst użytkownika i wykonamy zapytanie ponownie, powinniśmy zobaczyć 4 wiersze. Wartości identyfikatorów departamentów (DEPARTMENT_ID) powinny odpowiadać wartościom zdefiniowanym w kontekście.

 

EXEC SECURITY_PACKAGE1.SET_USER_CTX('DEPARTMENT_ID', '70,110,50,80');

 

Jeśli cos się nie zgadza, widzisz na przykład więcej wierszy niż powinieneś, upewnij się ze nie wykonujesz zapytań, jako właściciel obiektu/tabeli. Mój kod zakłada ze właściciel może widzieć wszystko i predykat w tej sytuacji nie jest dodawany.

09:12, m0rt1m3r
Link Dodaj komentarz »
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time