Urzędowa Poczta Elektroniczna (UPE)



Podobne dokumenty
Elektroniczne Dzienniki Urzędowe

Prosta książka telefoniczna z wykorzystaniem zapisu do pliku

Dokumentacja podłączeniowa dla procesu przenoszenia danych osobowych. Czyli opis jak skorzystać z usługi: rodotransferservice

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Integracja z modułem komunikacyjnym

Dokumentacja techniczna interfejsu komunikacyjnego Cyfrowego Urzędu z systemami EOD

RA H L WYMIANA DANYCH. Wersja z dnia Numer dokumentu 2006/IT-P/004. Kategoria dokumentu. Projekt. Status dokumentu.

Urzędowa Poczta Elektroniczna Poradnik dla podmiotu przekazującego ABC PRO Sp. z o.o.

Wykład 12. Programowanie serwera MS SQL 2005 w C#

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Elektroniczne Dzienniki Urzedowe Moduł Komunikacyjny

Integracja Obieg Dokumentów - GiS Spis treści

Ekspert radzi. mechanizm w enova, umożliwiający wskazanie domyślnej drukarki dla danego stanowiska i wydruku. Strona 1 z 8. Ekspert radzi.

Db4o obiektowa baza danych wersja.net

Zaawansowane aplikacje WWW - laboratorium

Integracja Comarch e-sprawozdania

JĘZYKI PROGRAMOWANIA Elementy programowania rozproszonego

MINISTERSTWO FINANSÓW PLAN INTEGRACJI SYSTEMU ZAŁĄCZNIK NR 6 SEAP SPECYFIKACJA KANAŁ DLA PODMIOTÓW ZEWNĘTRZNYCH PL PROJEKT ECIP/SEAP

Technologie internetowe laboratorium nr 4. Instalacja i uruchomienie usługi sieciowej w serwerze Tomcat/AXIS

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Spis treści INTERFEJS (WEBSERVICES) - DOKUMENTACJA TECHNICZNA 1

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Podstawy i języki programowania

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

ESDI. WebService. Wersja 1.2. Strona 1

DPDInfoServices. Specyfikacja biznesowa. Version DPD Polska Sp. z O.O. Warszawa

Instrukcja integratora - obsługa dużych plików w epuap2

elektroniczna Platforma Usług Administracji Publicznej

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Gatesms.eu Mobilne Rozwiązania dla biznesu

Programowanie telefonów z Windows Phone 7, cz. 4

Laboratorium 10 - Web Services

Dodatki Bestii. Agnieszka Oponowicz

Katalog książek cz. 2

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe

Sprawdzenie stanu opłacenia pakietu Zlecenie sprawdzenia stanu opłacenia... 23

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

PUE ZUS Wysyłka elektronicznych zapytan. Instrukcja wysyłki zapytań do ZUZ-PUE za pomocą aplikacji Komornik SQL

Klasy i obiekty cz II

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

BEAN VALIDATION. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Metody dostępu do danych

LINQ TO XML. Autor ćwiczenia: Marcin Wolicki

Szczegółowy Opis Interfejsu Wymiany Danych. Załącznik nr 1.8.

Programowanie obiektowe

Wykład 5 Okna MDI i SDI, dziedziczenie

Techniczny opis rozwiązania dla udostępniania danych pomiarowych i zagregowanych z wykorzystaniem standardu AS4

(Dz. U. z dnia 17 listopada 2006 r.)

Rozdział 4 KLASY, OBIEKTY, METODY

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

Usługi WWW. dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska Opole zlipinski@math.uni.opole.pl

AXIS2 - tworzenie usługi sieciowej i klienta Axis Data Binding. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

Współpraca z platformą Emp@tia. dokumentacja techniczna

Nexto.API. Przykładowy klient Java 1.6 do systemu zamówień NextoAPI. Przygotował Rafał Ozga e-kiosk S.A. Maj 2015,

STWORZENIE MOBILNEJ APLIKACJI,

Wyjątki (exceptions)

Dokumentacja API sender sms

1. Wstęp 2. Adres usługi 3. Konfiguracja 4. Metody 5. Typy danych 6. Przykład wywołania metody przy użyciu php i biblioteki nusoap 7.

Instrukcja laboratoryjna cz.3

PUE ZUS Wysyłka elektronicznych zapytan. Instrukcja wysyłki zapytań do ZUZ-PUE za pomocą aplikacji Komornik SQL

Dokumentacja do API Javy.

Specyfikacja API Runtime BAS 3.0

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Szkoła Techniczno Ekonomiczna w Świdnicy. Języki i paradygmaty programowania - 8

Wstęp. Ale po co? Implementacja

Instrukcja. Elektronicznej Skrzynki Podawczej

Instrukcja użytkownika

Programowanie telefonów z Windows Phone 7, cz. 2

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Wysyłka wniosko w ZUS - EKS. Instrukcja użytkownika aplikacji Wysyłka wniosków ZUS EKS

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Aplikacje RMI

Instrukcja uzyskania certyfikatu niekwalifikowanego w Urzędzie Miasta i Gminy Strzelin

Wykład 6 Dziedziczenie cd., pliki

1. Uruchomić i skonfigurować środowisko tworzenia aplikacji i serwer aplikacji.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Tworzenie natywnych aplikacji na urządzenia mobilne - PhoneGap Tomasz Margalski

Katalog książek cz. 3: Web Service

Aplikacje WWW - laboratorium

Aplikacje RMI Lab4

Ćwiczenia laboratoryjne. Oprogramowanie i badanie prostych metod sortowania w tablicach

Dokumentacja Techniczna 1.2. Webtoken MT. Uruchomienie subskrybcji MT poprzez serwis WWW

xmlns:prism= c. <ContentControl prism:regionmanager.regionname="mainregion" />

Aby skorzystać z systemu, użytkownik musi posiadać konto użytkownika i zalogować się.

Komponenty sterowane komunikatami

DLL TUTORIAL GÖRLITZ GERMANY 20:30. Spis Treści

Opis modułu pl.id w programie Komornik SQL-VAT

Klasy cd. Struktury Interfejsy Wyjątki

Instrukcja laboratoryjna cz.2

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Transkrypt:

Urzędowa Poczta Elektroniczna (UPE) Dokument zawiera opis sposobu implementacji wysyłania wniosków wraz z załączonymi aktami prawnymi do publikacji w Dzienniku Urzędowym poprzez dedykowaną Urzędową Pocztę Elektroniczną Data dokumentu: 27 września 2012 Wersja: 1.1 Autor: Adam Rakowski Konsultacja techniczna: Krzysztof Radzimski Konsultacja merytoryczna: Piotr Jegorow

Zawartość Informacje podstawowe... 3 Krok 1 Przygotowanie wniosku... 3 Krok 2 Logowanie do UPE.... 4 Krok 3 Wysyłanie wniosku... 4 Krok 4 Pobieranie przygotowanego wniosku do podpisu... 5 Krok 5 Podpisanie wniosku... 6 Krok 6 Wysłanie podpisanego wniosku... 6 Podsumowanie... 7 Pobieranie Urzędowego Poświadczenia Przedłożenia... 8 WSDL... 9 Program przykładowy... 15 Strona 2 z 21

Informacje podstawowe Lokalizacja usługi sieciowej (WebService): http://upe.com.pl/ws/upe.asmx WSDL: http://upe.com.pl/ws/upe.asmx?wsdl W celu przekazania aktów normatywnych lub innych aktów prawnych do ogłoszenia w Wojewódzkim Dzienniku Urzędowym za pomocą Urzędowej Poczty Elektronicznej (zwanej dalej UPE) należy wykonać następujące kroki: Krok 1 Przygotowanie wniosku 1. Stworzyć plik XML o nazwie Wniosek.xml, który będzie zawierał podstawowe informacje niezbędne do utworzenia właściwego wniosku o ogłoszenie w Wojewódzkim Dzienniku Urzędowym. Plik XML musi zawierać następujące dane: 1) Symbol sprawy 2) Data sprawy 3) Imię składającego wniosek 4) Nazwisko składającego wniosek 5) Email składającego wniosek 6) Stanowisko składającego wniosek 7) Lista aktów prawnych dołączonych do wniosku Przykładowy plik: <?xml version="1.0" encoding="utf-8"?> <wniosek wersja="1.0"> <data>2012-09-03</data> <symbol>xcv/2012/11/23</symbol> <imie>xcv/2012/11/23</imie> <nazwisko>kowalski</nazwisko> <email>jan@kowalski.pl</email> <stanowisko>informatyk</stanowisko> <zalaczniki> <zalacznik nazwa="uchwala.xvi.80.2012.zip" /> <zalacznik nazwa="uchwala.xii.221.2012.zip" /> </zalaczniki> </wniosek> Uwagi 1) Nazwa załączonego do wniosku pliku aktu prawnego nie może zawierać polskich liter, spacji, ani znaków specjalnych 2) Załączone pliki aktów muszą być zgodne z rozporządzeniem Prezesa Rady Ministrów z dnia 27 grudnia 2011 r. w sprawie wymagań dla dokumentów Strona 3 z 21

elektronicznych zawierających akty normatywne i inne akty prawne, dzienników urzędowych wydawanych w postaci elektronicznej oraz środków komunikacji elektronicznej i informatycznych nośników danych (Dz. U. Nr 289, poz. 1699) 2. Spakować plik wniosek.xml wraz z załączonymi plikami zawierającymi akty prawne w archiwum ZIP. Krok 2 Logowanie do UPE. W celu zalogowania do UPE należy wywołać metodę, w której podajemy nazwę użytkownika oraz skrót hasła (algorytm SHA256). private String ComputeHashPassword(String password) return BitConverter.ToString( new SHA256CryptoServiceProvider().ComputeHash( Encoding.UTF8.GetBytes(password))).Replace("-", ""); SPSession session = upe.startnewsession(userlogin, ComputeHashPassword(userPassword)); Przykład: Dla qwe hash będzie wyglądał następująco: 489cd5dbc708c7e541de4d7cd91ce6d0f1613573b7fc5b40d3942ccb9555cf35 Identyczny rezultat można osiągnąć korzystając z języka JAVA oraz bibliotek Commons Codec (http://commons.apache.org/codec/). Apache import org.apache.commons.codec.digest.digestutils; DigestUtils.sha256Hex(userPassword); Jeżeli użytkownik zostanie poprawnie uwierzytelniony, metoda zwróci obiekt SPSession, który jest wymagany w kolejnych krokach. W przypadku nieprawidłowego uwierzytelnienia zostanie zwrócony wyjątek, informujący o błędzie. Krok 3 Wysyłanie wniosku 1. Przed rozpoczęciem wysyłania archiwum ZIP, należy pobrać identyfikator wniosku oraz zainicjalizować transfer: int issueid = upe.createemptyissue(session); PackageInfo packageinfo = upe.setuppackagetransfer(session, Strona 4 z 21

issueid, packagefile.length); PackageInfo zawiera informację, o tym, na ile paczek należy podzielić archiwum ZIP oraz ile zajmuje każda paczka. 2. Po zainicjalizowaniu należy wysyłać archiwum ZIP podzielone na pliki wielkości 512KB (524288): // inicjalizacja transferu: wysyłamy częściami po 512KB (524288) każda PackageInfo packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); // wyslanie paczek foreach (PackagePart part in packageinfo.parts) upe.sendpackagepart(session, packageinfo, part.partid, filepart); 3. Po wysłaniu ostatniej część wysyłamy informację do serwera o zakończeniu wysyłania: // inicjalizacja transferu: wysyłamy częściami po 512KB (524288) każda PackageInfo packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); // wyslanie paczek foreach (PackagePart part in packageinfo.parts) upe.sendpackagepart(session, packageinfo, part.partid, filepart); // potwierdzanie wysłania paczki upe.confirmtransfer(session, packageinfo); Krok 4 Pobieranie przygotowanego wniosku do podpisu Usługa sieciowa UPE, przekonwertuje załączone akty prawne w formacie ZIP na format wymagany przez UPE (ZIPX) oraz wygeneruje właściwy wniosek z pełnymi danymi, tj. danymi właściwego Urzędu Wojewódzkiego, do którego wysyłany jest wniosek oraz danymi instytucji wysyłającej. Tak przygotowaną paczkę zawierającą powyższe dokumenty należy ponownie pobrać, podpisać bezpiecznym podpisem elektronicznym i wysłać do UPE. Powyższa procedura składa się z następujących kroków: 1. Inicjalizacja pobierania archiwum ZIP: PackageInfo downloadpackage = upe.setupdownloadpackagetransfer(session, issueid, packageinfo.packageid); 2. PackageInfo zawiera wszystkie niezbędne informacje do poprawnego pobrania archiwum ZIP postaci pojedynczych paczek z serwera: PackageInfo downloadpackage = upe.setupdownloadpackagetransfer(session, issueid, packageinfo.packageid); // utworzenie bufora byte[] buffer = new byte[downloadpackage.totalsize]; Strona 5 z 21

foreach (PackagePart part in downloadpackage.parts) // pobranie części pliku byte[] data = upe.downloadpackagepart(session, downloadpackage, part.partid); // przekopiowanie danych do bufora Array.Copy(data, 0, buffer, (part.partid - 1) * downloadpackage.partsize, data.length); // zapisanie pliku File.WriteAllBytes(packagePath, buffer); 3. Po zakończeniu pobierania archiwum ZIP, nie ma potrzeby przesyłania informacji do usługi o zakończeniu pobierania. Krok 5 Podpisanie wniosku 1. Rozpakowujemy pobrane archiwum ZIP. 2. Podpisujemy plik wniosek.xml wraz za łączonymi aktami prawnymi w formacie ZIPX, dołączając do sygnatury podpisu stosowne referencje. Format podpisu musi być zgodny z specyfikacją techniczną formatu podpisu określoną w załączniku nr 2 do rozporządzenia Prezesa Rady Ministrów z dnia 27 grudnia 2011 r. w sprawie wymagań dla dokumentów elektronicznych zawierających akty normatywne i inne akty prawne, dzienników urzędowych wydawanych w postaci elektronicznej oraz środków komunikacji elektronicznej i informatycznych nośników danych (Dz. U. Nr 289, poz. 1699) 3. Po złożeniu bezpiecznego podpisu elektronicznego pliku wniosku o ogłoszenie oraz załączone akty prawne w formacie ZIPX pakujemy do archiwum ZIP. Krok 6 Wysłanie podpisanego wniosku Powtarzamy operacje opisane w kroku 3, wskazując plik ZIP zawierający właściwy plik wniosku ogłoszenie podpisany bezpiecznym podpisem elektronicznym wraz z aktami prawnymi w formacie ZIPX. 1. Przed rozpoczęciem wysyłania archiwum ZIP, należy zainicjalizować transfer: PackageInfo packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); PackageInfo zawiera informację, o tym, na ile paczek należy podzielić archiwum ZIP oraz ile zajmuje każda paczka. 2. Po zainicjalizowaniu należy wysyłać archiwum ZIP podzielone na pliki wielkości 512KB (524288): // inicjalizacja transferu: wysyłamy częściami po 512KB (524288) każda PackageInfo packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); Strona 6 z 21

// wyslanie paczek foreach (PackagePart part in packageinfo.parts) upe.sendpackagepart(session, packageinfo, part.partid, filepart); 3. Po wysłaniu ostatniej część wysyłamy informację do serwera o zakończeniu wysyłania: // inicjalizacja transferu: wysyłamy częściami po 512KB (524288) każda PackageInfo packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); // wyslanie paczek foreach (PackagePart part in packageinfo.parts) upe.sendpackagepart(session, packageinfo, part.partid, filepart); // potwierdzanie wysłania paczki upe.confirmtransfer(session, packageinfo); Podsumowanie Po wykonaniu kroku 6, UPE utworzy właściwy plik paczki archiwalnej zawierający przekazany wniosek o ogłoszenie wraz z aktami przeznaczonymi do ogłoszenia oraz metadane właściwe dla dokumentów elektronicznych przekazywanych do archiwum państwowego. Tak wytworzona paczka zostanie przekazana do właściwej Redakcji Dziennika Urzędowego. Na wskazany w ustawieniach UPE adres e-mail użytkownika zostanie przekazane Urzędowe Poświadczenie Przedłożenia. Ponadto wszystkie dokumenty będą dostępne z poziomu portalu internetowego UPE pod adresem https://upe.com.pl. Strona 7 z 21

Pobieranie Urzędowego Poświadczenia Przedłożenia Usługa sieciowa umożliwia sprawdzenie i pobranie UPP, które informuje o tym, że Redakcja Dziennika Urzędowego, otrzymała wniosek o ogłoszenie. W celu pobrania UPP należy wywołać metodę: PackageInfo packageinfo = upe.setupdownloadupp(session, issueid); Jeżeli Redakcja Dziennika Urzędowego nie odebrała wniosku wraz z załącznikami to wartość packageinfo będzie pusta (null). W przeciwnym wypadku instancja klasy PackageInfo będzie zawierać wszystkie niezbędne informacje potrzebne do pobrania paczki z Urzędowym Poświadczeniem Przedłożenia. Pobrać paczkę z UPP można w następujący sposób: byte[] buffer = new byte[packageinfo.totalsize]; foreach (PackagePart part in packageinfo.parts) byte[] data = upe.downloadupppackagepart( session, packageinfo, part.partid); Array.Copy(data, 0, buffer, (part.partid - 1) * packageinfo.partsize, data.length); Pobrany plik to archiwum ZIP zawierające: podpisany plik XML UPP podpisany plik PDF UPP Strona 8 z 21

WSDL <?xml version="1.0" encoding="utf-8"?> <wsdl:definitions xmlns:s="http://www.w3.org/2001/xmlschema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://upe.com.pl/ws/upe" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textmatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetnamespace="http://upe.com.pl/ws/upe" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> <wsdl:types> <s:schema elementformdefault="qualified" targetnamespace="http://upe.com.pl/ws/upe"> <s:element name="startnewsession"> <s:element minoccurs="0" maxoccurs="1" name="login" type="s:string" /> <s:element minoccurs="0" maxoccurs="1" name="password" type="s:string" /> <s:element name="startnewsessionresponse"> <s:element minoccurs="0" maxoccurs="1" name="startnewsessionresult" type="tns:spsession" /> <s:complextype name="spsession"> <s:element minoccurs="1" maxoccurs="1" name="databaseid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="isactive" type="s:boolean" /> <s:element minoccurs="1" maxoccurs="1" name="userid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="institutionid" type="s:int" /> <s:element minoccurs="0" maxoccurs="1" name="sessionid" type="s:string" /> <s:element minoccurs="1" maxoccurs="1" name="spitemid" type="s:int" /> <s:element name="endsession"> <s:element minoccurs="0" maxoccurs="1" name="session" type="tns:spsession" /> <s:element name="endsessionresponse"> <s:complextype /> <s:element name="setuppackagetransfer"> <s:element minoccurs="0" maxoccurs="1" name="sessionhandle" type="tns:spsession" /> <s:element minoccurs="1" maxoccurs="1" name="issueid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="packagesize" type="s:int" /> <s:element name="setuppackagetransferresponse"> <s:element minoccurs="0" maxoccurs="1" name="setuppackagetransferresult" type="tns:packageinfo" /> <s:complextype name="packageinfo"> <s:element minoccurs="1" maxoccurs="1" name="institutionid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="userid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="issueid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="transfermode" type="tns:packagetransfermode" /> <s:element minoccurs="0" maxoccurs="1" name="packageid" type="s:string" /> <s:element minoccurs="1" maxoccurs="1" name="partsize" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="totalsize" type="s:int" /> Strona 9 z 21

<s:element minoccurs="0" maxoccurs="1" name="parts" type="tns:arrayofpackagepart" /> <s:simpletype name="packagetransfermode"> <s:restriction base="s:string"> <s:enumeration value="download" /> <s:enumeration value="upload" /> </s:restriction> </s:simpletype> <s:complextype name="arrayofpackagepart"> <s:element minoccurs="0" maxoccurs="unbounded" name="packagepart" nillable="true" type="tns:packagepart" /> <s:complextype name="packagepart"> <s:element minoccurs="1" maxoccurs="1" name="partid" type="s:int" /> <s:element minoccurs="1" maxoccurs="1" name="size" type="s:int" /> <s:element name="setupdownloadpackagetransfer"> <s:element minoccurs="0" maxoccurs="1" name="sessionhandle" type="tns:spsession" /> <s:element minoccurs="1" maxoccurs="1" name="issueid" type="s:int" /> <s:element minoccurs="0" maxoccurs="1" name="packageid" type="s:string" /> <s:element name="setupdownloadpackagetransferresponse"> <s:element minoccurs="0" maxoccurs="1" name="setupdownloadpackagetransferresult" type="tns:packageinfo" /> <s:element name="downloadpackagepart"> <s:element minoccurs="0" maxoccurs="1" name="sessionhandle" type="tns:spsession" /> <s:element minoccurs="0" maxoccurs="1" name="info" type="tns:packageinfo" /> <s:element minoccurs="1" maxoccurs="1" name="partid" type="s:int" /> <s:element name="downloadpackagepartresponse"> <s:element minoccurs="0" maxoccurs="1" name="downloadpackagepartresult" type="s:base64binary" /> <s:element name="sendpackagepart"> <s:element minoccurs="0" maxoccurs="1" name="sessionhandle" type="tns:spsession" /> <s:element minoccurs="0" maxoccurs="1" name="info" type="tns:packageinfo" /> <s:element minoccurs="1" maxoccurs="1" name="partid" type="s:int" /> <s:element minoccurs="0" maxoccurs="1" name="content" type="s:base64binary" /> <s:element name="sendpackagepartresponse"> <s:complextype /> <s:element name="confirmtransfer"> <s:element minoccurs="0" maxoccurs="1" name="sessionhandle" type="tns:spsession" /> <s:element minoccurs="0" maxoccurs="1" name="package" type="tns:packageinfo" /> Strona 10 z 21

<s:element name="confirmtransferresponse"> <s:complextype /> <s:element name="createemptyissue"> <s:element minoccurs="0" maxoccurs="1" name="sessionhandle" type="tns:spsession" /> <s:element name="createemptyissueresponse"> <s:element minoccurs="1" maxoccurs="1" name="createemptyissueresult" type="s:int" /> </s:schema> </wsdl:types> <wsdl:message name="startnewsessionsoapin"> <wsdl:part name="parameters" element="tns:startnewsession" /> <wsdl:message name="startnewsessionsoapout"> <wsdl:part name="parameters" element="tns:startnewsessionresponse" /> <wsdl:message name="endsessionsoapin"> <wsdl:part name="parameters" element="tns:endsession" /> <wsdl:message name="endsessionsoapout"> <wsdl:part name="parameters" element="tns:endsessionresponse" /> <wsdl:message name="setuppackagetransfersoapin"> <wsdl:part name="parameters" element="tns:setuppackagetransfer" /> <wsdl:message name="setuppackagetransfersoapout"> <wsdl:part name="parameters" element="tns:setuppackagetransferresponse" /> <wsdl:message name="setupdownloadpackagetransfersoapin"> <wsdl:part name="parameters" element="tns:setupdownloadpackagetransfer" /> <wsdl:message name="setupdownloadpackagetransfersoapout"> <wsdl:part name="parameters" element="tns:setupdownloadpackagetransferresponse" /> <wsdl:message name="downloadpackagepartsoapin"> <wsdl:part name="parameters" element="tns:downloadpackagepart" /> <wsdl:message name="downloadpackagepartsoapout"> <wsdl:part name="parameters" element="tns:downloadpackagepartresponse" /> <wsdl:message name="sendpackagepartsoapin"> <wsdl:part name="parameters" element="tns:sendpackagepart" /> <wsdl:message name="sendpackagepartsoapout"> <wsdl:part name="parameters" element="tns:sendpackagepartresponse" /> <wsdl:message name="confirmtransfersoapin"> <wsdl:part name="parameters" element="tns:confirmtransfer" /> <wsdl:message name="confirmtransfersoapout"> <wsdl:part name="parameters" element="tns:confirmtransferresponse" /> <wsdl:message name="createemptyissuesoapin"> <wsdl:part name="parameters" element="tns:createemptyissue" /> <wsdl:message name="createemptyissuesoapout"> <wsdl:part name="parameters" element="tns:createemptyissueresponse" /> <wsdl:porttype name="upesoap"> <wsdl:operation name="startnewsession"> <wsdl:input message="tns:startnewsessionsoapin" /> <wsdl:output message="tns:startnewsessionsoapout" /> <wsdl:operation name="endsession"> <wsdl:input message="tns:endsessionsoapin" /> <wsdl:output message="tns:endsessionsoapout" /> Strona 11 z 21

<wsdl:operation name="setuppackagetransfer"> <wsdl:input message="tns:setuppackagetransfersoapin" /> <wsdl:output message="tns:setuppackagetransfersoapout" /> <wsdl:operation name="setupdownloadpackagetransfer"> <wsdl:input message="tns:setupdownloadpackagetransfersoapin" /> <wsdl:output message="tns:setupdownloadpackagetransfersoapout" /> <wsdl:operation name="downloadpackagepart"> <wsdl:input message="tns:downloadpackagepartsoapin" /> <wsdl:output message="tns:downloadpackagepartsoapout" /> <wsdl:operation name="sendpackagepart"> <wsdl:input message="tns:sendpackagepartsoapin" /> <wsdl:output message="tns:sendpackagepartsoapout" /> <wsdl:operation name="confirmtransfer"> <wsdl:input message="tns:confirmtransfersoapin" /> <wsdl:output message="tns:confirmtransfersoapout" /> <wsdl:operation name="createemptyissue"> <wsdl:input message="tns:createemptyissuesoapin" /> <wsdl:output message="tns:createemptyissuesoapout" /> </wsdl:porttype> <wsdl:binding name="upesoap" type="tns:upesoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="startnewsession"> <soap:operation soapaction="http://upe.com.pl/ws/upe/startnewsession" style="document" /> <wsdl:operation name="endsession"> <soap:operation soapaction="http://upe.com.pl/ws/upe/endsession" style="document" /> <wsdl:operation name="setuppackagetransfer"> <soap:operation soapaction="http://upe.com.pl/ws/upe/setuppackagetransfer" style="document" /> <wsdl:operation name="setupdownloadpackagetransfer"> <soap:operation soapaction="http://upe.com.pl/ws/upe/setupdownloadpackagetransfer" style="document" /> <wsdl:operation name="downloadpackagepart"> <soap:operation soapaction="http://upe.com.pl/ws/upe/downloadpackagepart" style="document" /> <wsdl:operation name="sendpackagepart"> <soap:operation soapaction="http://upe.com.pl/ws/upe/sendpackagepart" style="document" /> Strona 12 z 21

<wsdl:operation name="confirmtransfer"> <soap:operation soapaction="http://upe.com.pl/ws/upe/confirmtransfer" style="document" /> <wsdl:operation name="createemptyissue"> <soap:operation soapaction="http://upe.com.pl/ws/upe/createemptyissue" style="document" /> </wsdl:binding> <wsdl:binding name="upesoap12" type="tns:upesoap"> <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="startnewsession"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/startnewsession" style="document" /> <wsdl:operation name="endsession"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/endsession" style="document" /> <wsdl:operation name="setuppackagetransfer"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/setuppackagetransfer" style="document" /> <wsdl:operation name="setupdownloadpackagetransfer"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/setupdownloadpackagetransfer" style="document" /> <wsdl:operation name="downloadpackagepart"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/downloadpackagepart" style="document" /> <wsdl:operation name="sendpackagepart"> Strona 13 z 21

<soap12:operation soapaction="http://upe.com.pl/ws/upe/sendpackagepart" style="document" /> <wsdl:operation name="confirmtransfer"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/confirmtransfer" style="document" /> <wsdl:operation name="createemptyissue"> <soap12:operation soapaction="http://upe.com.pl/ws/upe/createemptyissue" style="document" /> </wsdl:binding> <wsdl:service name="upe"> <wsdl:port name="upesoap" binding="tns:upesoap"> <soap:address location="http://upe.com.pl/ws/upe.asmx" /> </wsdl:port> <wsdl:port name="upesoap12" binding="tns:upesoap12"> <soap12:address location="http://upe.com.pl/ws/upe.asmx" /> </wsdl:port> </wsdl:service> </wsdl:definitions> Strona 14 z 21

Program przykładowy Przykładowy program został przygotowany za pomocą środowiska Visual Studio 2012 oraz pakietu.net Framework 4.5. Wykorzystano jedynie biblioteki dostępne w tym pakiecie. W przypadku korzystania ze starszej wersji.net Framework, należy wykorzystać bibliotekę firmy trzeciej służącej do operacji na archiwach ZIP (Ionic.ZIP, ICSharpZipLib lub podobne). W przypadku korzystania z innych środowisk i języków programowania, należy wykorzystać właściwe narzędzia do komunikacji z usługa sieciową oraz wykonania wszystkich kroków. Przykładowy program nie zawiera bibliotek odpowiedzialnych za składanie bezpiecznego podpisu elektronicznego. Do utworzenia proxy wykorzystano kreator tworzenia referencji do usług WWW. Opisane powyżej kroki realizuje metoda SendRequest() w klasie MainWindow. using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Security.Cryptography; using System.Text; using System.Windows.Forms; using System.Xml.Linq; using Abc.UPEv4.Sample.RequestSender.UPE; namespace Abc.UPEv4.Sample.RequestSender /// <summary> /// Main window /// </summary> public partial class MainWindow : Form #region Fields private List<RequestFile> files; #endregion Strona 15 z 21

#region Constructors /// <summary> /// Inicjalizuje klasę <see cref="mainwindow"/> /// </summary> public MainWindow() InitializeComponent(); files = new List<RequestFile>(); #endregion #region Methods /// <summary> /// Waliduje formularz /// </summary> /// <returns>flaga, która informuje czy formularz jest poprawny</returns> private bool ValidateForm() bool errors = false; errorprovider.clear(); if (string.isnullorempty(txtlogin.text)) errorprovider.seterror(txtlogin, "Wpisz login"); errors = true; if (string.isnullorempty(txtpassword.text)) errorprovider.seterror(txtpassword, "Wpisz hasło"); errors = true; if (string.isnullorempty(txtsymbol.text)) errorprovider.seterror(txtsymbol, "Wpisz znak sprawy"); errors = true; if (string.isnullorempty(txtemail.text)) errorprovider.seterror(txtemail, "Wpisz email"); errors = true; if (string.isnullorempty(txtsymbol.text)) errorprovider.seterror(txtsymbol, "Wpisz imię"); errors = true; if (string.isnullorempty(txtlastname.text)) errorprovider.seterror(txtlastname, "Wpisz nazwisko"); errors = true; if (string.isnullorempty(txtemail.text)) errorprovider.seterror(txtemail, "Wpisz stanowisko"); errors = true; if (listfiles.items.count == 0) errorprovider.seterror(listfiles, "Dołącz conajmniej jeden plik"); errors = true; Strona 16 z 21

return!errors; /// <summary> /// Tworzy wniosek gotowy do wysłania /// </summary> /// <returns>ścieżka do paczki z wnioskiem</returns> private String CreateRequestPackage() String requestfilepath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); String xmlrequestfilepath = Path.GetTempFileName(); // towrzymy plik XML z wnioskiem // bardzo ważne! Paczka bez tego pliku nie zostanie przyjęta. XDocument doc = new XDocument(); XElement xroot = new XElement("wniosek", new XAttribute("wersja", "1.0"), new XElement("data", daterequest.value.tostring("yyyy-mm-dd")), new XElement("symbol", txtsymbol.text), new XElement("imie", txtfirstname.text), new XElement("nazwisko", txtlastname.text), new XElement("email", txtemail.text), new XElement("stanowisko", txtposition.text) ); doc.add(xroot); // załaczniki XElement xattachments = new XElement("zalaczniki"); xroot.add(xattachments); foreach (RequestFile file in files) xattachments.add(new XElement("zalacznik", new XAttribute("nazwa", file))); doc.save(xmlrequestfilepath); // wszystko pakujemy do zpia using (ZipArchive zip = ZipFile.Open(requestFilePath, ZipArchiveMode.Create)) zip.createentryfromfile(xmlrequestfilepath, "Wniosek.xml"); // zalaczniki foreach (RequestFile file in files) zip.createentryfromfile(file.filename, file.tostring()); return requestfilepath; /// <summary> /// Tworzy hash hasła /// </summary> private String ComputeHashPassword(String password) return BitConverter.ToString(new SHA256CryptoServiceProvider().ComputeHash( Encoding.UTF8.GetBytes(password))).Replace("-", ""); /// <summary> /// Wysyła wniosek /// </summary> private void SendRequest() UpdateStatus("Autoryzacja"); String packagepath = null; Strona 17 z 21

try using (UPE.UPE upe = new UPE.UPE()) // haslo hashujemy algorytmem SHA256 SPSession session = upe.startnewsession(txtlogin.text, ComputeHashPassword(txtPassword.Text)); UpdateStatus("Utworzenie paczki z wnioskiem"); packagepath = CreateRequestPackage(); UpdateStatus("Wysyłanie wniosku"); int issueid = upe.createemptyissue(session); #region Wysyłanie paczki do serwera byte[] packagefile = null; using (FileStream fs = new FileStream(packagePath, FileMode.Open)) packagefile = new byte[fs.length]; fs.read(packagefile, 0, packagefile.length); // inicjalizacja transferu: wysyłamy częściami po 512KB (524288) każda PackageInfo packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); // wyslanie paczek foreach (PackagePart part in packageinfo.parts) UpdateStatus(string.Format("Wysyłanie paczki 0 z 1", part.partid, packageinfo.parts.length)); byte[] filepart = new byte[part.size]; Array.Copy(packageFile, (part.partid - 1) * packageinfo.partsize, filepart, 0, part.size); upe.sendpackagepart(session, packageinfo, part.partid, filepart); UpdateStatus("Potwierdzanie wysłania paczki"); upe.confirmtransfer(session, packageinfo); #endregion // usuniecie starej paczki - nie bedzie potrzebna File.Delete(packagePath); // po wyslaniu paczki z zalacznikami zostanie zwrocona paczka // z wygenerowanym wnioskiem oraz przekonwertowanymi zalacznikami, // które trzeba podpisać podpisem elektronicznym #region Pobranie paczki UpdateStatus( "Pobieranie wygnerowanej paczki z wnioskiem do podpisania przez serwer"); PackageInfo downloadpackage = upe.setupdownloadpackagetransfer( session, issueid, packageinfo.packageid); byte[] buffer = new byte[downloadpackage.totalsize]; foreach (PackagePart part in downloadpackage.parts) byte[] data = upe.downloadpackagepart(session, downloadpackage, part.partid); Array.Copy(data, 0, buffer, (part.partid - 1) * downloadpackage.partsize, data.length); // zapisanie paczki File.WriteAllBytes(packagePath, buffer); #endregion Strona 18 z 21

// TODO rozpakowanie podpisanie wniosku (Wniosek.xml) // TODO spakowanie paczki // Odeslanie podpisanego wniosku z powrotem do UPE // jezeli wszystko bedzie ok, to zostanie pobrany przez redakcję #region Wysłanie podpisanej paczki packagefile = File.ReadAllBytes(packagePath); packageinfo = upe.setuppackagetransfer(session, issueid, packagefile.length); foreach (PackagePart part in packageinfo.parts) UpdateStatus(string.Format("Wysyłanie paczki 0 z 1", part.partid, packageinfo.parts.length)); byte[] filepart = new byte[part.size]; Array.Copy(packageFile, (part.partid - 1) * packageinfo.partsize, filepart, 0, part.size); upe.sendpackagepart(session, packageinfo, part.partid, filepart); UpdateStatus("Potwierdzanie wysłania paczki"); upe.confirmtransfer(session, packageinfo); #endregion UpdateStatus("Zamykanie połączenia"); upe.endsession(session); UpdateStatus("Paczka wysłania poprawnie"); catch (Exception ex) UpdateStatus(ex.Message); finally if (!String.IsNullOrEmpty(packagePath) && File.Exists(packagePath)) File.Delete(packagePath); /// <summary> /// Czyści formularz /// </summary> private void ClearForm() txtfilepath.text = null; txtsymbol.text = null; txtlastname.text = null; txtlogin.text = null; txtpassword.text = null; txtemail.text = null; files.clear(); BindRequestFiles(); /// <summary> /// Aktualizuje status /// </summary> /// <param name="message">treść wiadomośći</param> private void UpdateStatus(String message) Strona 19 z 21

lblstatus.visible =!string.isnullorempty(message); lblstatus.text = message; /// <summary> /// Binduje liste z plikami /// </summary> private void BindRequestFiles() listfiles.datasource = null; listfiles.datasource = files; #endregion #region Event handlers private void btnsend_click(object sender, EventArgs e) if (!ValidateForm()) UpdateStatus("Wystąpiły błędy podczas walidacji formularza"); return; SendRequest(); private void btnclear_click(object sender, EventArgs e) ClearForm(); private void btnbrowse_click(object sender, EventArgs e) using (OpenFileDialog openfiledialog = new OpenFileDialog()) openfiledialog.multiselect = false; openfiledialog.filter = "EAP XML Legislator *.zipx EAP *.lapx Edytor MSWiA *.zip"; if (openfiledialog.showdialog(this) == System.Windows.Forms.DialogResult.OK) txtfilepath.text = openfiledialog.filename; private void btnadd_click(object sender, EventArgs e) if (!String.IsNullOrEmpty(txtFilePath.Text) && File.Exists(txtFilePath.Text)) // sprawdzenie czy nie ma juz dodanego zalacznika o takiej samej nazwie string filename = Path.GetFileNameWithoutExtension(txtFilePath.Text).ToLower(); if (files.exists(x => Path.GetFileNameWithoutExtension(x.FileName).ToLower() == filename)) return; files.add(new RequestFile() FileName = txtfilepath.text ); BindRequestFiles(); txtfilepath.text = null; #endregion #region Classes Strona 20 z 21

/// <summary> /// Plik dołaczany do wniosku /// </summary> protected class RequestFile #region Properties public String FileName get; set; #endregion #region Methods public override string ToString() return Path.GetFileName(FileName); #endregion #endregion Strona 21 z 21