aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/setup/postgresql.php
blob: 893999bb0b90a08d3a8f8b2474a2ee552022f934 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
<?php
/**
 * @author Bart Visscher <bartv@thisnet.nl>
 * @author eduardo <eduardo@vnexu.net>
 * @author Joas Schilling <nickvergessen@owncloud.com>
 * @author Morris Jobke <hey@morrisjobke.de>
 * @author Roeland Jago Douma <rullzer@owncloud.com>
 * @author Thomas Müller <thomas.mueller@tmit.eu>
 *
 * @copyright Copyright (c) 2016, ownCloud, Inc.
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 */
namespace OC\Setup;

class PostgreSQL extends AbstractDatabase {
	public $dbprettyname = 'PostgreSQL';

	public function setupDatabase($username) {
		$e_host = addslashes($this->dbHost);
		$e_user = addslashes($this->dbUser);
		$e_password = addslashes($this->dbPassword);

		// Fix database with port connection
		if(strpos($e_host, ':')) {
			list($e_host, $port)=explode(':', $e_host, 2);
		} else {
			$port=false;
		}

		//check if the database user has admin rights
		$connection_string = "host='$e_host' dbname=postgres user='$e_user' port='$port' password='$e_password'";
		$connection = @pg_connect($connection_string);
		if(!$connection) {
			// Try if we can connect to the DB with the specified name
			$e_dbname = addslashes($this->dbName);
			$connection_string = "host='$e_host' dbname='$e_dbname' user='$e_user' port='$port' password='$e_password'";
			$connection = @pg_connect($connection_string);

			if(!$connection)
				throw new \OC\DatabaseSetupException($this->trans->t('PostgreSQL username and/or password not valid'),
						$this->trans->t('You need to enter either an existing account or the administrator.'));
		}
		$e_user = pg_escape_string($this->dbUser);
		//check for roles creation rights in postgresql
		$query="SELECT 1 FROM pg_roles WHERE rolcreaterole=TRUE AND rolname='$e_user'";
		$result = pg_query($connection, $query);
		if($result and pg_num_rows($result) > 0) {
			//use the admin login data for the new database user

			//add prefix to the postgresql user name to prevent collisions
			$this->dbUser='oc_'.$username;
			//create a new password so we don't need to store the admin config in the config file
			$this->dbPassword = \OC::$server->getSecureRandom()->generate(30, \OCP\Security\ISecureRandom::CHAR_LOWER.\OCP\Security\ISecureRandom::CHAR_DIGITS);

			$this->createDBUser($connection);
		}

		$systemConfig = \OC::$server->getSystemConfig();
		$systemConfig->setValues([
			'dbuser'		=> $this->dbUser,
			'dbpassword'	=> $this->dbPassword,
		]);

		//create the database
		$this->createDatabase($connection);

		// the connection to dbname=postgres is not needed anymore
		pg_close($connection);

		// connect to the ownCloud database (dbname=$this->dbname) and check if it needs to be filled
		$this->dbUser = $systemConfig->getValue('dbuser');
		$this->dbPassword = $systemConfig->getValue('dbpassword');

		$e_host = addslashes($this->dbHost);
		$e_dbname = addslashes($this->dbName);
		$e_user = addslashes($this->dbUser);
		$e_password = addslashes($this->dbPassword);

        	// Fix database with port connection
		if(strpos($e_host, ':')) {
			list($e_host, $port)=explode(':', $e_host, 2);
		} else {
			$port=false;
		}

		$connection_string = "host='$e_host' dbname='$e_dbname' user='$e_user' port='$port' password='$e_password'";
		$connection = @pg_connect($connection_string);
		if(!$connection) {
			throw new \OC\DatabaseSetupException($this->trans->t('PostgreSQL username and/or password not valid'),
					$this->trans->t('You need to enter either an existing account or the administrator.'));
		}
		$query = "select count(*) FROM pg_class WHERE relname='".$this->tablePrefix."users' limit 1";
		$result = pg_query($connection, $query);
		if($result) {
			$row = pg_fetch_row($result);
		}
		if(!$result or $row[0]==0) {
			\OC_DB::createDbFromStructure($this->dbDefinitionFile);
		}
	}

	private function createDatabase($connection) {
		//we can't use OC_BD functions here because we need to connect as the administrative user.
		$e_name = pg_escape_string($this->dbName);
		$e_user = pg_escape_string($this->dbUser);
		$query = "select datname from pg_database where datname = '$e_name'";
		$result = pg_query($connection, $query);
		if(!$result) {
			$entry = $this->trans->t('DB Error: "%s"', array(pg_last_error($connection))) . '<br />';
			$entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />';
			\OCP\Util::writeLog('setup.pg', $entry, \OCP\Util::WARN);
		}
		if(! pg_fetch_row($result)) {
			//The database does not exists... let's create it
			$query = "CREATE DATABASE \"$e_name\" OWNER \"$e_user\"";
			$result = pg_query($connection, $query);
			if(!$result) {
				$entry = $this->trans->t('DB Error: "%s"', array(pg_last_error($connection))) . '<br />';
				$entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />';
				\OCP\Util::writeLog('setup.pg', $entry, \OCP\Util::WARN);
			}
			else {
				$query = "REVOKE ALL PRIVILEGES ON DATABASE \"$e_name\" FROM PUBLIC";
				pg_query($connection, $query);
			}
		}
	}

	private function createDBUser($connection) {
		$e_name = pg_escape_string($this->dbUser);
		$e_password = pg_escape_string($this->dbPassword);
		$query = "select * from pg_roles where rolname='$e_name';";
		$result = pg_query($connection, $query);
		if(!$result) {
			$entry = $this->trans->t('DB Error: "%s"', array(pg_last_error($connection))) . '<br />';
			$entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />';
			\OCP\Util::writeLog('setup.pg', $entry, \OCP\Util::WARN);
		}

		if(! pg_fetch_row($result)) {
			//user does not exists let's create it :)
			$query = "CREATE USER \"$e_name\" CREATEDB PASSWORD '$e_password';";
			$result = pg_query($connection, $query);
			if(!$result) {
				$entry = $this->trans->t('DB Error: "%s"', array(pg_last_error($connection))) . '<br />';
				$entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />';
				\OCP\Util::writeLog('setup.pg', $entry, \OCP\Util::WARN);
			}
		}
		else { // change password of the existing role
			$query = "ALTER ROLE \"$e_name\" WITH PASSWORD '$e_password';";
			$result = pg_query($connection, $query);
			if(!$result) {
				$entry = $this->trans->t('DB Error: "%s"', array(pg_last_error($connection))) . '<br />';
				$entry .= $this->trans->t('Offending command was: "%s"', array($query)) . '<br />';
				\OCP\Util::writeLog('setup.pg', $entry, \OCP\Util::WARN);
			}
		}
	}
}
ld not be established" : "Nie można nawiązać połączenia z bazą danych Oracle", "Oracle username and/or password not valid" : "Zła nazwa użytkownika i/lub hasło do bazy danych Oracle", "PostgreSQL username and/or password not valid" : "Zła nazwa użytkownika i/lub hasło do bazy danych PostgreSQL", "You need to enter details of an existing account." : "Musisz wprowadzić szczegółowe dane dla istniejącego konta.", "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie jest wspierany i %s nie będzie działać poprawnie na tej platformie. Używasz go na własne ryzyko!", "For the best results, please consider using a GNU/Linux server instead." : "Aby uzyskać najlepszy efekt, rozważ użycie serwera GNU/Linux.", "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Wydaje się, że ta instancja %s używa PHP dla 32-bitowego środowiska, ponieważ open_basedir został tak skonfigurowany w php.ini. Doprowadzi to do problemów z plikami powyżej 4 GB i jest bardzo niezalecane.", "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Usuń ustawienie open_basedir w php.ini lub przełącz na PHP 64-bitowe.", "Set an admin username." : "Ustaw nazwę administratora.", "Set an admin password." : "Ustaw hasło administratora.", "Can't create or write into the data directory %s" : "Nie można tworzyć ani zapisywać w katalogu %s", "Invalid Federated Cloud ID" : "Nieprawidłowy ID Chmury Federalnej", "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Zaplecze do współdzielenia %s musi implementować interfejs OCP\\Share_Backend", "Sharing backend %s not found" : "Zaplecze %s do współdzielenia nie zostało znalezione", "Sharing backend for %s not found" : "Zaplecze do współdzielenia dla %s nie zostało znalezione", "%1$s shared »%2$s« with you and wants to add:" : "%1$s współdzieli »%2$s« z Tobą i chce dodać: ", "%1$s shared »%2$s« with you and wants to add" : " %1$s współdzieli »%2$s« z Tobą i chce dodać", "»%s« added a note to a file shared with you" : "»%s« dodał notatkę do pliku współdzielonego z Tobą", "Open »%s«" : "Otwórz »%s«", "%1$s via %2$s" : "%1$s przez %2$s", "You are not allowed to share %s" : "Nie możesz udostępnić %s", "Can’t increase permissions of %s" : "Nie można zwiększyć uprawnień %s", "Files can’t be shared with delete permissions" : "Pliki nie mogą zostać udostępnione z prawem do usuwania", "Files can’t be shared with create permissions" : "Pliki nie mogą zostać udostępnione z prawem do tworzenia", "Expiration date is in the past" : "Data ważności jest przeszła", "Can’t set expiration date more than %s days in the future" : "Nie można ustawić daty ważności na dłuższą niż %s dni", "%1$s shared »%2$s« with you" : "%1$s współdzieli »%2$s« z Tobą", "%1$s shared »%2$s« with you." : "%1$s współdzieli »%2$s« z Tobą.", "Click the button below to open it." : "Kliknij przycisk poniżej, aby otworzyć.", "The requested share does not exist anymore" : "Żądane współdzielenie już nie istnieje", "Could not find category \"%s\"" : "Nie można znaleźć kategorii \"%s\"", "Sunday" : "Niedziela", "Monday" : "Poniedziałek", "Tuesday" : "Wtorek", "Wednesday" : "Środa", "Thursday" : "Czwartek", "Friday" : "Piątek", "Saturday" : "Sobota", "Sun." : "Nd.", "Mon." : "Pon.", "Tue." : "Wt.", "Wed." : "Śr.", "Thu." : "Czw.", "Fri." : "Pt.", "Sat." : "Sob.", "Su" : "Nd", "Mo" : "Pn", "Tu" : "Wt", "We" : "Śr", "Th" : "Czw", "Fr" : "Pt", "Sa" : "Sob", "January" : "Styczeń", "February" : "Luty", "March" : "Marzec", "April" : "Kwiecień", "May" : "Maj", "June" : "Czerwiec", "July" : "Lipiec", "August" : "Sierpień", "September" : "Wrzesień", "October" : "Październik", "November" : "Listopad", "December" : "Grudzień", "Jan." : "Sty.", "Feb." : "Lut.", "Mar." : "Mar.", "Apr." : "Kwi.", "May." : "Maj", "Jun." : "Cze.", "Jul." : "Lip.", "Aug." : "Sie.", "Sep." : "Wrz.", "Oct." : "Paź.", "Nov." : "Lis.", "Dec." : "Gru.", "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "W nazwie użytkownika dozwolone są tylko następujące znaki : \"a-z\", \"A-Z\", \"0-9\" i \"_.@-'\"", "A valid username must be provided" : "Należy podać prawidłową nazwę użytkownika", "Username contains whitespace at the beginning or at the end" : "Nazwa użytkownika zawiera spację na początku albo na końcu", "Username must not consist of dots only" : "Nazwa użytkownika nie może się składać tylko z kropek", "A valid password must be provided" : "Należy podać prawidłowe hasło", "The username is already being used" : "Ta nazwa użytkownika jest już używana", "Could not create user" : "Nie można utworzyć użytkownika", "User disabled" : "Użytkownik zablokowany", "Login canceled by app" : "Logowanie anulowane przez aplikację", "App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Nie można zainstalować aplikacji \"%1$s\", ponieważ nie są spełnione następujące zależności: %2$s", "a safe home for all your data" : "bezpieczny dom dla wszystkich danych", "File is currently busy, please try again later" : "Plik jest obecnie niedostępny, spróbuj później", "Can't read file" : "Nie można odczytać pliku", "Application is not enabled" : "Aplikacja nie jest włączona", "Authentication error" : "Błąd uwierzytelniania", "Token expired. Please reload page." : "Token wygasł. Przeładuj stronę.", "No database drivers (sqlite, mysql, or postgresql) installed." : "Nie zainstalowano sterowników bazy danych (sqlite, mysql lub postgresql).", "Cannot write into \"config\" directory" : "Nie można zapisać do katalogu \"config\"", "Cannot write into \"apps\" directory" : "Nie można zapisać do katalogu \"apps\"", "This can usually be fixed by giving the webserver write access to the apps directory or disabling the appstore in the config file. See %s" : "Zwykle można to naprawić, nadając serwerowi WWW uprawnienia do zapisu do katalogu apps lub wyłączając sklep aplikacji w pliku config. Patrz %s", "Cannot create \"data\" directory" : "Nie mozna utworzyć katalogu \"data\"", "This can usually be fixed by giving the webserver write access to the root directory. See %s" : "Zwykle można to naprawić, nadając serwerowi WWW dostęp do zapisu do katalogu głównego. Zobacz %s", "Permissions can usually be fixed by giving the webserver write access to the root directory. See %s." : "Uprawnienia można zazwyczaj naprawić, nadając serwerowi WWW dostęp do zapisu do katalogu głównego. Zobacz %s.", "Setting locale to %s failed" : "Nie udało się zmienić języka na %s", "Please install one of these locales on your system and restart your webserver." : "Zainstaluj jedną z lokalizacji w swoim systemie i ponownie uruchom serwer WWW.", "Please ask your server administrator to install the module." : "Poproś administratora serwera o zainstalowanie modułu.", "PHP module %s not installed." : "Moduł PHP %s nie jest zainstalowany.", "PHP setting \"%s\" is not set to \"%s\"." : "Ustawienie PHP \"%s\" nie jest ustawione na \"%s\".", "Adjusting this setting in php.ini will make Nextcloud run again" : "Dostosowanie tego ustawienia w php.ini spowoduje ponowne uruchomienie Nextcloud", "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload jest ustawione na \"%s\" zamiast spodziewanej wartości \"0\"", "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Aby rozwiązać ten problem, ustaw <code>mbstring.func_overload</code> na <code>0</code> w pliku php.ini", "libxml2 2.7.0 is at least required. Currently %s is installed." : "Wymagana wersja dla libxml2 to przynajmniej 2.7.0. Aktualnie zainstalowana jest %s.", "To fix this issue update your libxml2 version and restart your web server." : "Aby rozwiązać ten problem, zaktualizuj wersję libxml2 i ponownie uruchom serwer WWW.", "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Wygląda na to, że PHP jest tak ustawione, aby wycinać bloki wklejonych dokumentów. Może to spowodować, że niektóre wbudowane aplikacje będą niedostępne.", "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Jest to prawdopodobnie spowodowane przez cache lub akcelerator, taki jak Zend OPcache lub eAccelerator.", "PHP modules have been installed, but they are still listed as missing?" : "Moduły PHP zostały zainstalowane, ale nadal brakuje ich na liście?", "Please ask your server administrator to restart the web server." : "Poproś administratora serwera o ponowne uruchomienie serwera WWW.", "PostgreSQL >= 9 required" : "Wymagany PostgreSQL >= 9", "Please upgrade your database version" : "Zaktualizuj wersję bazy danych", "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Zmień uprawnienia na 0770, aby katalog nie był widoczny dla innych użytkowników.", "Your data directory is readable by other users" : "Twój katalog danych jest widoczny dla innych użytkowników", "Your data directory must be an absolute path" : "Katalog danych musi mieć ścieżkę absolutną", "Check the value of \"datadirectory\" in your configuration" : "Sprawdź wartość \"datadirectory\" w swojej konfiguracji", "Your data directory is invalid" : "Katalog danych jest nieprawidłowy", "Ensure there is a file called \".ocdata\" in the root of the data directory." : "Upewnij się, że w katalogu \"data\" znajduje się plik o nazwie \".ocdata\".", "Action \"%s\" not supported or implemented." : "Akcja \"%s\" jest niewspierana lub niezaimplementowana.", "Authentication failed, wrong token or provider ID given" : "Uwierzytelnienie nie powiodło się, podano nieprawidłowy token lub ID dostawcy", "Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Brak parametrów w celu uzupełnienia żądania. Brakujące parametry: \"%s\"", "ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "ID \"%1$s\" jest już używany przez dostawcę chmury federacyjnej \"%2$s\"", "Cloud Federation Provider with ID: \"%s\" does not exist." : "Dostawca Chmury Federacyjnej o ID: \"%s\" nie istnieje.", "Could not obtain lock type %d on \"%s\"." : "Nie można uzyskać blokady typu %d na \"%s\".", "Storage unauthorized. %s" : "Magazyn nieautoryzowany. %s", "Storage incomplete configuration. %s" : "Niekompletna konfiguracja magazynu. %s", "Storage connection error. %s" : "Błąd połączenia z magazynem. %s", "Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny", "Storage connection timeout. %s" : "Limit czasu połączenia do magazynu. %s", "Library %s with a version higher than %s is required - available version %s." : "Biblioteka %s wymagana jest z wersją wyższą niż %s - dostępna wersja %s.", "Library %s with a version lower than %s is required - available version %s." : "Biblioteka %s wymagana jest w wersji niższej niż %s - dostępna wersja %s.", "Create" : "Utwórz", "Change" : "Zmień", "Delete" : "Usuń", "Share" : "Udostępnij", "Unlimited" : "Nieograniczony", "Verifying" : "Weryfikacja", "Verifying …" : "Weryfikacja…", "Verify" : "Zweryfikuj", "Sharing %s failed, because the backend does not allow shares from type %i" : "Udostępnianie %s nie udało się, ponieważ zaplecze nie pozwala na współdzielenie takiego typu jak %i", "Sharing %s failed, because the file does not exist" : "Udostępnianie %s nie powiodło się. ponieważ plik nie istnieje", "Sharing %s failed, because you can not share with yourself" : "Udostępnianie %s nie powiodło się, ponieważ nie możesz współdzielić z samym sobą", "Sharing %s failed, because the user %s does not exist" : "Udostępnianie %s nie powiodło się, ponieważ użytkownik %s nie istnieje", "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Udostępnianie %s nie powiodło się, ponieważ użytkownik %s nie jest członkiem żadnej grupy, której członkiem jest %s", "Sharing %s failed, because this item is already shared with %s" : "Udostępnianie %s nie powiodło się, ponieważ element jest już współdzielony z %s", "Sharing %s failed, because this item is already shared with user %s" : "Udostępnianie %s nie powiodło się, ponieważ element jest już współdzielony z użytkownikiem %s", "Sharing %s failed, because the group %s does not exist" : "Udostępnianie %s nie powiodło się, ponieważ grupa %s nie istnieje", "Sharing %s failed, because %s is not a member of the group %s" : "Udostępnianie %s nie powiodło się, ponieważ %s nie jest członkiem grupy %s", "You need to provide a password to create a public link, only protected links are allowed" : "Aby utworzyć link publiczny, musisz podać hasło, ponieważ dozwolone są tylko linki chronione", "Sharing %s failed, because sharing with links is not allowed" : "Udostępnianie %s nie powiodło się, ponieważ współdzielenie za pomocą linków jest niedozwolone", "Not allowed to create a federated share with the same user" : "Nie jest dozwolone tworzenie współdzielenia federacyjnego z tym samym użytkownikiem", "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Udostępnianie %s nie powiodło się, nie można znaleźć %s, może serwer jest obecnie nieosiągalny.", "Share type %s is not valid for %s" : "Typ udostępnienia %s jest nieprawidłowy dla %s", "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Nie można ustawić daty wygaśnięcia. Współdzielenie nie może wygasać później niż %s od momentu udostępnienia", "Cannot set expiration date. Expiration date is in the past" : "Nie można ustawić daty wygaśnięcia. Data wygaśnięcia jest w przeszłości.", "Sharing failed, because the user %s is the original sharer" : "Udostępnianie nie powiodło się, ponieważ użytkownik %s jest właścicielem współdzielenia", "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Udostępnianie %s nie powiodło się, ponieważ uprawnienia przekraczają uprawnieniom przyznanym %s", "Sharing %s failed, because resharing is not allowed" : "Udostępnianie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone", "Sharing %s failed, because the sharing backend for %s could not find its source" : "Udostępnianie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła", "Sharing %s failed, because the file could not be found in the file cache" : "Udostępnianie %s nie powiodło się, ponieważ nie można znaleźć pliku w pamięci podręcznej plików", "%s shared »%s« with you" : "%s współdzieli »%s« z Tobą", "%s shared »%s« with you." : "%s współdzieli »%s« z Tobą.", "%s via %s" : "%s przez %s", "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikacja \"%s\" nie może zostać zainstalowana, ponieważ nie są spełnione następujące zależności: %s", "ID \"%s\" already used by cloud federation provider \"%s\"" : "ID \"%s\" jest już używane przez dostawcę chmury federacyjnej \"%s\"", "Sharing %1$s failed, because the user %2$s does not exist" : "Udostępnianie %1$s nie powiodło się, ponieważ użytkownik %2$s nie istnieje", "Sharing %1$s failed, because the user %2$s is not a member of any groups that %3$s is a member of" : "Udostępnianie %1$s nie powiodło się, ponieważ użytkownik %2$s nie jest członkiem żadnej grupy, której członkiem jest %3$s", "Sharing %1$s failed, because this item is already shared with %2$s" : "Udostępnianie %1$s nie powiodło się, ponieważ ten element jest już współdzielony z %2$s", "Sharing %1$s failed, because this item is already shared with user %2$s" : "Udostępnianie %1$s nie powiodło się, ponieważ ten element jest już udostępniony użytkownikowi %2$s", "Sharing %1$s failed, because the group %2$s does not exist" : "Udostępnianie %1$s nie powiodło się, ponieważ grupa %2$s nie istnieje", "Sharing %1$s failed, because %2$s is not a member of the group %3$s" : "Udostępnianie %1$s nie powiodło się, ponieważ %2$s nie jest członkiem grupy %3$s", "Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable." : "Udostępnianie %1$s nie powiodło się, ponieważ nie udało się znaleźć %2$s, być może serwer jest obecnie nieosiągalny.", "Share type %1$s is not valid for %2$s" : "Typ udostępnienia %1$s jest nieprawidłowy dla %2$s", "Sharing %1$s failed, because the permissions exceed permissions granted to %2$s" : "Udostępnianie %1$s nie powiodło się, ponieważ uprawnienia przekraczają uprawnieniom przyznanym %2$s", "Sharing %1$s failed, because the sharing backend for %2$s could not find its source" : "Udostępnianie %1$s nie powiodło się, ponieważ zaplecze współdzielenia dla %2$s nie mogło znaleźć swojego źródła" },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);" }