@ -0,0 +1,206 @@ | |||
*** | |||
____ _ _ ____ _____ | |||
/ ___|| \ | |/ ___| ___| | |||
\___ \| \| | | | |_ | |||
___) | |\ | |___| _| | |||
|____/|_| \_|\____|_| | |||
____ _ ____ | |||
| _ \ ___ ___| | _____ _ __ / ___|___ _ __ ___ _ __ ___ ___ ___ | |||
| | | |/ _ \ / __| |/ / _ \ '__|____| | / _ \| '_ ` _ \| '_ \ / _ \/ __|/ _ \ | |||
| |_| | (_) | (__| < __/ | |_____| |__| (_) | | | | | | |_) | (_) \__ \ __/ | |||
|____/ \___/ \___|_|\_\___|_| \____\___/|_| |_| |_| .__/ \___/|___/\___| | |||
|_| | |||
*** | |||
## Setting up the Nextcloud containers | |||
# Changes in docker/compose/docker-compose.yml | |||
Go to docker-compose.yml and change all AAAAApw to your passwords. | |||
Then change example.org to your domain. | |||
# Install and start docker compose | |||
Point your domain to the public ip of your server. | |||
Enter the command to start dockerd after installing docker on your host system: | |||
```bash | |||
sudo systemctl start docker | |||
``` | |||
Install docker-compose on your host os and in the folder docker/compose do: | |||
```bash | |||
sudo docker-compose up | |||
``` | |||
## Setting up nextcloud with deb-rust-sncf container | |||
# Configure Nextcloud in the admin panel like in the SNCF Doku | |||
Then open example.org in your favourite browser, | |||
create admin account, uncheck install recommended apps. | |||
Do everything as described in sncf (uncheck things in settings, uninstall | |||
everything except forms, apporder) except the alternative custom css if you want | |||
a save button that does nothing than reload (nextcloud does already save realtime) | |||
but the realtime saving could be confusing for some users. | |||
custom css code for save button: | |||
```CSS | |||
#contactsmenu { | |||
display: none !important; | |||
} | |||
#appmenu { | |||
visibility: hidden; | |||
} | |||
#appmenu li:hover a, #appmenu li a:focus { | |||
font-size: 12px; | |||
} | |||
#appmenu li span { | |||
visibility: hidden; | |||
background-color: yellow; | |||
} | |||
#appmenu li svg { | |||
visibility: hidden; | |||
background-color: yellow; | |||
} | |||
#appmenu li a:last-child::after { | |||
content: "Save"; | |||
#padding: 10px; | |||
#margin: 10px; | |||
height: 50%; | |||
width: 200%; | |||
padding-top: 7px; | |||
padding-right: 6px; | |||
#padding-bottom: 10px; | |||
padding-left: 10px; | |||
visibility: visible; | |||
background-color: rgba(237, 237, 237, .7); | |||
color: black; | |||
#text-shadow: 0px 0px 8px black; | |||
font-family: "Mono", Courier, monospace; | |||
font-weight: bold; | |||
border: 1px solid rgba(237, 237, 237, .7); | |||
border-radius: 15px; | |||
} | |||
#appmenu li a:last-child:hover:after { | |||
background-color: rgba(237, 237, 237, 0.7); | |||
border: 1px solid rgba(77, 77, 77, 0.3); | |||
#background-color: #fbc617; | |||
visibility: visible; | |||
} | |||
#appmenu li a:last-child:focus:after { | |||
content: "✓Save"; | |||
background-color: rgba(237, 237, 237, 0.7); | |||
border: 1px solid rgba(77, 77, 77, 0.3); | |||
#background-color: #fbc617; | |||
visibility: visible; | |||
} | |||
#settings { | |||
display:none !important; | |||
} | |||
.app-sidebar-tabs__content > ul:nth-child(2) { | |||
display:none !important; | |||
} | |||
.app-sidebar-tabs__content > ul:nth-child(4) > li:nth-child(1) { | |||
display:none !important; | |||
} | |||
.app-sidebar-tabs__content > ul:nth-child(4) > li:nth-child(2) { | |||
display:none !important; | |||
} | |||
``` | |||
# Change nextcloud config for deb-rust-sncf | |||
then changes (with your domain) in config.php | |||
(/opt/docker/overlays/nextcloud/html/config): | |||
```PHP | |||
'simpleSignUpLink.shown' => false | |||
'defaultapp' => 'apporder' | |||
'trusted_domains' => | |||
array ( | |||
0 => 'nextcloud-web', | |||
1 => 'example.org', | |||
), | |||
'trusted_proxies' => ['traefik', 'deb-rust-sncf'], | |||
'overwrite.cli.url' => 'http://example.org', | |||
``` | |||
get the updated config.php in your nextcloud instance with the following command: | |||
```bash | |||
docker exec -u www-data nextcloud php occ files:scan --all | |||
``` | |||
# Change nextcloud definition in compose file and uncomment deb-rust-sncf | |||
Then open the docker-compose.yml file, comment all labels of the container | |||
nextcloud-web. | |||
Now uncomment the whole deb-rust-sncf container. | |||
If you want to customize the landing or link page, some files are exposed already | |||
(and then copied in the container during build) in the folder build/deb-rust-sncf | |||
Regarding the sncf proxy, the files link.html and forward.rs have changes. | |||
These changes give the functionality to send the admin link to users mail. | |||
Until now, the post http request and the mail adress are saved in a file on the | |||
container deb-rust-sncf. | |||
# Configure rust build withing deb-rust-sncf | |||
Go to docker/build/deb-rust-sncf anyway and make changes in config.toml according | |||
the sncf wiki. | |||
Change the passwords AAAAA and example.org to your domain. | |||
# Remove and restart all containers | |||
Now stop all containers with either issuing | |||
```bash | |||
sudo docker-compose stop | |||
``` | |||
or pressing `Ctrl-C` | |||
Delete the WHOLE network with the command | |||
```bash | |||
sudo docker system prune --all | |||
``` | |||
Then restart with | |||
```bash | |||
sudo docker-compose up | |||
``` | |||
in the folder docker/compose | |||
@ -0,0 +1,42 @@ | |||
FROM rust:slim | |||
WORKDIR /opt | |||
# Install needed dependecies | |||
RUN echo "deb http://ftp.de.debian.org/debian unstable main contrib" | tee -a /etc/apt/sources.list | |||
RUN apt-get update && apt-get install -y libmysql++-dev git | |||
RUN git clone https://git.42l.fr/neil/sncf.git | |||
WORKDIR /opt/sncf | |||
COPY config.toml /opt/sncf/config.toml | |||
# graphics individualization | |||
COPY Digi_3corner_up.png /opt/sncf/templates/assets/logo.svg | |||
COPY white-background.png /opt/sncf/templates/assets/index-background.png | |||
COPY Digi_3corner.png /opt/sncf/templates/assets/flavicon.ico | |||
COPY index.css /opt/sncf/templates/assets/index.css | |||
COPY index.html /opt/sncf/templates/index.html | |||
COPY link.html /opt/sncf/templates/link.html | |||
COPY forward.rs /opt/sncf/src/forward.rs | |||
#COPY templates.rs /opt/sncf/src/templates.rs | |||
# The written is just firstly a hack | |||
COPY lang.json /opt/sncf/lang.json | |||
CMD cargo run --no-default-features --features mysql | |||
@ -0,0 +1,34 @@ | |||
# The address and port sncf will listen | |||
listening_address = "0.0.0.0" | |||
listening_port = 8000 | |||
# Public-facing domain for sncf. | |||
# includes protocol, FQDN and port, without the trailing slash. | |||
sncf_url = "http://example.org" | |||
# SQLite: path to the SQLite DB | |||
# PostgreSQL: postgres://user:password@address:port/database | |||
# MySQL: mysql://user:password@address:port/database | |||
database_path = "mysql://nextcloud:AAAAAAAAAAAAAAAAAAAAAAAAAAAAMYSQL@nextcloud-db:3306/nextcloud" | |||
# IP address of the Nextcloud instance, including protocol and port | |||
nextcloud_url = "http://nextcloud-web:80" | |||
# Nextcloud admin account credentials | |||
# TODO hash adminpw | |||
admin_username = "AAAAAAAAAAAusername" | |||
admin_password = "AAAAAAAAAadminpw" | |||
# How many days of inactivity for an admin token before deleting NC accounts | |||
prune_days = 40 | |||
# Displays route names and a lot of information | |||
debug_mode = true | |||
# Used to encrypt csrf tokens and csrf cookies. | |||
# Generate random bytes: openssl rand -base64 32 | |||
# Then paste the result in this variable | |||
cookie_key = "Af3v5KMNPmwYYBRRjm/W5ds1rHDdyCEvpxVTMLKEKl0=" | |||
# Don't touch this unless you know what you're doing | |||
config_version = 2 |
@ -0,0 +1,438 @@ | |||
use actix_web::client::{Client, ClientRequest}; | |||
use actix_web::{http, web, HttpRequest, HttpResponse}; | |||
use askama::Template; | |||
use chrono::Utc; | |||
use regex::Regex; | |||
use std::time::Duration; | |||
use url::Url; | |||
use csrf::{AesGcmCsrfProtection, CsrfProtection}; | |||
use crate::config::get_csrf_key; | |||
use crate::account::*; | |||
use crate::config::PAYLOAD_LIMIT; | |||
use crate::config::PROXY_TIMEOUT; | |||
use crate::database::methods::InsertableForm; | |||
use crate::database::structs::Form; | |||
use crate::debug; | |||
use crate::errors::{crash, TrainCrash}; | |||
use crate::sniff::*; | |||
use crate::templates::*; | |||
use crate::DbPool; | |||
use crate::CONFIG; | |||
pub async fn forward( | |||
req: HttpRequest, | |||
body: web::Bytes, | |||
url: web::Data<Url>, | |||
client: web::Data<Client>, | |||
) -> Result<HttpResponse, TrainCrash> { | |||
let route = req.uri().path(); | |||
if route == "/link/email" { | |||
let email_request_headers = &req; | |||
let email_body = &body; | |||
//let mut body = String::new(); | |||
let forged_emailheaders = format!( | |||
"{:?}", | |||
email_request_headers | |||
); | |||
let forged_emailbody = format!( | |||
"{:?}", | |||
email_body | |||
); | |||
//let body = email_response_body.escape_ascii().to_string(); | |||
/*email_response_body.read_to_string(&mut body)?;*/ | |||
// does not work, because body is in bytes format. | |||
println!("da budy {}",forged_emailbody ); | |||
println!("da headers {}",forged_emailheaders); | |||
use std::io::Write; | |||
use std::fs::OpenOptions; | |||
let mut f = OpenOptions::new() | |||
.append(true) | |||
.create(true) // Optionally create the file if it doesn't already exist | |||
.open("/tmp/foo") | |||
.expect("Unable to open file"); | |||
//let body_bytes = as_bytes!("{:?}", body); | |||
f.write_all(forged_emailheaders.as_bytes()).expect("Unable to write data"); | |||
f.write_all(forged_emailbody.as_bytes()).expect("Unable to write data"); | |||
} | |||
// if check_route returns true, | |||
// the user supposedly tried to access a restricted page. | |||
// They get redirected to the main page. | |||
if check_route(route) { | |||
debug(&format!("Restricted route blocked: {}", route)); | |||
return Ok(web_redir("/").await.map_err(|e| { | |||
eprintln!("error_redirect: {}", e); | |||
crash(get_lang(&req), "error_redirect") | |||
})?); | |||
} | |||
let forwarded_req = forge_from(route, &req, &url, &client); | |||
// check the request before sending it | |||
// (prevents the user from sending some specific POST requests) | |||
if check_request(route, &body) { | |||
debug(&format!( | |||
"Restricted request: {}", | |||
String::from_utf8_lossy(&body) | |||
)); | |||
return Err(crash(get_lang(&req), "error_dirtyhacker")); | |||
} | |||
// send the request to the Nextcloud instance | |||
let mut res = forwarded_req.send_body(body).await.map_err(|e| { | |||
eprintln!("error_forward_resp: {}", e); | |||
crash(get_lang(&req), "error_forward_req") | |||
})?; | |||
let mut client_resp = HttpResponse::build(res.status()); | |||
// remove connection as per the spec | |||
// and content-encoding since we have to decompress the traffic to edit it | |||
// and basic-auth, because this feature is not needed. | |||
for (header_name, header_value) in res | |||
.headers() | |||
.iter() | |||
.filter(|(h, _)| *h != "connection" && *h != "content-encoding") | |||
{ | |||
client_resp.header(header_name.clone(), header_value.clone()); | |||
} | |||
// sparing the use of a mutable body when not needed | |||
// For now, the body only needs to be modified when the route | |||
// is "create a new form" route | |||
if route == "/ocs/v2.php/apps/forms/api/v1/form" { | |||
// retreive the body from the request result | |||
let response_body = res.body().limit(PAYLOAD_LIMIT).await.map_err(|e| { | |||
eprintln!("error_forward_resp: {}", e); | |||
crash(get_lang(&req), "error_forward_resp") | |||
})?; | |||
// if a new form is created, automatically set some fields. | |||
// this is very hackish but it works! for now. | |||
let form_id = check_new_form(&response_body); | |||
if form_id > 0 { | |||
debug(&format!( | |||
"New form. Forging request to set isAnonymous for id {}", | |||
form_id | |||
)); | |||
let forged_body = format!( | |||
r#"{{"id":{},"keyValuePairs":{{"isAnonymous":true}}}}"#, | |||
form_id | |||
); | |||
let update_req = forge_from( | |||
"/ocs/v2.php/apps/forms/api/v1/form/update", | |||
&req, | |||
&url, | |||
&client, | |||
) | |||
.set_header("content-length", forged_body.len()) | |||
.set_header("content-type", "application/json;charset=utf-8"); | |||
let res = update_req.send_body(forged_body).await.map_err(|e| { | |||
eprintln!("error_forward_isanon: {}", e); | |||
crash(get_lang(&req), "error_forward_isanon") | |||
})?; | |||
debug(&format!("(new_form) Request returned {}", res.status())); | |||
} | |||
Ok(client_resp.body(response_body).await.map_err(|e| { | |||
eprintln!("error_forward_clientresp_newform: {}", e); | |||
crash(get_lang(&req), "error_forward_clientresp_newform") | |||
})?) | |||
} else { | |||
Ok( | |||
client_resp.body(res.body().limit(PAYLOAD_LIMIT).await.map_err(|e| { | |||
eprintln!("error_forward_clientresp_newform: {}", e); | |||
crash(get_lang(&req), "error_forward_clientresp_std") | |||
})?), | |||
) | |||
} | |||
// check the response before returning it (unused) | |||
/*if check_response(route, &response_body) { | |||
return Ok(web_redir("/")); | |||
}*/ | |||
} | |||
#[derive(Deserialize)] | |||
pub struct LoginToken { | |||
pub token: String, | |||
} | |||
#[derive(Deserialize)] | |||
pub struct CsrfToken { | |||
pub csrf_token: String, | |||
} | |||
pub async fn forward_login( | |||
req: HttpRequest, | |||
params: web::Path<LoginToken>, | |||
client: web::Data<Client>, | |||
dbpool: web::Data<DbPool>, | |||
) -> Result<HttpResponse, TrainCrash> { | |||
// if the user is already logged in, redirect to the Forms app | |||
if is_logged_in(&req).is_some() { | |||
return Ok(web_redir("/apps/forms").await.map_err(|e| { | |||
eprintln!("error_redirect (1:/apps/forms/): {}", e); | |||
crash(get_lang(&req), "error_redirect") | |||
})?); | |||
} | |||
// check if the provided token seems valid. If not, early return. | |||
if !check_token(¶ms.token) { | |||
debug("Incorrect admin token given in params."); | |||
debug(&format!("Token: {:#?}", params.token)); | |||
return Err(crash(get_lang(&req), "error_dirtyhacker")); | |||
} | |||
let conn = dbpool.get().map_err(|e| { | |||
eprintln!("error_forwardlogin_db: {}", e); | |||
crash(get_lang(&req), "error_forwardlogin_db") | |||
})?; | |||
// check if the link exists in DB. if it does, update lastvisit_at. | |||
let formdata = web::block(move || Form::get_from_token(¶ms.token, &conn)) | |||
.await | |||
.map_err(|e| { | |||
eprintln!("error_forwardlogin_db_get (diesel error): {}", e); | |||
crash(get_lang(&req), "error_forwardlogin_db_get") | |||
})? | |||
.ok_or_else(|| { | |||
debug("Token not found."); | |||
crash(get_lang(&req), "error_forwardlogin_notfound") | |||
})?; | |||
// else, try to log the user in with DB data, then redirect. | |||
login(&client, &req, &formdata.nc_username, &formdata.nc_password).await | |||
} | |||
// creates a NC account using a random name and password. | |||
// the account gets associated with a token in sqlite DB. | |||
pub async fn forward_register( | |||
req: HttpRequest, | |||
csrf_post: web::Form<CsrfToken>, | |||
client: web::Data<Client>, | |||
dbpool: web::Data<DbPool>, | |||
) -> Result<HttpResponse, TrainCrash> { | |||
let lang = get_lang(&req); | |||
// if the user is already logged in, redirect to the Forms app | |||
if is_logged_in(&req).is_some() { | |||
return Ok(web_redir("/apps/forms").await.map_err(|e| { | |||
eprintln!("error_redirect (2:/apps/forms/): {}", e); | |||
crash(get_lang(&req), "error_redirect") | |||
})?); | |||
} | |||
// if the user has already generated an admin token, redirect too | |||
if let Some(token) = has_admintoken(&req) { | |||
lazy_static! { | |||
static ref RE: Regex = Regex::new(r#"sncf_admin_token=(?P<token>[0-9A-Za-z_\-]*)"#) | |||
.expect("Error while parsing the sncf_admin_token regex"); | |||
} | |||
let admin_token = RE | |||
.captures(&token) | |||
.ok_or_else(|| { | |||
eprintln!("error_forwardregister_tokenparse (no capture)"); | |||
crash(get_lang(&req), "error_forwardregister_tokenparse") | |||
})? | |||
.name("token") | |||
.ok_or_else(|| { | |||
eprintln!("error_forwardregister_tokenparse (no capture named token)"); | |||
crash(get_lang(&req), "error_forwardregister_tokenparse") | |||
})? | |||
.as_str(); | |||
// sanitize the token beforehand, cookies are unsafe | |||
if check_token(&admin_token) { | |||
return Ok( | |||
web_redir(&format!("{}/admin/{}", CONFIG.sncf_url, &admin_token)) | |||
.await | |||
.map_err(|e| { | |||
eprintln!("error_redirect (admin): {}", e); | |||
crash(get_lang(&req), "error_redirect") | |||
})?, | |||
); | |||
} else { | |||
debug("Incorrect admin token given in cookies."); | |||
debug(&format!("Token: {:#?}", &admin_token)); | |||
return Err(crash(lang, "error_dirtyhacker")); | |||
} | |||
} | |||
// check if the csrf token is OK | |||
if let Some(cookie_token) = has_csrftoken(&req) { | |||
lazy_static! { | |||
static ref RE: Regex = Regex::new(r#"sncf_csrf_cookie=(?P<token>[0-9A-Za-z_\-]*)"#) | |||
.expect("Error while parsing the sncf_csrf_cookie regex"); | |||
} | |||
let cookie_csrf_token = RE | |||
.captures(&cookie_token) | |||
.ok_or_else(|| { | |||
eprintln!("error_csrf_cookie: no capture"); | |||
crash(get_lang(&req), "error_csrf_cookie") | |||
})? | |||
.name("token") | |||
.ok_or_else(|| { | |||
eprintln!("error_csrf_cookie: no capture named token"); | |||
crash(get_lang(&req), "error_csrf_cookie") | |||
})? | |||
.as_str(); | |||
let raw_ctoken = base64::decode_config(cookie_csrf_token.as_bytes(), base64::URL_SAFE_NO_PAD).map_err(|e| { | |||
eprintln!("error_csrf_cookie (base64): {}", e); | |||
crash(get_lang(&req), "error_csrf_cookie") | |||
})?; | |||
let raw_token = base64::decode_config(csrf_post.csrf_token.as_bytes(), base64::URL_SAFE_NO_PAD).map_err(|e| { | |||
eprintln!("error_csrf_token (base64): {}", e); | |||
crash(get_lang(&req), "error_csrf_token") | |||
})?; | |||
let seed = AesGcmCsrfProtection::from_key(get_csrf_key()); | |||
let parsed_token = seed.parse_token(&raw_token).expect("token not parsed"); | |||
let parsed_cookie = seed.parse_cookie(&raw_ctoken).expect("cookie not parsed"); | |||
if !seed.verify_token_pair(&parsed_token, &parsed_cookie) { | |||
debug("warn: CSRF token doesn't match."); | |||
return Err(crash(lang, "error_csrf_token")); | |||
} | |||
} | |||
else { | |||
debug("warn: missing CSRF token."); | |||
return Err(crash(lang, "error_csrf_cookie")); | |||
} | |||
let nc_username = gen_name(); | |||
println!("gen_name: {}", nc_username); | |||
let nc_password = gen_token(45); | |||
// attempts to create the account | |||
create_account(&client, &nc_username, &nc_password, lang.clone()).await?; | |||
debug(&format!("Created user {}", nc_username)); | |||
let conn = dbpool.get().map_err(|e| { | |||
eprintln!("error_forwardregister_pool: {}", e); | |||
crash(lang.clone(), "error_forwardregister_pool") | |||
})?; | |||
let token = gen_token(45); | |||
let token_mv = token.clone(); | |||
// store the result in DB | |||
let form_result = web::block(move || Form::insert( | |||
InsertableForm { | |||
created_at: Utc::now().naive_utc(), | |||
lastvisit_at: Utc::now().naive_utc(), | |||
token: token_mv, | |||
nc_username, | |||
nc_password, | |||
}, | |||
&conn, | |||
)) | |||
.await; | |||
if form_result.is_err() { | |||
return Err(crash(lang, "error_forwardregister_db")); | |||
} | |||
Ok(HttpResponse::Ok() | |||
.content_type("text/html") | |||
.set_header( | |||
"Set-Cookie", | |||
format!("sncf_admin_token={}; HttpOnly; SameSite=Strict", &token), | |||
) | |||
.body( | |||
TplLink { | |||
lang: &lang, | |||
admin_token: &token, | |||
config: &CONFIG, | |||
} | |||
.render() | |||
.map_err(|e| { | |||
eprintln!("error_tplrender (TplLink): {}", e); | |||
crash(lang.clone(), "error_tplrender") | |||
})?, | |||
) | |||
.await | |||
.map_err(|e| { | |||
eprintln!("error_tplrender_resp (TplLink): {}", e); | |||
crash(lang, "error_tplrender_resp") | |||
})?) | |||
} | |||
// create a new query destined to the nextcloud instance | |||
// needed to forward any query | |||
fn forge_from( | |||
route: &str, | |||
req: &HttpRequest, | |||
url: &web::Data<Url>, | |||
client: &web::Data<Client>, | |||
) -> ClientRequest { | |||
let mut new_url = url.get_ref().clone(); | |||
new_url.set_path(route); | |||
new_url.set_query(req.uri().query()); | |||
// insert forwarded header if we can | |||
let mut forwarded_req = client | |||
.request_from(new_url.as_str(), req.head()) | |||
.timeout(Duration::new(PROXY_TIMEOUT, 0)); | |||
// attempt to remove basic-auth header | |||
forwarded_req.headers_mut().remove("authorization"); | |||
if let Some(addr) = req.head().peer_addr { | |||
forwarded_req.header("x-forwarded-for", format!("{}", addr.ip())) | |||
} else { | |||
forwarded_req | |||
} | |||
} | |||
fn web_redir(location: &str) -> HttpResponse { | |||
HttpResponse::SeeOther() | |||
.header(http::header::LOCATION, location) | |||
.finish() | |||
} | |||
pub async fn index(req: HttpRequest) -> Result<HttpResponse, TrainCrash> { | |||
let seed = AesGcmCsrfProtection::from_key(get_csrf_key()); | |||
let (csrf_token, csrf_cookie) = seed.generate_token_pair(None, 43200) | |||
.expect("couldn't generate token/cookie pair"); | |||
Ok(HttpResponse::Ok() | |||
.content_type("text/html") | |||
.set_header( | |||
"Set-Cookie", | |||
format!("sncf_csrf_cookie={}; HttpOnly; SameSite=Strict", | |||
base64::encode_config(&csrf_cookie.value(), base64::URL_SAFE_NO_PAD))) | |||
.body( | |||
TplIndex { | |||
lang: &get_lang(&req), | |||
csrf_token: &base64::encode_config(&csrf_token.value(), base64::URL_SAFE_NO_PAD), | |||
} | |||
.render() | |||
.map_err(|e| { | |||
eprintln!("error_tplrender (TplIndex): {}", e); | |||
crash(get_lang(&req), "error_tplrender") | |||
})?, | |||
) | |||
.await | |||
.map_err(|e| { | |||
eprintln!("error_tplrender_resp (TplIndex): {}", e); | |||
crash(get_lang(&req), "error_tplrender_resp") | |||
})?) | |||
} | |||
@ -0,0 +1,281 @@ | |||
@font-face { | |||
font-family: 'Ubuntu-R'; | |||
src: url('/assets/Ubuntu-R.ttf'); | |||
font-weight: normal; | |||
font-style: normal; | |||
} | |||
.hidden { | |||
display: none !important; | |||
} | |||
* { | |||
font-family: Ubuntu,"Ubuntu-R",sans-serif; | |||
} | |||
a { | |||
text-decoration: none; | |||
color: #2359fb; | |||
} | |||
.flex { | |||
display: flex; | |||
flex-wrap: wrap; | |||
justify-content: center; | |||
} | |||
.fullheight { | |||
min-height: 100vh; | |||
} | |||
.fullheight-nav { | |||
min-height: calc(100vh - 50px); | |||
} | |||
.fullwidth { | |||
width: 100%; | |||
text-align: center; | |||
} | |||
.title { | |||
color: white; | |||
text-shadow: 0 0 5px rgba(0, 0, 0, 0.18),0 5px 5px rgba(0, 0, 0, 0.18); | |||
} | |||
h1 { | |||
font-size: 4vw; | |||
} | |||
h2 { | |||
font-size: 2.25vw; | |||
} | |||
h3 { | |||
font-size: 1.75vw; | |||
} | |||
p { | |||
font-size: 1.25vw; | |||
line-height: 1.6; | |||
} | |||
.beta-tag { | |||
background: #f47606; | |||
color: white; | |||
border-radius: 5px; | |||
font-size: 0.9rem; | |||
padding: 0.3rem; | |||
margin-left: 0.5rem; | |||
} | |||
.beta-banner a { | |||
color: #ffeb7f; | |||
} | |||
.beta-banner { | |||
background: repeating-linear-gradient( 45deg, #d56009, #d56009 10px, #c44c05 10px, #c44c05 20px ); | |||
color: white; | |||
padding: 1rem; | |||
text-shadow: 0 0 5px rgba(0, 0, 0, 0.18),0 5px 5px rgba(0, 0, 0, 0.18); | |||
} | |||
.logo { | |||
width: 10vw; | |||
margin-right: 2vw; | |||
} | |||
.page-heading { | |||
background-image: url("/assets/index-background.png"), linear-gradient(0deg, #1f58c6 0%, #1c66f2 100%); | |||
background-position: 50% 50%; | |||
background-repeat: no-repeat; | |||
background-size: cover; | |||
background-attachment: fixed; | |||
} | |||
.page-heading-text { | |||
width: auto; | |||
margin: auto; | |||
padding: 1rem; | |||
} | |||
.page-heading > p { | |||
color: white; | |||
} | |||
.page-heading > p > a { | |||
color: #c3cce8; | |||
} | |||
.page-heading.error { | |||
background: url("/assets/index-background.png"), linear-gradient(0deg, #790000 0%, #a40000 100%) | |||
} | |||
.ncstyle-button.error { | |||
background: #ee4040; | |||
} | |||
.error.ncstyle-button:hover { | |||
background: #c82323; | |||
} | |||
.navbar { | |||
height: 50px; | |||
} | |||
body, html { | |||
margin: 0; | |||
padding: 0; | |||
} | |||
.ncstyle-button { | |||
color: #FFF; | |||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.18),0 5px 5px rgba(0, 0, 0, 0.18); | |||
border-radius: 1vw; | |||
text-decoration: none; | |||
text-shadow: 0 0 5px rgba(0, 0, 0, 0.18),0 5px 5px rgba(0, 0, 0, 0.18); | |||
white-space: nowrap; | |||
height: max-content; | |||
line-height: 2.25rem; | |||
padding: 2vh 3vw; | |||
background: #2a87ff; | |||
font-size: 1.5vw; | |||
min-width: 18vw; | |||
display: block; | |||
transition: all .25s ease-in-out; | |||
} | |||
.margin-bottom { | |||
margin-bottom: 1rem; | |||
} | |||
.ncstyle-button:hover { | |||
background: #2478e3; | |||
} | |||
.ncstyle-input { | |||
margin: auto; | |||
padding: 7px 6px; | |||
font-size: 16px; | |||
background-color: white; | |||
color: #454545; | |||
border: 1px solid #dbdbdb; | |||
outline: none; | |||
border-radius: 3px; | |||
cursor: text; | |||
width: 50vw; | |||
} | |||
.click { | |||
cursor: pointer; | |||
} | |||
#script-copy { | |||
display: none; | |||
} | |||
@media only screen and (max-width: 1080px) { | |||
h1 { | |||
font-size: 48px; | |||
} | |||
h2 { | |||
font-size: 32px; | |||
} | |||
h3 { | |||
font-size: 24px; | |||
} | |||
p { | |||
font-size: 16px; | |||
} | |||
.title { | |||
text-align: center; | |||
} | |||
.logo { | |||
width: 20vw; | |||
margin: 0; | |||
} | |||
.ncstyle-button { | |||
font-size: 24px; | |||
} | |||
} | |||
@media only screen and (max-width: 1080px), screen and (max-height: 600px) { | |||
.scroll-down-arrow { | |||
display: none; | |||
} | |||
} | |||
.scroll-down-arrow { | |||
background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0iQ2hldnJvbl90aGluX2Rvd24iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB2aWV3Qm94PSIwIDAgMjAgMjAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDIwIDIwIiBmaWxsPSJ3aGl0ZSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PHBhdGggZD0iTTE3LjQxOCw2LjEwOWMwLjI3Mi0wLjI2OCwwLjcwOS0wLjI2OCwwLjk3OSwwYzAuMjcsMC4yNjgsMC4yNzEsMC43MDEsMCwwLjk2OWwtNy45MDgsNy44M2MtMC4yNywwLjI2OC0wLjcwNywwLjI2OC0wLjk3OSwwbC03LjkwOC03LjgzYy0wLjI3LTAuMjY4LTAuMjctMC43MDEsMC0wLjk2OWMwLjI3MS0wLjI2OCwwLjcwOS0wLjI2OCwwLjk3OSwwTDEwLDEzLjI1TDE3LjQxOCw2LjEwOXoiLz48L3N2Zz4=); | |||
background-size: contain; | |||
background-repeat: no-repeat; | |||
} | |||
.scroll-down-link { | |||
cursor:pointer; | |||
height: 60px; | |||
width: 80px; | |||
margin: 0px 0 0 -40px; | |||
line-height: 60px; | |||
position: absolute; | |||
left: 50%; | |||
bottom: 10px; | |||
color: #FFF; | |||
text-align: center; | |||
font-size: 70px; | |||
z-index: 100; | |||
text-decoration: none; | |||
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.4); | |||
animation: fade_move_down 2s ease-in-out infinite; | |||
} | |||
/*animated scroll arrow animation*/ | |||
@keyframes fade_move_down { | |||
0% { transform:translate(0,-20px); opacity: 0; } | |||
50% { opacity: 1; } | |||
100% { transform:translate(0,20px); opacity: 0; } | |||
} | |||
.lds-ring { | |||
display: inline-block; | |||
position: relative; | |||
width: 80px; | |||
height: 80px; | |||
} | |||
.lds-ring div { | |||
box-sizing: border-box; | |||
display: block; | |||
position: absolute; | |||
width: 64px; | |||
height: 64px; | |||
margin: 8px; | |||
border: 8px solid #fff; | |||
border-radius: 50%; | |||
animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; | |||
border-color: #fff transparent transparent transparent; | |||
} | |||
.lds-ring div:nth-child(1) { | |||
animation-delay: -0.45s; | |||
} | |||
.lds-ring div:nth-child(2) { | |||
animation-delay: -0.3s; | |||
} | |||
.lds-ring div:nth-child(3) { | |||
animation-delay: -0.15s; | |||
} | |||
@keyframes lds-ring { | |||
0% { | |||
transform: rotate(0deg); | |||
} | |||
100% { | |||
transform: rotate(360deg); | |||
} | |||
} | |||
@ -0,0 +1,148 @@ | |||
<!doctype html> | |||
<html lang="{{ "lang_code"|tr(lang) }}"> | |||
<head> | |||
<title>{{ "index_title"|tr(lang) }} – {{ "index_description"|tr(lang) }}</title> | |||
<meta charset="utf-8" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||
<meta name="description" content="{{ "meta_description"|tr(lang) }}" /> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |||
<link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon.ico" /> | |||
<link rel="stylesheet" href="/assets/index.css?v=1.2" /> | |||
<link rel="stylesheet" href="/assets/cloud.css?v=1.0" /> | |||
<noscript><style> .jsonly { display: none } </style></noscript> | |||
<script> | |||
/* junk javascript with basic spambot protection features. | |||
Drunk indentation is vim's fault. | |||
unsatisifed? Please make a PR. : ) */ | |||
window.onload = function() { | |||
// retrieved from server-side template | |||
let csrf_token = "{{ csrf_token }}"; | |||
document.getElementById('new_link_button').addEventListener('click', function () { | |||
new_link(csrf_token); | |||
}); | |||
} | |||
function new_link(csrf) { | |||
document.getElementById("csrf_token").value = csrf; | |||
document.getElementById('new_link').submit(); | |||
document.getElementById('new_link_button').classList.add("hidden"); | |||
document.getElementById('loading_ring').classList.remove("hidden"); | |||
} | |||
</script> | |||
</head> | |||
<body> | |||
<div class="flex page-heading fullheight"> | |||
<div class="flex page-heading-text"> | |||
<div class="flex"> | |||
<a class="flex" href="https://42l.fr"><img class="logo" src="/assets/logo.svg" /></a> | |||
</div> | |||
<div> | |||
<h1 class="title">{{ "index_title"|tr(lang) }}<sup class="beta-tag">{{ "index_beta_tag"|tr(lang) }}</sup></h1> | |||
<h2 class="title">{{ "index_description"|tr(lang) }}</h2> | |||
</div> | |||
</div> | |||
<div class="fullwidth flex"> | |||
</div> | |||
<div class="fullwidth flex"> | |||
<noscript> | |||
<a class="ncstyle-button margin-bottom">{{ "index_nojs"|tr(lang) }}</a> | |||
</noscript> | |||
<form id="new_link" action="/link" method="post"> | |||
<input id="csrf_token" name="csrf_token" type="text" class="hidden"> | |||
<a id="new_link_button" class="click jsonly ncstyle-button margin-bottom">{{ "index_createform_button"|tr(lang) }}</a> </form> | |||
<div id="loading_ring" class="hidden lds-ring"><div></div><div></div><div></div><div></div></div> | |||
</div> | |||
<a class="scroll-down-link scroll-down-arrow"></a> | |||
</div> | |||
<div class="has-text-centered beta-banner"> | |||
<h3>{{ "index_beta_banner_desc1"|tr(lang) }}</h3> | |||
<p>{{ "index_beta_banner_desc2"|tr(lang) }}<a href="https://42l.fr/Contact">{{ "index_beta_banner_desc_link"|tr(lang) }}</a>.</p> | |||
</div> | |||
<div> | |||
<div class="c-flex c-jumbo c-color-inverted c-color-mailred"> | |||
<div class="c-fullwidth"> | |||
<div class="has-text-centered"> | |||
<br /> | |||
<br /> | |||
<p>{{ "index_disclaimer1"|tr(lang) }}</p> | |||
<p>{{ "index_disclaimer2"|tr(lang) }}<a href="https://42l.fr/Faire-un-don">{{ "index_disclaimer2_link_org"|tr(lang) }}</a>{{ "index_disclaimer2_or"|tr(lang) }}<a href="https://www.bountysource.com/teams/nextcloud">{{ "index_disclaimer2_nc"|tr(lang) }}</a>.</p> | |||
</div> | |||
</div> | |||
</div> | |||
<br /> | |||
<div class="c-flex c-jumbo"> | |||
<div class="c-subelem"> | |||
<a target="_blank" href="/assets/screen/{{ "lang_code"|tr(lang) }}/question.png"><img class="c-img-shadow" alt="" src="/assets/screen/{{ "lang_code"|tr(lang) }}/question.png" /></a> | |||
</div> | |||
<div class="c-subelem"> | |||
<h3>{{ "index_panel1_title"|tr(lang) }}</h3> | |||
<p>{{ "index_panel1_desc1"|tr(lang) }}</p> | |||
<p>{{ "index_panel1_desc2"|tr(lang) }}</p> | |||
</div> | |||
</div> | |||
<div class="c-flex c-flex-reverse c-jumbo"> | |||
<div class="c-subelem"> | |||
<a target="_blank" href="/assets/screen/{{ "lang_code"|tr(lang) }}/fields.png"><img class="c-img-shadow" alt="" src="/assets/screen/{{ "lang_code"|tr(lang) }}/fields.png" /></a> | |||
</div> | |||
<div class="c-subelem"> | |||
<h3>{{ "index_panel2_title"|tr(lang) }}</h3> | |||
<p>{{ "index_panel2_desc1"|tr(lang) }}</p> | |||
<p>{{ "index_panel2_desc2"|tr(lang) }}<a href="https://github.com/nextcloud/forms/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature%3A+%E2%9D%93+question+types%22">{{ "index_panel2_desc2_link"|tr(lang) }}</a>.</p> | |||
</div> | |||
</div> | |||
<div class="c-flex c-jumbo"> | |||
<div class="c-subelem"> | |||
<a target="_blank" href="/assets/screen/{{ "lang_code"|tr(lang) }}/responses.png"><img class="c-img-shadow" alt="" src="/assets/screen/{{ "lang_code"|tr(lang) }}/responses.png" /></a> | |||
</div> | |||
<div class="c-subelem"> | |||
<h3>{{ "index_panel3_title"|tr(lang) }}</h3> | |||
<p>{{ "index_panel3_desc1"|tr(lang) }}</p> | |||
</div> | |||
</div> | |||
<div class="c-flex c-flex-reverse c-jumbo"> | |||
<div class="c-subelem"> | |||
<a target="_blank" href="/assets/screen/{{ "lang_code"|tr(lang) }}/responses-export.png"><img class="c-img-shadow" alt="" src="/assets/screen/{{ "lang_code"|tr(lang) }}/responses-export.png" /></a> | |||
</div> | |||
<div class="c-subelem"> | |||
<h3>{{ "index_panel4_title"|tr(lang) }}</h3> | |||
<p>{{ "index_panel4_desc1"|tr(lang) }}</p> | |||
</div> | |||
</div> | |||
<div class="c-flex c-jumbo"> | |||
<div class="c-subelem"> | |||
<a target="_blank" href="/assets/screen/{{ "lang_code"|tr(lang) }}/params.png"><img class="c-img-shadow" alt="" src="/assets/screen/{{ "lang_code"|tr(lang) }}/params.png" /></a> | |||
</div> | |||
<div class="c-subelem"> | |||
<h3>{{ "index_panel5_title"|tr(lang) }}</h3> | |||
<p>{{ "index_panel5_desc1"|tr(lang) }}</p> | |||
<p>{{ "index_panel5_desc2"|tr(lang) }}</p> | |||
</div> | |||
</div> | |||
<div class="c-flex c-flex-reverse c-jumbo"> | |||
<div class="c-subelem"> | |||
<a target="_blank" href="/assets/screen/{{ "lang_code"|tr(lang) }}/formslist.png"><img class="c-img-shadow" alt="" src="/assets/screen/{{ "lang_code"|tr(lang) }}/formslist.png" /></a> | |||
</div> | |||
<div class="c-subelem"> | |||
<h3>{{ "index_panel6_title"|tr(lang) }}</h3> | |||
<p>{{ "index_panel5_desc1"|tr(lang) }}</p> | |||
</div> | |||
</div> | |||
</div> | |||
<br /> | |||
<div class="c-flex c-jumbo c-blue"> | |||
<a href="https://42l.fr/Rapport-technique" class="c-button" target="_blank">{{ "index_bottom_docs"|tr(lang) }}</a> | |||
<a href="https://git.42l.fr/neil/sncf" class="c-button" target="_blank">{{ "index_bottom_source"|tr(lang) }}</a> | |||
<a href="https://git.42l.fr/neil/sncf/src/branch/root/LICENSE" class="c-button" target="_blank">{{ "index_bottom_lic"|tr(lang) }}</a> | |||
</div> | |||
<br /> | |||
<div class="has-text-centered page-heading"> | |||
<br /> | |||
<h3 class="title">Crédits</h3> | |||
<p>{{ "index_credits_desc1"|tr(lang) }}<a href="https://nextcloud.com/">{{ "index_credits_desc1_link"|tr(lang) }}</a>{{ "index_credits_desc1_a"|tr(lang) }}</p> | |||
<p>{{ "index_credits_desc2"|tr(lang) }}<a href="https://shelter.moe/@Neil">Neil</a>{{ "index_credits_desc2_for"|tr(lang) }}<a href="https://42l.fr">{{ "index_credits_desc2_org"|tr(lang) }}</a> (<a href="https://git.42l.fr/neil/sncf">{{"index_credits_desc3"|tr(lang) }}</a>).</p> | |||
<br /> | |||
</div> | |||
</body> | |||
</html> | |||
@ -0,0 +1,97 @@ | |||
<!doctype html> | |||
<html lang="{{ lang }}"> | |||
<head> | |||
<title>{{ "link_title"|tr(lang) }} – {{ "index_title"|tr(lang) }}</title> | |||
<meta charset="utf-8" /> | |||
<meta name="robots" content="noindex" /> | |||
<meta name="viewport" content="width=device-width, initial-scale=1"> | |||
<meta name="description" content="{{ "meta_description"|tr(lang) }}" /> | |||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> | |||
<link rel="icon" type="image/png" sizes="48x48" href="/assets/favicon.ico" /> | |||
<link rel="stylesheet" href="/assets/index.css?v=1.0" /> | |||
<link rel="stylesheet" href="/assets/cloud.css?v=1.0" /> | |||
<script type="text/javascript"> | |||
window.onload = function () { | |||
// show link copy button if javascript is enabled | |||
document.getElementById("script-copy").style.display = "unset"; | |||
let btn = document.getElementById("script-copy-btn"); | |||
btn.style.cursor = "pointer"; | |||
btn.addEventListener('click', function() { | |||
var copyText = document.getElementById("link"); | |||
/* Select the text field */ | |||
copyText.select(); | |||
copyText.setSelectionRange(0, 99999); | |||
document.execCommand("copy"); | |||
btn.innerHTML = '{{ "link_copied"|tr(lang) }}'; | |||
}); | |||
document.getElementById("email-register").style.display = "unset"; | |||
let btn2 = document.getElementById("email-register-btn"); | |||
btn2.style.cursor = "pointer"; | |||
btn2.addEventListener('click', function() { | |||
var email = document.getElementById("email").value; | |||
console.log(email); | |||
/* var emailjsonstring = JSON.stringify(JSON.parse(document.getElementById('email'))); */ | |||
var xhr1=new XMLHttpRequest(); | |||
xhr1.open("POST",'link/email', true); | |||
xhr1.send(email); | |||
}); | |||
} | |||
</script> | |||
<body> | |||
<div class="navbar has-text-centered page-heading"></div> | |||
<div class="fullheight-nav"> | |||
<div class="c-flex c-jumbo"> | |||
<div class="c-fullwidth"> | |||
<div class="has-text-centered"> | |||
<br /> | |||
<h2>{{ "link_title"|tr(lang) }}</h2> | |||
<p>{{ "link_desc1"|tr(lang)|safe }}</p> | |||
<p>{{ "link_desc2"|tr(lang)|safe }}</p> | |||
<br /> | |||
<div class="c-flex"> | |||
<input id="link" class="ncstyle-input" type="text" readonly value="{{ config.sncf_url }}/admin/{{ admin_token }}" /> | |||
</div> | |||
<br /> | |||
<br /> | |||
<div id="script-copy"> | |||
<br /> | |||
<div class="c-flex"> | |||
<a id="script-copy-btn" class="ncstyle-button margin-bottom">{{ "link_copy"|tr(lang) }}</a> | |||
</div> | |||
<br /> | |||
</div> | |||
<div class="c-flex"> | |||
<input id="email" class="ncstyle-input" type="text" value="ivalid@mail.com" /> | |||
</div> | |||
<br /> | |||
<div id="email-register"> | |||
<br /> | |||
<div class="c-flex"> | |||
<a id="email-register-btn" class="ncstyle-button margin-bottom" href="{{ config.sncf_url }}/admin/{{ admin_token }}">send link to mail</a> | |||
</div> | |||
<br /> | |||
</div> | |||
<p>{{ "link_desc3"|tr(lang) }}</p> | |||
<br /> | |||
<div class="c-flex"> | |||
<a id="forms-btn" class="ncstyle-button margin-bottom" href="{{ config.sncf_url }}/admin/{{ admin_token }}">{{ "link_access_btn"|tr(lang) }}</a> | |||
</div> | |||
<br /> | |||
<p>{{ "link_note"|tr(lang) }}{{ config.prune_days }}{{ "link_note2"|tr(lang) }}</p> | |||
</div> | |||
</div> | |||
</div> | |||
</div> | |||
</body> | |||
</html> | |||
@ -0,0 +1,118 @@ | |||
#[macro_use] | |||
extern crate lazy_static; | |||
#[macro_use] | |||
extern crate serde_derive; | |||
#[macro_use] | |||
extern crate diesel; | |||
#[macro_use] | |||
extern crate diesel_migrations; | |||
use actix_files::Files; | |||
use actix_web::client::Client; | |||
use actix_web::{web, App, HttpRequest, FromRequest, HttpServer}; | |||
use diesel::prelude::*; | |||
use diesel::r2d2::{self, ConnectionManager}; | |||
use url::Url; | |||
use crate::config::CONFIG; | |||
use crate::config::PAYLOAD_LIMIT; | |||
use crate::forward::*; | |||
mod account; | |||
mod config; | |||
mod database; | |||
mod errors; | |||
mod forward; | |||
mod sniff; | |||
mod templates; | |||
// default to postgres | |||
#[cfg(feature = "default")] | |||
type DbConn = PgConnection; | |||
#[cfg(feature = "default")] | |||
embed_migrations!("migrations/postgres"); | |||
#[cfg(feature = "postgres")] | |||
type DbConn = PgConnection; | |||
#[cfg(feature = "postgres")] | |||
embed_migrations!("migrations/postgres"); | |||
#[cfg(feature = "sqlite")] | |||
type DbConn = SqliteConnection; | |||
#[cfg(feature = "sqlite")] | |||
embed_migrations!("migrations/sqlite"); | |||
#[cfg(feature = "mysql")] | |||
type DbConn = MysqlConnection; | |||
#[cfg(feature = "mysql")] | |||
embed_migrations!("migrations/mysql"); | |||
type DbPool = r2d2::Pool<ConnectionManager<DbConn>>; | |||
#[actix_rt::main] | |||
async fn main() -> std::io::Result<()> { | |||
/* std::env::set_var("RUST_LOG", "actix_web=debug"); | |||
env_logger::init();*/ | |||
println!("ta ta tala ~ SNCF init"); | |||
println!("Checking configuration file..."); | |||
CONFIG.check_version(); | |||
if CONFIG.database_path.len() == 0 { | |||
println!("No database specified. Please enter a MySQL, PostgreSQL or SQLite connection string in config.toml."); | |||
} | |||
debug(&format!("Opening database {}", CONFIG.database_path)); | |||
let manager = ConnectionManager::<DbConn>::new(&CONFIG.database_path); | |||
let pool = r2d2::Pool::builder() | |||
.build(manager) | |||
.expect("ERROR: main: Failed to create the database pool."); | |||
let conn = pool.get().expect("ERROR: main: DB connection failed"); | |||
println!("Running migrations..."); | |||
embedded_migrations::run(&*conn).expect("ERROR: main: Failed to run database migrations"); | |||
let forward_url = | |||
Url::parse(&CONFIG.nextcloud_url).expect("Couldn't parse the forward url from config"); | |||
println!( | |||
"Now listening at {}:{}", | |||
CONFIG.listening_address, CONFIG.listening_port | |||
); | |||
// starting the http server | |||
let HttpServer::new(move || { | |||
App::new() | |||
.data(pool.clone()) | |||
.data(Client::new()) | |||
.data(forward_url.clone()) | |||
/*.route("/mimolette", web::get().to(login))*/ | |||
/*.route("/login", web::post().to(forward))*/ | |||
/*.wrap(middleware::Compress::default())*/ | |||
.service(Files::new("/assets/", "./templates/assets/").index_file("index.html")) | |||
.route("/", web::get().to(index)) | |||
.route("/link", web::post().to(forward_register)) | |||
.route("/admin/{token}", web::get().to(forward_login)) | |||
.default_service(web::route().to(forward)) | |||
.data(String::configure(|cfg| cfg.limit(PAYLOAD_LIMIT))) | |||
.app_data(actix_web::web::Bytes::configure(|cfg| { | |||
cfg.limit(PAYLOAD_LIMIT) | |||
})) | |||
}) | |||
.bind((CONFIG.listening_address.as_str(), CONFIG.listening_port))? | |||
.system_exit() | |||
.run() | |||
.await | |||
} | |||
pub fn debug(text: &str) { | |||
if CONFIG.debug_mode { | |||
println!("{}", text); | |||
} | |||
} | |||
@ -0,0 +1,59 @@ | |||
use actix_web::HttpRequest; | |||
use askama::Template; | |||
use crate::config::Config; | |||
#[derive(Template)] | |||
#[template(path = "index.html")] | |||
pub struct TplIndex<'a> { | |||
pub lang: &'a str, | |||
pub csrf_token: &'a str, | |||
} | |||
#[derive(Template)] | |||
#[template(path = "error.html")] | |||
pub struct TplError<'a> { | |||
pub lang: &'a str, | |||
pub error_msg: &'a str, | |||
} | |||
#[derive(Template)] | |||
#[template(path = "link.html")] | |||
pub struct TplLink<'a> { | |||
pub lang: &'a str, | |||
pub admin_token: &'a str, | |||
pub config: &'a Config, | |||
} | |||
pub fn get_lang(req: &HttpRequest) -> String { | |||
// getting language from client header | |||
// taking the two first characters of the Accept-Language header, | |||
// in lowercase, then parsing it. | |||
// if it fails, returns "en" | |||
if let Some(l) = req.headers().get("Accept-Language") { | |||
if let Ok(s) = l.to_str() { | |||
return s.to_lowercase()[..2].to_string(); | |||
} | |||
} | |||
String::from("en") | |||
} | |||
mod filters { | |||
use crate::config::LOC; | |||
pub fn tr(key: &str, lang: &str) -> askama::Result<String> { | |||
let translation = LOC.get(key).ok_or_else(|| { | |||
eprintln!("tr filter: couldn't find the key {}", key); | |||
askama::Error::from(std::fmt::Error) | |||
})?; | |||
Ok(String::from( | |||
translation | |||
.get(lang) | |||
.unwrap_or(translation.get("en").ok_or_else(|| { | |||
eprintln!("tr filter: couldn't find the lang {} in key {}", lang, key); | |||
askama::Error::from(std::fmt::Error) | |||
})?) | |||
.as_str() | |||
.ok_or_else(|| { | |||
eprintln!("tr filter: lang {} in key {} is not str", lang, key); | |||
askama::Error::from(std::fmt::Error) | |||
})?, | |||
)) | |||
} | |||
} | |||
@ -0,0 +1,3 @@ | |||
FROM nginx:alpine | |||
COPY nginx.conf /etc/nginx/nginx.conf |
@ -0,0 +1,173 @@ | |||
worker_processes auto; | |||
error_log /var/log/nginx/error.log warn; | |||
pid /var/run/nginx.pid; | |||
events { | |||
worker_connections 1024; | |||
} | |||
http { | |||
include /etc/nginx/mime.types; | |||
default_type application/octet-stream; | |||
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' | |||
'$status $body_bytes_sent "$http_referer" ' | |||
'"$http_user_agent" "$http_x_forwarded_for"'; | |||
access_log /var/log/nginx/access.log main; | |||
sendfile on; | |||
#tcp_nopush on; | |||
keepalive_timeout 65; | |||
set_real_ip_from 10.0.0.0/8; | |||
set_real_ip_from 172.16.0.0/12; | |||
set_real_ip_from 192.168.0.0/16; | |||
real_ip_header X-Real-IP; | |||
#gzip on; | |||
upstream php-handler { | |||
server nextcloud:9000; | |||
} | |||
server { | |||
listen 80; | |||
# Add headers to serve security related headers | |||
# Before enabling Strict-Transport-Security headers please read into this | |||
# topic first. | |||
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; | |||
# | |||
# WARNING: Only add the preload option once you read about | |||
# the consequences in https://hstspreload.org/. This option | |||
# will add the domain to a hardcoded list that is shipped | |||
# in all major browsers and getting removed from this list | |||
# could take several months. | |||
add_header Referrer-Policy "no-referrer" always; | |||
add_header X-Content-Type-Options "nosniff" always; | |||
add_header X-Download-Options "noopen" always; | |||
add_header X-Frame-Options "SAMEORIGIN" always; | |||
add_header X-Permitted-Cross-Domain-Policies "none" always; | |||
add_header X-Robots-Tag "none" always; | |||
add_header X-XSS-Protection "1; mode=block" always; | |||
# Remove X-Powered-By, which is an information leak | |||
fastcgi_hide_header X-Powered-By; | |||
# Path to the root of your installation | |||
root /var/www/html; | |||
location = /robots.txt { | |||
allow all; | |||
log_not_found off; | |||
access_log off; | |||
} | |||
# The following 2 rules are only needed for the user_webfinger app. | |||
# Uncomment it if you're planning to use this app. | |||
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last; | |||
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last; | |||
# The following rule is only needed for the Social app. | |||
# Uncomment it if you're planning to use this app. | |||
#rewrite ^/.well-known/webfinger /public.php?service=webfinger last; | |||
location = /.well-known/carddav { | |||
return 301 $scheme://$host:$server_port/remote.php/dav; | |||
} | |||
location = /.well-known/caldav { | |||
return 301 $scheme://$host:$server_port/remote.php/dav; | |||
} | |||
# set max upload size | |||
client_max_body_size 10G; | |||
fastcgi_buffers 64 4K; | |||
# Enable gzip but do not remove ETag headers | |||
gzip on; | |||
gzip_vary on; | |||
gzip_comp_level 4; | |||
gzip_min_length 256; | |||
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; | |||
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; | |||
# Uncomment if your server is build with the ngx_pagespeed module | |||
# This module is currently not supported. | |||
#pagespeed off; | |||
location / { | |||
rewrite ^ /index.php; | |||
} | |||
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ { | |||
deny all; | |||
} | |||
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) { | |||
deny all; | |||
} | |||
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) { | |||
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$; | |||
set $path_info $fastcgi_path_info; | |||
try_files $fastcgi_script_name =404; | |||
include fastcgi_params; | |||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |||
fastcgi_param PATH_INFO $path_info; | |||
# fastcgi_param HTTPS on; | |||
# Avoid sending the security headers twice | |||
fastcgi_param modHeadersAvailable true; | |||
# Enable pretty urls | |||
fastcgi_param front_controller_active true; | |||
fastcgi_pass php-handler; | |||
fastcgi_intercept_errors on; | |||
fastcgi_request_buffering off; | |||
} | |||
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) { | |||
try_files $uri/ =404; | |||
index index.php; | |||
} | |||
# Adding the cache control header for js, css and map files | |||
# Make sure it is BELOW the PHP block | |||
location ~ \.(?:css|js|woff2?|svg|gif|map)$ { | |||
try_files $uri /index.php$request_uri; | |||
add_header Cache-Control "public, max-age=15778463"; | |||
# Add headers to serve security related headers (It is intended to | |||
# have those duplicated to the ones above) | |||
# Before enabling Strict-Transport-Security headers please read into | |||
# this topic first. | |||
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; | |||
# | |||
# WARNING: Only add the preload option once you read about | |||
# the consequences in https://hstspreload.org/. This option | |||
# will add the domain to a hardcoded list that is shipped | |||
# in all major browsers and getting removed from this list | |||
# could take several months. | |||
add_header Referrer-Policy "no-referrer" always; | |||
add_header X-Content-Type-Options "nosniff" always; | |||
add_header X-Download-Options "noopen" always; | |||
add_header X-Frame-Options "SAMEORIGIN" always; | |||
add_header X-Permitted-Cross-Domain-Policies "none" always; | |||
add_header X-Robots-Tag "none" always; | |||
add_header X-XSS-Protection "1; mode=block" always; | |||
# Optional: Don't log access to assets | |||
access_log off; | |||
} | |||
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ { | |||
try_files $uri /index.php$request_uri; | |||
# Optional: Don't log access to other assets | |||
access_log off; | |||
} | |||
} | |||
} |
@ -0,0 +1,173 @@ | |||
worker_processes auto; | |||
error_log /var/log/nginx/error.log warn; | |||
pid /var/run/nginx.pid; | |||
events { | |||
worker_connections 1024; | |||
} | |||
http { | |||
include /etc/nginx/mime.types; | |||
default_type application/octet-stream; | |||
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' | |||
'$status $body_bytes_sent "$http_referer" ' | |||
'"$http_user_agent" "$http_x_forwarded_for"'; | |||
access_log /var/log/nginx/access.log main; | |||
sendfile on; | |||
#tcp_nopush on; | |||
keepalive_timeout 65; | |||
set_real_ip_from 10.0.0.0/8; | |||
set_real_ip_from 172.16.0.0/12; | |||
set_real_ip_from 192.168.0.0/16; | |||
real_ip_header X-Real-IP; | |||
#gzip on; | |||
upstream php-handler { | |||
server nextcloud:9000; | |||
} | |||
server { | |||
listen 80; | |||
# Add headers to serve security related headers | |||
# Before enabling Strict-Transport-Security headers please read into this | |||
# topic first. | |||
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; | |||
# | |||
# WARNING: Only add the preload option once you read about | |||
# the consequences in https://hstspreload.org/. This option | |||
# will add the domain to a hardcoded list that is shipped | |||
# in all major browsers and getting removed from this list | |||
# could take several months. | |||
add_header Referrer-Policy "no-referrer" always; | |||
add_header X-Content-Type-Options "nosniff" always; | |||
add_header X-Download-Options "noopen" always; | |||
add_header X-Frame-Options "SAMEORIGIN" always; | |||
add_header X-Permitted-Cross-Domain-Policies "none" always; | |||
add_header X-Robots-Tag "none" always; | |||
add_header X-XSS-Protection "1; mode=block" always; | |||
# Remove X-Powered-By, which is an information leak | |||
fastcgi_hide_header X-Powered-By; | |||
# Path to the root of your installation | |||
root /var/www/html; | |||
location = /robots.txt { | |||
allow all; | |||
log_not_found off; | |||
access_log off; | |||
} | |||
# The following 2 rules are only needed for the user_webfinger app. | |||
# Uncomment it if you're planning to use this app. | |||
#rewrite ^/.well-known/host-meta /public.php?service=host-meta last; | |||
#rewrite ^/.well-known/host-meta.json /public.php?service=host-meta-json last; | |||
# The following rule is only needed for the Social app. | |||
# Uncomment it if you're planning to use this app. | |||
#rewrite ^/.well-known/webfinger /public.php?service=webfinger last; | |||
location = /.well-known/carddav { | |||
return 301 $scheme://$host:$server_port/remote.php/dav; | |||
} | |||
location = /.well-known/caldav { | |||
return 301 $scheme://$host:$server_port/remote.php/dav; | |||
} | |||
# set max upload size | |||
client_max_body_size 10G; | |||
fastcgi_buffers 64 4K; | |||
# Enable gzip but do not remove ETag headers | |||
gzip on; | |||
gzip_vary on; | |||
gzip_comp_level 4; | |||
gzip_min_length 256; | |||
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth; | |||
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy; | |||
# Uncomment if your server is build with the ngx_pagespeed module | |||
# This module is currently not supported. | |||
#pagespeed off; | |||
location / { | |||
rewrite ^ /index.php; | |||
} | |||
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ { | |||
deny all; | |||
} | |||
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) { | |||
deny all; | |||
} | |||
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|oc[ms]-provider\/.+)\.php(?:$|\/) { | |||
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$; | |||
set $path_info $fastcgi_path_info; | |||
try_files $fastcgi_script_name =404; | |||
include fastcgi_params; | |||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; | |||
fastcgi_param PATH_INFO $path_info; | |||
# fastcgi_param HTTPS on; | |||
# Avoid sending the security headers twice | |||
fastcgi_param modHeadersAvailable true; | |||
# Enable pretty urls | |||
fastcgi_param front_controller_active true; | |||
fastcgi_pass php-handler; | |||
fastcgi_intercept_errors on; | |||
fastcgi_request_buffering off; | |||
} | |||
location ~ ^\/(?:updater|oc[ms]-provider)(?:$|\/) { | |||
try_files $uri/ =404; | |||
index index.php; | |||
} | |||
# Adding the cache control header for js, css and map files | |||
# Make sure it is BELOW the PHP block | |||
location ~ \.(?:css|js|woff2?|svg|gif|map)$ { | |||
try_files $uri /index.php$request_uri; | |||
add_header Cache-Control "public, max-age=15778463"; | |||
# Add headers to serve security related headers (It is intended to | |||
# have those duplicated to the ones above) | |||
# Before enabling Strict-Transport-Security headers please read into | |||
# this topic first. | |||
#add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always; | |||
# | |||
# WARNING: Only add the preload option once you read about | |||
# the consequences in https://hstspreload.org/. This option | |||
# will add the domain to a hardcoded list that is shipped | |||
# in all major browsers and getting removed from this list | |||
# could take several months. | |||
add_header Referrer-Policy "no-referrer" always; | |||
add_header X-Content-Type-Options "nosniff" always; | |||
add_header X-Download-Options "noopen" always; | |||
add_header X-Frame-Options "SAMEORIGIN" always; | |||
add_header X-Permitted-Cross-Domain-Policies "none" always; | |||
add_header X-Robots-Tag "none" always; | |||
add_header X-XSS-Protection "1; mode=block" always; | |||
# Optional: Don't log access to assets | |||
access_log off; | |||
} | |||
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap|mp4|webm)$ { | |||
try_files $uri /index.php$request_uri; | |||
# Optional: Don't log access to other assets | |||
access_log off; | |||
} | |||
} | |||
} |
@ -0,0 +1,127 @@ | |||
# DO NOT EDIT: created by update.sh from Dockerfile-alpine.template | |||
FROM php:7.4-fpm-alpine3.12 | |||
# entrypoint.sh and cron.sh dependencies | |||
RUN set -ex; \ | |||
\ | |||
apk add --no-cache \ | |||
rsync \ | |||
; \ | |||
\ | |||
rm /var/spool/cron/crontabs/root; \ | |||
echo '*/5 * * * * php -f /var/www/html/cron.php' > /var/spool/cron/crontabs/www-data | |||
# install the PHP extensions we need | |||
# see https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html | |||
RUN set -ex; \ | |||
\ | |||
apk add --no-cache --virtual .build-deps \ | |||
$PHPIZE_DEPS \ | |||
autoconf \ | |||
freetype-dev \ | |||
icu-dev \ | |||
libevent-dev \ | |||
libjpeg-turbo-dev \ | |||
libmcrypt-dev \ | |||
libpng-dev \ | |||
libmemcached-dev \ | |||
libxml2-dev \ | |||
libzip-dev \ | |||
openldap-dev \ | |||
pcre-dev \ | |||
postgresql-dev \ | |||
imagemagick-dev \ | |||
libwebp-dev \ | |||
gmp-dev \ | |||
; \ | |||
\ | |||
docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp; \ | |||
docker-php-ext-configure ldap; \ | |||
docker-php-ext-install -j "$(nproc)" \ | |||
bcmath \ | |||
exif \ | |||
gd \ | |||
intl \ | |||
ldap \ | |||
opcache \ | |||
pcntl \ | |||
pdo_mysql \ | |||
pdo_pgsql \ | |||
zip \ | |||
gmp \ | |||
; \ | |||
\ | |||
# pecl will claim success even if one install fails, so we need to perform each install separately | |||
pecl install APCu-5.1.19; \ | |||
pecl install memcached-3.1.5; \ | |||
pecl install redis-5.3.2; \ | |||
pecl install imagick-3.4.4; \ | |||
\ | |||
docker-php-ext-enable \ | |||
apcu \ | |||
memcached \ | |||
redis \ | |||
imagick \ | |||
; \ | |||
\ | |||
runDeps="$( \ | |||
scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ | |||
| tr ',' '\n' \ | |||
| sort -u \ | |||
| awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \ | |||
)"; \ | |||
apk add --virtual .nextcloud-phpext-rundeps $runDeps; \ | |||
apk del .build-deps | |||
# set recommended PHP.ini settings | |||
# see https://docs.nextcloud.com/server/12/admin_manual/configuration_server/server_tuning.html#enable-php-opcache | |||
RUN { \ | |||
echo 'opcache.enable=1'; \ | |||
echo 'opcache.interned_strings_buffer=8'; \ | |||
echo 'opcache.max_accelerated_files=10000'; \ | |||
echo 'opcache.memory_consumption=128'; \ | |||
echo 'opcache.save_comments=1'; \ | |||
echo 'opcache.revalidate_freq=1'; \ | |||
} > /usr/local/etc/php/conf.d/opcache-recommended.ini; \ | |||
\ | |||
echo 'apc.enable_cli=1' >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \ | |||
\ | |||
echo 'memory_limit=512M' > /usr/local/etc/php/conf.d/memory-limit.ini; \ | |||
\ | |||
mkdir /var/www/data; \ | |||
chown -R www-data:root /var/www; \ | |||
chmod -R g=u /var/www | |||
VOLUME /var/www/html | |||
ENV NEXTCLOUD_VERSION 20.0.1 | |||
RUN set -ex; \ | |||
apk add --no-cache --virtual .fetch-deps \ | |||
bzip2 \ | |||
gnupg \ | |||
; \ | |||
\ | |||
curl -fsSL -o nextcloud.tar.bz2 \ | |||
"https://download.nextcloud.com/server/releases/nextcloud-${NEXTCLOUD_VERSION}.tar.bz2"; \ | |||
curl -fsSL -o nextcloud.tar.bz2.asc \ | |||
"https://download.nextcloud.com/server/releases/nextcloud-${NEXTCLOUD_VERSION}.tar.bz2.asc"; \ | |||
export GNUPGHOME="$(mktemp -d)"; \ | |||
# gpg key from https://nextcloud.com/nextcloud.asc | |||
gpg --batch --keyserver ha.pool.sks-keyservers.net --recv-keys 28806A878AE423A28372792ED75899B9A724937A; \ | |||
gpg --batch --verify nextcloud.tar.bz2.asc nextcloud.tar.bz2; \ | |||
tar -xjf nextcloud.tar.bz2 -C /usr/src/; \ | |||
gpgconf --kill all; \ | |||
rm nextcloud.tar.bz2.asc nextcloud.tar.bz2; \ | |||
rm -rf "$GNUPGHOME" /usr/src/nextcloud/updater; \ | |||
mkdir -p /usr/src/nextcloud/data; \ | |||
mkdir -p /usr/src/nextcloud/custom_apps; \ | |||
chmod +x /usr/src/nextcloud/occ; \ | |||
apk del .fetch-deps | |||
COPY *.sh upgrade.exclude / | |||
COPY config/* /usr/src/nextcloud/config/ | |||
ENTRYPOINT ["/entrypoint.sh"] | |||
CMD ["php-fpm"] |
@ -0,0 +1,185 @@ | |||
version: '2.3' | |||
services: | |||
traefik: | |||
image: traefik:2.4 | |||
container_name: traefik | |||
restart: always | |||
command: | |||
- "--accesslog.filepath=/var/log/access.log" | |||
- "--log.level=WARNING" | |||
- "--providers.docker=true" | |||
- "--providers.docker.exposedbydefault=false" | |||
- "--entrypoints.web.address=:80" | |||
- "--entrypoints.websecure.address=:443" | |||
- "--entrypoints.web.http.redirections.entryPoint.to=websecure" | |||
- "--entrypoints.web.http.redirections.entryPoint.scheme=https" | |||
- "--certificatesresolvers.myresolver.acme.httpchallenge=true" | |||
- "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web" | |||
- "--certificatesresolvers.myresolver.acme.storage=/acme.json" | |||
ports: | |||
- 80:80 | |||
- 443:443 | |||
networks: | |||
- proxy | |||
volumes: | |||
# - /opt/docker/overlays/traefik/var/log:/var/log/ | |||
- /opt/docker/overlays/traefik/acme.json:/acme.json | |||
- /var/run/docker.sock:/var/run/docker.sock:ro | |||
nextcloud-db: | |||
image: mariadb | |||
container_name: nextcloud-db | |||
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW | |||
restart: always | |||
volumes: | |||
- /opt/docker/overlays/nextcloud-db/mysql:/var/lib/mysql | |||
environment: | |||
- MYSQL_ROOT_PASSWORD=AAAAAAAAAAAAAAAAAAAAAAAMYSQLROOT | |||
- MYSQL_PASSWORD=AAAAAAAAAAAAAAAAAAAAAAAAAAAAMYSQL | |||
- MYSQL_DATABASE=nextcloud | |||
- MYSQL_USER=nextcloud | |||
networks: | |||
- nextcloud | |||
- sncf-db | |||
ports: | |||
- "127.0.0.1:3306:3306" | |||
redis: | |||
image: redis:alpine | |||
container_name: nextcloud-redis | |||
restart: always | |||
command: redis-server --requirepass AAAAAAAAAAAAAAAAAAAAAAAAAAAAREDIS | |||
networks: | |||
- nextcloud | |||
nextcloud: | |||
image: nextcloud:e95023790cc36274053af7930831a9aecbf32efd | |||
build: https://github.com/nextcloud/docker.git#e95023790cc36274053af7930831a9aecbf32efd:20.0/fpm-alpine | |||
container_name: nextcloud | |||
restart: always | |||
volumes: | |||
# - /opt/docker/overlays/nextcloud/var/log:/var/log | |||
- /opt/docker/overlays/nextcloud/html:/var/www/html | |||
- /opt/docker/overlays/nextcloud/data:/var/www/data | |||
- /opt/docker/overlays/nextcloud/skeleton:/var/www/skeleton | |||
environment: | |||
- MYSQL_HOST=nextcloud-db | |||
- REDIS_HOST=redis | |||
- REDIS_HOST_PASSWORD=AAAAAAAAAAAAAAAAAAAAAAAAAAAAREDIS | |||
- MYSQL_PASSWORD=AAAAAAAAAAAAAAAAAAAAAAAAAAAAMYSQL | |||
- MYSQL_DATABASE=nextcloud | |||
- MYSQL_USER=nextcloud | |||
depends_on: | |||
- nextcloud-db | |||
- redis | |||
security_opt: | |||
- no-new-privileges:true | |||
networks: | |||
- nextcloud | |||
- nextcloud-web | |||
nextcloud-web: | |||
build: ../build/nextcloud-web | |||
container_name: nextcloud-web | |||
restart: always | |||
volumes: | |||
# - /opt/docker/overlays/nextcloud-web/var/log:/var/log | |||
- /opt/docker/overlays/nextcloud/html:/var/www/html:ro | |||
- /opt/docker/overlays/nextcloud/data:/var/www/data:ro | |||
- /opt/docker/overlays/nextcloud/skeleton:/var/www/skeleton:ro | |||
labels: | |||
- traefik.docker.network=proxy | |||
- traefik.enable=true | |||
- traefik.protocol=http | |||
- traefik.port=80 | |||
- traefik.http.routers.nextlcoud.tls=true | |||
- traefik.http.routers.nextcloud.entrypoints=websecure | |||
- traefik.http.routers.nextcloud.tls.certresolver=myresolver | |||
- traefik.http.routers.nextcloud.rule=Host(`oleola.ddns.net`) | |||
- traefik.http.middlewares.nextcloud.headers.customRequestHeaders.X-Forwarded-Proto=https | |||
- traefik.http.routers.nextcloud.middlewares=nextcloud,nextcloud_redirect, next-auth | |||
- traefik.http.middlewares.next-auth.basicauth.users=luca:$$2y$$05$$DnZh.HwnTfrmVhgrFdZ9bu86fyZ6/1HNRgaCTxOyrHGOFNFw5AYlm | |||
- traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011 | |||
- traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true | |||
- traefik.http.middlewares.nextcloud.headers.stsPreload=true | |||
- traefik.http.middlewares.nextcloud_redirect.redirectregex.regex=/.well-known/(card|cal)dav | |||
- traefik.http.middlewares.nextcloud_redirect.redirectregex.replacement=/remote.php/dav/ | |||
depends_on: | |||
- nextcloud | |||
security_opt: | |||
- no-new-privileges:true | |||
networks: | |||
- nextcloud | |||
- proxy | |||
- nextcloud-web | |||
# logging: | |||
# driver: syslog | |||
cron: | |||
image: nextcloud:stable-fpm-alpine | |||
restart: always | |||
container_name: nextcloud-cron | |||
volumes: | |||
- /opt/docker/overlays/nextcloud/html:/var/www/html | |||
- /opt/docker/overlays/nextcloud/data:/var/www/data | |||
- /opt/docker/overlays/nextcloud/skeleton:/var/www/skeleton | |||
entrypoint: /cron.sh | |||
depends_on: | |||
- nextcloud-db | |||
- redis | |||
networks: | |||
- nextcloud | |||
- proxy | |||
# deb-rust-sncf: | |||
# build: ../build/deb-rust-sncf | |||
# container_name: deb-rust-sncf | |||
# restart: always | |||
# volumes: | |||
## - /opt/docker/overlays/deb-rust-sncf/var/log:/var/log | |||
# - /opt/docker/overlays/nextcloud/html:/var/www/html | |||
# - /opt/docker/overlays/nextcloud/data:/var/www/data | |||
# - /opt/docker/overlays/nextcloud/skeleton:/var/www/skeleton | |||
# labels: | |||
# - "traefik.docker.network=proxy" | |||
# - "traefik.enable=true" | |||
# - "traefik.protocol=http" | |||
# - "traefik.port=8000" | |||
# - "traefik.http.routers.deb-rust-sncf.entrypoints=websecure" | |||
# - "traefik.http.routers.deb-rust-sncf.tls.certresolver=myresolver" | |||
# - "traefik.http.routers.deb-rust-sncf.rule=Host(`example.org`)" | |||
# - "traefik.http.services.deb-rust-sncf.loadbalancer.server.port=8000" | |||
# - "traefik.http.routers.deb-rust-sncf.middlewares=sncf, sncf-auth" | |||
# - "traefik.http.middlewares.sncf-auth.basicauth.users=luca:$$2y$$05$$DnZh.HwnTfrmVhgrFdZ9bu86fyZ6/1HNRgaCTxOyrHGOFNFw5AYlm" | |||
# - "traefik.http.middlewares.sncf.headers.customRequestHeaders.X-Forwarded-Proto=https" | |||
# - "traefik.http.middlewares.sncf.headers.stsSeconds=155520011" | |||
# - "traefik.http.middlewares.sncf.headers.stsIncludeSubdomains=true" | |||
# - "traefik.http.middlewares.sncf.headers.stsPreload=true" | |||
# - "traefik.http.middlewares.sncf-ratelimit.ratelimit.average=200" | |||
# environment: | |||
# - RUST_BACKTRACE=full | |||
# depends_on: | |||
# - nextcloud | |||
# networks: | |||
# - sncf-db | |||
# - sncf-nc | |||
# - proxy | |||
networks: | |||
proxy: | |||
external: true | |||
nextcloud: | |||
external: false | |||
driver: bridge | |||
nextcloud-web: | |||
external: false | |||
driver: bridge | |||
sncf-nc: | |||
external: false | |||
driver: bridge | |||
sncf-db: | |||
external: false | |||
driver: bridge |
@ -0,0 +1,130 @@ | |||
version: '2.3' | |||
services: | |||
nextcloud-db: | |||
image: mariadb | |||
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW | |||
container_name: nextcloud-db | |||
restart: always | |||
volumes: | |||
- /home/docker/nextcloud/container-db:/var/lib/mysql | |||
environment: | |||
- MYSQL_ROOT_PASSWORD= | |||
- MYSQL_PASSWORD= | |||
- MYSQL_DATABASE=nextcloud | |||
- MYSQL_USER=nextcloud | |||
networks: | |||
- nextcloud | |||
nextcloud: | |||
image: nextcloud:stable-fpm-alpine | |||
restart: on-failure:5 | |||
container_name: nextcloud | |||
volumes: | |||
- /home/docker/nextcloud/app:/var/www/html | |||
environment: | |||
- MYSQL_HOST=nextcloud-db | |||
- MYSQL_PASSWORD= | |||
- MYSQL_DATABASE=nextcloud | |||
- MYSQL_USER=nextcloud | |||
- REDIS_HOST=redis | |||
- REDIS_HOST_PASSWORD= | |||
depends_on: | |||
- nextcloud-db | |||
- redis | |||
security_opt: | |||
- no-new-privileges:true | |||
networks: | |||
- nextcloud | |||
nextcloud-cron: | |||
image: nextcloud:stable-fpm-alpine | |||
restart: always | |||
container_name: nextcloud-cron | |||
volumes: | |||
- /home/docker/nextcloud/app:/var/www/html | |||
entrypoint: /cron.sh | |||
depends_on: | |||
- nextcloud-db | |||
- redis | |||
networks: | |||
- nextcloud | |||
nextcloud-web: | |||
build: ./nextcloud-web | |||
restart: on-failure:5 | |||
container_name: nextcloud-web | |||
volumes: | |||
- /home/docker/nextcloud/app:/var/www/html | |||
labels: | |||
- traefik.docker.network=proxy | |||
- traefik.enable=true | |||
- traefik.protocol=http | |||
- traefik.port=80 | |||
- traefik.http.routers.nextcloud.tls=true | |||
- traefik.http.routers.nextcloud.entrypoints=websecure | |||
- traefik.http.routers.nextcloud.tls.certresolver=myresolver | |||
- traefik.http.routers.nextcloud.rule=Host(`pellets.journalismarena.eu`) | |||
- traefik.http.routers.nextcloud.middlewares=nextcloud,nextcloud_redirect | |||
- traefik.http.middlewares.nextcloud.headers.stsSeconds=155520011 | |||
- traefik.http.middlewares.nextcloud.headers.stsIncludeSubdomains=true | |||
- traefik.http.middlewares.nextcloud.headers.stsPreload=true | |||
- traefik.http.middlewares.nextcloud_redirect.redirectregex.regex=/.well-known/(card|cal)dav | |||
- traefik.http.middlewares.nextcloud_redirect.redirectregex.replacement=/remote.php/dav/ | |||
depends_on: | |||
- nextcloud | |||
security_opt: | |||
- no-new-privileges:true | |||
mem_limit: 4096M | |||
memswap_limit: 4096M | |||
networks: | |||
- proxy | |||
- nextcloud | |||
redis: | |||
image: redis:alpine | |||
restart: always | |||
container_name: nextcloud-redis | |||
command: redis-server --requirepass ZpP2FwwNeMXW7Fd | |||
networks: | |||
- nextcloud | |||
collabora: | |||
image: collabora/code | |||
container_name: collabora | |||
restart: unless-stopped | |||
mem_limit: 4096m | |||
environment: | |||
- domain=collabora-docs\\.digitalcourage\\.de | |||
- username=admin-user | |||
- password=6MktK8fu9Xx8iKrMu | |||
- extra_params=--o:logging.level=warning --o:ssl.enable=false --o:ssl.termination=true | |||
cap_add: | |||
- MKNOD | |||
networks: | |||
- proxy | |||
labels: | |||
- traefik.docker.network=proxy | |||
- traefik.enable=true | |||
- traefik.protocol=http | |||
- traefik.port=9080 | |||
- traefik.http.routers.collabora.tls=true | |||
- traefik.http.routers.collabora.entrypoints=websecure | |||
- traefik.http.routers.collabora.tls.certresolver=myresolver | |||
- traefik.http.routers.collabora.rule=Host(`collabora-docs.digitalcourage.de`) | |||
- traefik.http.routers.collabora.middlewares=collabora | |||
- traefik.http.middlewares.collabora.headers.customRequestHeaders.X-Forwarded-Proto=https | |||
- traefik.http.middlewares.collabora.headers.referrerPolicy=no-referrer | |||
- traefik.http.middlewares.collabora.headers.stsSeconds=31536000 | |||
- traefik.http.middlewares.collabora.headers.forceSTSHeader=true | |||
- traefik.http.middlewares.collabora.headers.stsPreload=true | |||
- traefik.http.middlewares.collabora.headers.stsIncludeSubdomains=true | |||
- traefik.http.middlewares.collabora.headers.browserXssFilter=true | |||
networks: | |||
proxy: | |||
external: true | |||
nextcloud: | |||
external: false |
@ -0,0 +1,2 @@ | |||
changed labels in docker-compose.yml under nextcloud-web nextcloud to sncf, middleware added sncf, the last two labels regarding | |||
redirects and social apps strg k |
@ -0,0 +1,30 @@ | |||
logLevel = "WARN" | |||
defaultEntryPoints = ["http", "https"] | |||
# Connection to docker host system (docker.sock) | |||
[docker] | |||
endpoint = "unix:///var/run/docker.sock" | |||
domain = "digitalcourage.de" | |||
watch = true | |||
# This will hide all docker containers that don't have explicitly | |||
# set label to "enable" | |||
exposedbydefault = false | |||
# Force HTTPS | |||
[entryPoints] | |||
[entryPoints.http] | |||
address = ":80" | |||
[entryPoints.http.redirect] | |||
entryPoint = "https" | |||
[entryPoints.https] | |||
address = ":443" | |||
[entryPoints.https.tls] | |||
# Let's encrypt configuration | |||
[acme] | |||
email = "operating@digitalcourage.de" | |||
storage="acme.json" | |||
entryPoint="https" | |||
OnHostRule = true | |||
[acme.httpChallenge] | |||
entryPoint = "http" | |||
@ -0,0 +1,179 @@ | |||
<config> | |||
<!-- Note: 'default' attributes are used to document a setting's default value as well as to use as fallback. --> | |||
<!-- Note: When adding a new entry, a default must be set in WSD in case the entry is missing upon deployment. --> | |||
<allowed_languages desc="List of supported languages of Writing Aids (spell checker, grammar checker, thesaurus, hyphenation) on this instance. Allowing too many has negative effect on startup performance." default="de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru">de_DE en_GB en_US es_ES fr_FR it nl pt_BR pt_PT ru</allowed_languages> | |||
<sys_template_path desc="Path to a template tree with shared libraries etc to be used as source for chroot jails for child processes." type="path" relative="true" default="systemplate"></sys_template_path> | |||
<child_root_path desc="Path to the directory under which the chroot jails for the child processes will be created. Should be on the same file system as systemplate and lotemplate. Must be an empty directory." type="path" relative="true" default="jails"></child_root_path> | |||
<mount_jail_tree desc="Controls whether the systemplate and lotemplate contents are mounted or not, which is much faster than the default of linking/copying each file." type="bool" default="true"></mount_jail_tree> | |||
<server_name desc="External hostname:port of the server running loolwsd. If empty, it's derived from the request (please set it if this doesn't work). Must be specified when behind a reverse-proxy or when the hostname is not reachable directly." type="string" default=""></server_name> | |||
<file_server_root_path desc="Path to the directory that should be considered root for the file server. This should be the directory containing loleaflet." type="path" relative="true" default="loleaflet/../"></file_server_root_path> | |||
<memproportion desc="The maximum percentage of system memory consumed by all of the Collabora Online Development Edition, after which we start cleaning up idle documents" type="double" default="80.0"></memproportion> | |||
<num_prespawn_children desc="Number of child processes to keep started in advance and waiting for new clients." type="uint" default="1">1</num_prespawn_children> | |||
<per_document desc="Document-specific settings, including LO Core settings."> | |||
<max_concurrency desc="The maximum number of threads to use while processing a document." type="uint" default="4">4</max_concurrency> | |||
<batch_priority desc="A (lower) priority for use by batch eg. convert-to processes to avoid starving interactive ones" type="uint" default="5">5</batch_priority> | |||
<document_signing_url desc="The endpoint URL of signing server, if empty the document signing is disabled" type="string" default="https://app.vereign.com">https://app.vereign.com</document_signing_url> | |||
<redlining_as_comments desc="If true show red-lines as comments" type="bool" default="false">false</redlining_as_comments> | |||
<idle_timeout_secs desc="The maximum number of seconds before unloading an idle document. Defaults to 1 hour." type="uint" default="3600">3600</idle_timeout_secs> | |||
<!-- Idle save and auto save are checked every 30 seconds --> | |||
<!-- They are disabled when the value is zero or negative. --> | |||
<idlesave_duration_secs desc="The number of idle seconds after which document, if modified, should be saved. Defaults to 30 seconds." type="int" default="30">30</idlesave_duration_secs> | |||
<autosave_duration_secs desc="The number of seconds after which document, if modified, should be saved. Defaults to 5 minutes." type="int" default="300">300</autosave_duration_secs> | |||
<always_save_on_exit desc="On exiting the last editor, always perform the save, even if the document is not modified." type="bool" default="false">false</always_save_on_exit> | |||
<limit_virt_mem_mb desc="The maximum virtual memory allowed to each document process. 0 for unlimited." type="uint">0</limit_virt_mem_mb> | |||
<limit_stack_mem_kb desc="The maximum stack size allowed to each document process. 0 for unlimited." type="uint">8000</limit_stack_mem_kb> | |||
<limit_file_size_mb desc="The maximum file size allowed to each document process to write. 0 for unlimited." type="uint">0</limit_file_size_mb> | |||
<limit_num_open_files desc="The maximum number of files allowed to each document process to open. 0 for unlimited." type="uint">0</limit_num_open_files> | |||
<limit_load_secs desc="Maximum number of seconds to wait for a document load to succeed. 0 for unlimited." type="uint" default="100">100</limit_load_secs> | |||
<limit_convert_secs desc="Maximum number of seconds to wait for a document conversion to succeed. 0 for unlimited." type="uint" default="100">100</limit_convert_secs> | |||
<cleanup desc="Checks for resource consuming (bad) documents and kills associated kit process. A document is considered resource consuming (bad) if is in idle state for idle_time_secs period and memory usage passed limit_dirty_mem_mb or CPU usage passed limit_cpu_per" enable="false"> | |||
<cleanup_interval_ms desc="Interval between two checks" type="uint" default="10000">10000</cleanup_interval_ms> | |||
<bad_behavior_period_secs desc="Minimum time period for a document to be in bad state before associated kit process is killed. If in this period the condition for bad document is not met once then this period is reset" type="uint" default="60">60</bad_behavior_period_secs> | |||
<idle_time_secs desc="Minimum idle time for a document to be candidate for bad state" type="uint" default="300">300</idle_time_secs> | |||
<limit_dirty_mem_mb desc="Minimum memory usage for a document to be candidate for bad state" type="uint" default="3072">3072</limit_dirty_mem_mb> | |||
<limit_cpu_per desc="Minimum CPU usage for a document to be candidate for bad state" type="uint" default="85">85</limit_cpu_per> | |||
</cleanup> | |||
</per_document> | |||
<per_view desc="View-specific settings."> | |||
<out_of_focus_timeout_secs desc="The maximum number of seconds before dimming and stopping updates when the browser tab is no longer in focus. Defaults to 120 seconds." type="uint" default="120">120</out_of_focus_timeout_secs> | |||
<idle_timeout_secs desc="The maximum number of seconds before dimming and stopping updates when the user is no longer active (even if the browser is in focus). Defaults to 15 minutes." type="uint" default="900">900</idle_timeout_secs> | |||
</per_view> | |||
<loleaflet_html desc="Allows UI customization by replacing the single endpoint of loleaflet.html" type="string" default="loleaflet.html">loleaflet.html</loleaflet_html> | |||
<logging> | |||
<color type="bool">true</color> | |||
<level type="string" desc="Can be 0-8, or none (turns off logging), fatal, critical, error, warning, notice, information, debug, trace" default="warning">warning</level> | |||
<protocol type="bool" desc="Enable minimal client-site JS protocol logging from the start">false</protocol> | |||
<file enable="false"> | |||
<!-- If you use other path than /var/log and you run loolwsd from systemd, make sure that you enable that path in loolwsd.service (ReadWritePaths). --> | |||
<property name="path" desc="Log file path.">/var/log/loolwsd.log</property> | |||
<property name="rotation" desc="Log file rotation strategy. See Poco FileChannel.">never</property> | |||
<property name="archive" desc="Append either timestamp or number to the archived log filename.">timestamp</property> | |||
<property name="compress" desc="Enable/disable log file compression.">true</property> | |||
<property name="purgeAge" desc="The maximum age of log files to preserve. See Poco FileChannel.">10 days</property> | |||
<property name="purgeCount" desc="The maximum number of log archives to preserve. Use 'none' to disable purging. See Poco FileChannel.">10</property> | |||
<property name="rotateOnOpen" desc="Enable/disable log file rotation on opening.">true</property> | |||
<property name="flush" desc="Enable/disable flushing after logging each line. May harm performance. Note that without flushing after each line, the log lines from the different processes will not appear in chronological order.">false</property> | |||
</file> | |||
<anonymize> | |||
<anonymize_user_data type="bool" desc="Enable to anonymize/obfuscate of user-data in logs. If default is true, it was forced at compile-time and cannot be disabled." default="false">false</anonymize_user_data> | |||
<anonymization_salt type="uint" desc="The salt used to anonymize/obfuscate user-data in logs. Use a secret 64-bit random number." default="82589933">82589933</anonymization_salt> | |||
</anonymize> | |||
</logging> | |||
<loleaflet_logging desc="Logging in the browser console" default="false">false</loleaflet_logging> | |||
<trace desc="Dump commands and notifications for replay. When 'snapshot' is true, the source file is copied to the path first." enable="false"> | |||
<path desc="Output path to hold trace file and docs. Use '%' for timestamp to avoid overwriting. For example: /some/path/to/looltrace-%.gz" compress="true" snapshot="false"></path> | |||
<filter> | |||
<message desc="Regex pattern of messages to exclude"></message> | |||
</filter> | |||
<outgoing> | |||
<record desc="Whether or not to record outgoing messages" default="false">false</record> | |||
</outgoing> | |||
</trace> | |||
<net desc="Network settings"> | |||
<!-- On systems where localhost resolves to IPv6 [::1] address first, when net.proto is all and net.listen is loopback, loolwsd unexpectedly listens on [::1] only. | |||
You need to change net.proto to IPv4, if you want to use 127.0.0.1. --> | |||
<proto type="string" default="all" desc="Protocol to use IPv4, IPv6 or all for both">all</proto> | |||
<listen type="string" default="any" desc="Listen address that loolwsd binds to. Can be 'any' or 'loopback'.">any</listen> | |||
<service_root type="path" default="" desc="Prefix all the pages, websockets, etc. with this path."></service_root> | |||
<proxy_prefix type="bool" default="false" desc="Enable a ProxyPrefix to be passed int through which to redirect requests"></proxy_prefix> | |||
<post_allow desc="Allow/deny client IP address for POST(REST)." allow="true"> | |||
<host desc="The IPv4 private 192.168 block as plain IPv4 dotted decimal addresses.">192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Ditto, but as IPv4-mapped IPv6 addresses">::ffff:192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="The IPv4 loopback (localhost) address.">127\.0\.0\.1</host> | |||
<host desc="Ditto, but as IPv4-mapped IPv6 address">::ffff:127\.0\.0\.1</host> | |||
<host desc="The IPv6 loopback (localhost) address.">::1</host> | |||
<host desc="The IPv4 private 172.17.0.0/16 subnet (Docker).">172\.17\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Ditto, but as IPv4-mapped IPv6 addresses">::ffff:172\.17\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
</post_allow> | |||
<frame_ancestors desc="Specify who is allowed to embed the LO Online iframe (loolwsd and WOPI host are always allowed). Separate multiple hosts by space."></frame_ancestors> | |||
<connection_timeout_secs desc="Specifies the connection, send, recv timeout in seconds for connections initiated by loolwsd (such as WOPI connections)." type="int" default="30"></connection_timeout_secs> | |||
</net> | |||
<ssl desc="SSL settings"> | |||
<enable type="bool" desc="Controls whether SSL encryption between browser and loolwsd is enabled (do not disable for production deployment). If default is false, must first be compiled with SSL support to enable." default="true">false</enable> | |||
<termination desc="Connection via proxy where loolwsd acts as working via https, but actually uses http." type="bool" default="true">true</termination> | |||
<cert_file_path desc="Path to the cert file" relative="false">/etc/loolwsd/cert.pem</cert_file_path> | |||
<key_file_path desc="Path to the key file" relative="false">/etc/loolwsd/key.pem</key_file_path> | |||
<ca_file_path desc="Path to the ca file" relative="false">/etc/loolwsd/ca-chain.cert.pem</ca_file_path> | |||
<cipher_list desc="List of OpenSSL ciphers to accept" default="ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH"></cipher_list> | |||
<hpkp desc="Enable HTTP Public key pinning" enable="false" report_only="false"> | |||
<max_age desc="HPKP's max-age directive - time in seconds browser should remember the pins" enable="true">1000</max_age> | |||
<report_uri desc="HPKP's report-uri directive - pin validation failure are reported at this URL" enable="false"></report_uri> | |||
<pins desc="Base64 encoded SPKI fingerprints of keys to be pinned"> | |||
<pin></pin> | |||
</pins> | |||
</hpkp> | |||
</ssl> | |||
<security desc="Altering these defaults potentially opens you to significant risk"> | |||
<seccomp desc="Should we use the seccomp system call filtering." type="bool" default="true">true</seccomp> | |||
<capabilities desc="Should we require capabilities to isolate processes into chroot jails" type="bool" default="true">true</capabilities> | |||
</security> | |||
<watermark> | |||
<opacity desc="Opacity of on-screen watermark from 0.0 to 1.0" type="double" default="0.2"></opacity> | |||
<text desc="Watermark text to be displayed on the document if entered" type="string"></text> | |||
</watermark> | |||
<welcome> | |||
<enable type="bool" desc="Controls whether the welcome screen should be shown to the users on new install and updates." default="false">false</enable> | |||
<enable_button type="bool" desc="Controls whether the welcome screen should have an explanatory button instead of an X button to close the dialog." default="false">false</enable_button> | |||
<path desc="Path to 'welcome-$lang.html' files served on first start or when the version changes. When empty, defaults to the Release notes." type="path" relative="true" default="loleaflet/welcome"></path> | |||
</welcome> | |||
<user_interface> | |||
<mode type="string" desc="Controls the user interface style (classic|notebookbar)" default="notebookbar">notebookbar</mode> | |||
</user_interface> | |||
<storage desc="Backend storage"> | |||
<filesystem allow="false" /> | |||
<wopi desc="Allow/deny wopi storage." allow="true"> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="true">cloud-forms\.digitalcourage\.de</host> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="true">10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.1[6789]\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.2[0-9]\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="true">172\.3[01]\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="true">192\.168\.[0-9]{1,3}\.[0-9]{1,3}</host> | |||
<host desc="Regex pattern of hostname to allow or deny." allow="false">192\.168\.1\.1</host> | |||
<max_file_size desc="Maximum document size in bytes to load. 0 for unlimited." type="uint">0</max_file_size> | |||
<reuse_cookies desc="When enabled, cookies from the browser will be captured and set on WOPI requests." type="bool" default="false">false</reuse_cookies> | |||
<locking desc="Locking settings"> | |||
<refresh desc="How frequently we should re-acquire a lock with the storage server, in seconds (default 15 mins) or 0 for no refresh" type="int" default="900">900</refresh> | |||
</locking> | |||
</wopi> | |||
<webdav desc="Allow/deny webdav storage. Mutually exclusive with wopi." allow="false"> | |||
<host desc="Hostname to allow" allow="true">cloud-forms.digitalcourage.de</host> | |||
</webdav> | |||
<ssl desc="SSL settings"> | |||
<enable type="bool" desc="If as_scheme is false or not set, this can be set to force SSL encryption between storage and loolwsd. When empty this defaults to following the ssl.enable setting"></enable> | |||
<cert_file_path desc="Path to the cert file" relative="false"></cert_file_path> | |||
<key_file_path desc="Path to the key file" relative="false"></key_file_path> | |||
<ca_file_path desc="Path to the ca file. If this is not empty, then SSL verification will be strict, otherwise cert of storage (WOPI-like host) will not be verified." relative="false"></ca_file_path> | |||
<cipher_list desc="List of OpenSSL ciphers to accept. If empty the defaults are used. These can be overridden only if absolutely needed."></cipher_list> | |||
</ssl> | |||
</storage> | |||
<tile_cache_persistent desc="Should the tiles persist between two editing sessions of the given document?" type="bool" default="true">true</tile_cache_persistent> | |||
<admin_console desc="Web admin console settings."> | |||
<enable desc="Enable the admin console functionality" type="bool" default="true">true</enable> | |||
<enable_pam desc="Enable admin user authentication with PAM" type="bool" default="false">false</enable_pam> | |||
<username desc="The username of the admin console. Ignored if PAM is enabled.">admin</username> | |||
<password desc="The password of the admin console. Deprecated on most platforms. Instead, use PAM or loolconfig to set up a secure password.">Mt5q7XeepHWGZrsOS7GrWLWv2h6jKirF</password> | |||
</admin_console> | |||
<monitors desc="Addresses of servers we connect to on start for monitoring"> | |||
</monitors> | |||
</config> |
@ -0,0 +1,422 @@ | |||
Nextcloud is written by: | |||
- AW-UC <git@a-wesemann.de> | |||
- Aaron Wood <aaronjwood@gmail.com> | |||
- Abijeet <abijeetpatro@gmail.com> | |||
- Achim Königs <garfonso@tratschtante.de> | |||
- Adam Williamson <awilliam@redhat.com> | |||
- Administrator "Administrator@WINDOWS-2012" | |||
- Adrian Brzezinski <adrian.brzezinski@eo.pl> | |||
- Aldo "xoen" Giambelluca <xoen@xoen.org> | |||
- Alecks Gates <alecks.g@gmail.com> | |||
- Alejandro Varela <epma01@gmail.com> | |||
- Alex Weirig <alex.weirig@technolink.lu> | |||
- Alexander A. Klimov <grandmaster@al2klimov.de> | |||
- Alexander Bergolth <leo@strike.wu.ac.at> | |||
- Alexey Pyltsyn <lex61rus@gmail.com> | |||
- Allan Nordhøy <epost@anotheragency.no> | |||
- Andreas Fischer <bantu@owncloud.com> | |||
- Andreas Pflug <dev@admin4.org> | |||
- Andrew Brown <andrew@casabrown.com> | |||
- André Gaul <gaul@web-yard.de> | |||
- Ardinis <Ardinis@users.noreply.github.com> | |||
- Ari Selseng <ari@selseng.net> | |||
- Arne Hamann <kontakt+github@arne.email> | |||
- Artem Kochnev <MrJeos@gmail.com> | |||
- Artem Sidorenko <artem@posteo.de> | |||
- Arthur Schiwon <blizzz@arthur-schiwon.de> | |||
- Axel Helmert <axel.helmert@luka.de> | |||
- Bart Visscher <bartv@thisnet.nl> | |||
- Bartek Przybylski <bart.p.pl@gmail.com> | |||
- Bastien Durel <bastien@durel.org> | |||
- Bastien Ho <bastienho@urbancube.fr> | |||
- Benjamin Diele <benjamin@diele.be> | |||
- Benjamin Liles <benliles@arch.tamu.edu> | |||
- Bernhard Ostertag <bernieo.code@gmx.de> | |||
- Bernhard Posselt <dev@bernhard-posselt.com> | |||
- Bernhard Reiter <ockham@raz.or.at> | |||
- Birk Borkason <daniel.niccoli@gmail.com> | |||
- Bjoern Schiessle <bjoern@schiessle.org> | |||
- Björn Schießle <bjoern@schiessle.org> | |||
- Blaok <i@blaok.me> | |||
- Boris Rybalkin <ribalkin@gmail.com> | |||
- Borjan Tchakaloff <borjan@tchakaloff.fr> | |||
- Brad Rubenstein <brad@wbr.tech> | |||
- Brandon Kirsch <brandonkirsch@github.com> | |||
- Branko Kokanovic <branko@kokanovic.org> | |||
- Brice Maron <brice@bmaron.net> | |||
- Byron Marohn <combustible@live.com> | |||
- Carla Schroder <carla@owncloud.com> | |||
- Carlos Cerrillo <ccerrillo@gmail.com> | |||
- Carsten Wiedmann <carsten_sttgt@gmx.de> | |||
- Christian <16852529+cviereck@users.noreply.github.com> | |||
- Christian Berendt <berendt@b1-systems.de> | |||
- Christian Jürges <christian@eqipe.ch> | |||
- Christian Kampka <christian@kampka.net> | |||
- Christian Oliff <christianoliff@yahoo.com> | |||
- Christoph Schaefer "christophł@wolkesicher.de" | |||
- Christoph Seitz <christoph.seitz@posteo.de> | |||
- Christoph Wickert <cwickert@suse.de> | |||
- Christoph Wurst <christoph@winzerhof-wurst.at> | |||
- Christopher Bartz <bartz@dkrz.de> | |||
- Christopher Schäpers <kondou@ts.unde.re> | |||
- Christopher T. Johnson <ctjctj@gmail.com> | |||
- Clark Tomlinson <fallen013@gmail.com> | |||
- Clement Wong <git@clement.hk> | |||
- Cornelius Kölbel <cornelius.koelbel@netknights.it> | |||
- Cthulhux <git@tuxproject.de> | |||
- Damjan Georgievski <gdamjan@gmail.com> | |||
- Dan Callahan <dan.callahan@gmail.com> | |||
- Daniel Calviño Sánchez <danxuliu@gmail.com> | |||
- Daniel Hansson <daniel@techandme.se> | |||
- Daniel Jagszent <daniel@jagszent.de> | |||
- Daniel Kesselberg <mail@danielkesselberg.de> | |||
- Daniel Rudolf <github.com@daniel-rudolf.de> | |||
- Daniel Schneider <daniel@schneidoa.de> | |||
- Dariusz Olszewski <starypatyk@users.noreply.github.com> | |||
- David Prévot <taffit@debian.org> | |||
- David Toledo <dtoledo@solidgear.es> | |||
- Denis Mosolov <denismosolov@gmail.com> | |||
- Derek <derek.kelly27@gmail.com> | |||
- Dominik Schmidt <dev@dominik-schmidt.de> | |||
- Donquixote <marjunebatac@gmail.com> | |||
- Elijah Martin-Merrill <elijah@nyp-itsours.com> | |||
- Eric Masseran <rico.masseran@gmail.com> | |||
- Estelle Poulin <dev@inspiredby.es> | |||
- Evgeny Golyshev <eugulixes@gmail.com> | |||
- Fabrizio Steiner <fabrizio.steiner@gmail.com> | |||
- Felix Epp <work@felixepp.de> | |||
- Felix Heidecke <felix@heidecke.me> | |||
- Felix Moeller <mail@felixmoeller.de> | |||
- Felix Nieuwenhuizen <felix@tdlrali.com> | |||
- Felix Nüsse <Felix.nuesse@t-online.de> | |||
- Felix Rupp <github@felixrupp.com> | |||
- Filis Futsarov <filisko@users.noreply.github.com> | |||
- Florent <florent@coppint.com> | |||
- Florin Peter <github@florin-peter.de> | |||
- Flávio Gomes da Silva Lisboa <flavio.lisboa@serpro.gov.br> | |||
- Frank Isemann <frank@isemann.name> | |||
- Frank Karlitschek <frank@karlitschek.de> | |||
- François Kubler <francois@kubler.org> | |||
- Frederic Werner <frederic-github@werner-net.work> | |||
- Frédéric Fortier <frederic.fortier@oronospolytechnique.com> | |||
- Gary Kim <gary@garykim.dev> | |||
- Georg Ehrke <oc.list@georgehrke.com> | |||
- GrayFix <grayfix@gmail.com> | |||
- Greta Doci <gretadoci@gmail.com> | |||
- GretaD <gretadoci@gmail.com> | |||
- Guillaume COMPAGNON <gcompagnon@outlook.com> | |||
- Hemanth Kumar Veeranki <hems.india1997@gmail.com> | |||
- Hendrik Leppelsack <hendrik@leppelsack.de> | |||
- Holger Hees <holger.hees@gmail.com> | |||
- Ilja Neumann <ineumann@owncloud.com> | |||
- Individual IT Services <info@individual-it.net> | |||
- J0WI <J0WI@users.noreply.github.com> | |||
- Jaakko Salo <jaakkos@gmail.com> | |||
- Jacob Neplokh <me@jacobneplokh.com> | |||
- Jakob Sack <mail@jakobsack.de> | |||
- Jakub Onderka <ahoj@jakubonderka.cz> | |||
- Jan C. Borchardt <hey@jancborchardt.net> | |||
- Jan-Christoph Borchardt <hey@jancborchardt.net> | |||
- Jan-Philipp Litza <jplitza@users.noreply.github.com> | |||
- Janis Köhr <janis.koehr@novatec-gmbh.de> | |||
- Jared Boone <jared.boone@gmail.com> | |||
- Jarkko Lehtoranta <devel@jlranta.com> | |||
- Jean-Louis Dupond <jean-louis@dupond.be> | |||
- Jens-Christian Fischer <jens-christian.fischer@switch.ch> | |||
- Jesús Macias <jmacias@solidgear.es> | |||
- Joachim Bauch <bauch@struktur.de> | |||
- Joachim Sokolowski <github@sokolowski.org> | |||
- Joas Schilling <coding@schilljs.com> | |||
- Joel S <joel.devbox@protonmail.com> | |||
- Johan Björk <johanimon@gmail.com> | |||
- Johannes Ernst <jernst@indiecomputing.com> | |||
- Johannes Riedel <joeried@users.noreply.github.com> | |||
- Johannes Schlichenmaier <johannes@schlichenmaier.info> | |||
- Johannes Willnecker <johannes@willnecker.com> | |||
- John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com> | |||
- Jonas Sulzer <jonas@violoncello.ch> | |||
- Jonny007-MKD <1-23-4-5@web.de> | |||
- Jos Poortvliet <jos@opensuse.org> | |||
- Jose Quinteiro <github@quinteiro.org> | |||
- Juan Pablo Villafañez <jvillafanez@solidgear.es> | |||
- Juan Pablo Villafáñez <jvillafanez@solidgear.es> | |||
- Julien Lutran <julien.lutran@corp.ovh.com> | |||
- Julien Veyssier <eneiluj@posteo.net> | |||
- Julius Haertl <jus@bitgrid.net> | |||
- Julius Härtl <jus@bitgrid.net> | |||
- Jörn Friedrich Dreyer <jfd@butonic.de> | |||
- KB7777 <k.burkowski@gmail.com> | |||
- Kamil Domanski <kdomanski@kdemail.net> | |||
- Kawohl <john@owncloud.com> | |||
- Kenneth Newwood <kenneth@newwood.name> | |||
- Kevin Lanni <therealklanni@gmail.com> | |||
- Kevin Ndung'u <kevgathuku@gmail.com> | |||
- Kim Brose <kim.brose@rwth-aachen.de> | |||
- Klaas Freitag <freitag@owncloud.com> | |||
- Knut Ahlers <knut@ahlers.me> | |||
- Ko- <k.stoffelen@cs.ru.nl> | |||
- Konrad Bucheli <kb@open.ch> | |||
- Kristof Provost <github@sigsegv.be> | |||
- Kyle Fazzari <kyrofa@ubuntu.com> | |||
- Lars <winnetou+github@catolic.de> | |||
- Lars Knickrehm <mail@lars-sh.de> | |||
- Laurens Post <Crote@users.noreply.github.com> | |||
- Laurens Post <lkpost@scept.re> | |||
- Lauris Binde <laurisb@users.noreply.github.com> | |||
- Lennart Rosam <hello@takuto.de> | |||
- Lennart Rosam <lennart.rosam@medien-systempartner.de> | |||
- Leon Klingele <git@leonklingele.de> | |||
- Leon Klingele <leon@struktur.de> | |||
- Liam Dennehy <liam@wiemax.net> | |||
- Liam JACK <liamjack@users.noreply.github.com> | |||
- Lionel Elie Mamane <lionel@mamane.lu> | |||
- Loki3000 <github@labcms.ru> | |||
- Lorenzo M. Catucci <lorenzo@sancho.ccd.uniroma2.it> | |||
- Lukas Reschke <lukas@statuscode.ch> | |||
- Lukas Stabe <lukas@stabe.de> | |||
- Luke Policinski <lpolicinski@gmail.com> | |||
- Magnus Walbeck <mw@mwalbeck.org> | |||
- Marcel Klehr <mklehr@gmx.net> | |||
- Marcel Waldvogel <marcel.waldvogel@uni-konstanz.de> | |||
- Marin Treselj <marin@pixelipo.com> | |||
- Mario Danic <mario@lovelyhq.com> | |||
- Mario Kolling <mario.kolling@serpro.gov.br> | |||
- Marius Blüm <marius@lineone.io> | |||
- Marius David Wieschollek <git.public@mdns.eu> | |||
- Markus Goetz <markus@woboq.com> | |||
- Markus Staab <markus.staab@redaxo.de> | |||
- MartB <mart.b@outlook.de> | |||
- Martin <github@diemattels.at> | |||
- Martin Konrad <info@martin-konrad.net> | |||
- Martin Konrad <konrad@frib.msu.edu> | |||
- Martin Mattel <martin.mattel@diemattels.at> | |||
- Marvin Thomas Rabe <mrabe@marvinrabe.de> | |||
- Masaki Kawabata Neto <masaki.kawabata@gmail.com> | |||
- MasterOfDeath <rinat.gumirov@mail.ru> | |||
- Matthew Setter <matthew@matthewsetter.com> | |||
- Max Kovalenko <mxss1998@yandex.ru> | |||
- Maxence Lange <maxence@artificial-owl.com> | |||
- Maxence Lange <maxence@nextcloud.com> | |||
- Maxence Lange <maxence@pontapreta.net> | |||
- MichaIng <28480705+MichaIng@users.noreply.github.com> | |||
- MichaIng <micha@dietpi.com> | |||
- Michael Gapczynski <GapczynskiM@gmail.com> | |||
- Michael Göhler <somebody.here@gmx.de> | |||
- Michael Jobst <mjobst+github@tecratech.de> | |||
- Michael Kuhn <michael@ikkoku.de> | |||
- Michael Letzgus <www@chronos.michael-letzgus.de> | |||
- Michael Roitzsch <reactorcontrol@icloud.com> | |||
- Michael Roth <michael.roth@rz.uni-augsburg.de> | |||
- Michael Weimann <mail@michael-weimann.eu> | |||
- Michael Zamot <michael@zamot.io> | |||
- Michał Węgrzynek <michal.wegrzynek@malloc.com.pl> | |||
- Miguel Prokop <miguel.prokop@vtu.com> | |||
- Mikael Hammarin <mikael@try2.se> | |||
- Mitar <mitar.git@tnode.com> | |||
- Mohammed Abdellatif <m.latief@gmail.com> | |||
- Morris Jobke <hey@morrisjobke.de> | |||
- Nicolai Ehemann <en@enlightened.de> | |||
- Nicolas Grekas <nicolas.grekas@gmail.com> | |||
- Nils <git@to.nilsschnabel.de> | |||
- Nils Wittenbrink <nilswittenbrink@web.de> | |||
- Nmz <nemesiz@nmz.lt> | |||
- Noveen Sachdeva <noveen.sachdeva@research.iiit.ac.in> | |||
- Ole Ostergaard <ole.c.ostergaard@gmail.com> | |||
- Ole Ostergaard <ole.ostergaard@knime.com> | |||
- Oliver Gasser <oliver.gasser@gmail.com> | |||
- Oliver Kohl D.Sc. <oliver@kohl.bz> | |||
- Oliver Salzburg <oliver.salzburg@gmail.com> | |||
- Oliver Wegner <void1976@gmail.com> | |||
- Olivier Paroz <github@oparoz.com> | |||
- Owen Winkler <a_github@midnightcircus.com> | |||
- Pascal de Bruijn <pmjdebruijn@pcode.nl> | |||
- Patrick Paysant <patrick.paysant@linagora.com> | |||
- Patrik Kernstock <info@pkern.at> | |||
- Pauli Järvinen <pauli.jarvinen@gmail.com> | |||
- Pavel Krasikov <klonishe@gmail.com> | |||
- Pellaeon Lin <nfsmwlin@gmail.com> | |||
- Peter Kubica <peter@kubica.ch> | |||
- Phil Davis <phil.davis@inf.org> | |||
- Philipp Kapfer <philipp.kapfer@gmx.at> | |||
- Philipp Schaffrath <github@philipp.schaffrath.email> | |||
- Philipp Staiger <philipp@staiger.it> | |||
- Philippe Jung <phil.jung@free.fr> | |||
- Pierre Ozoux <pierre@ozoux.net> | |||
- Pierre Rudloff <contact@rudloff.pro> | |||
- Piotr Filiciak <piotr@filiciak.pl> | |||
- Piotr M <mrow4a@yahoo.com> | |||
- Piotr Mrowczynski <mrow4a@yahoo.com> | |||
- Piotr Mrówczyński <mrow4a@yahoo.com> | |||
- Qingping Hou <dave2008713@gmail.com> | |||
- Ralph Krimmel <rkrimme1@gwdg.de> | |||
- Ramiro Aparicio <rapariciog@gmail.com> | |||
- Randolph Carter <RandolphCarter@fantasymail.de> | |||
- Rayn0r <andrew@ilpss8.myfirewall.org> | |||
- RealRancor <Fisch.666@gmx.de> | |||
- RealRancor <fisch.666@gmx.de> | |||
- Rello <Rello@users.noreply.github.com> | |||
- Remco Brenninkmeijer <requist1@starmail.nl> | |||
- Rinat Gumirov <rinat.gumirov@mail.ru> | |||
- Robert Dailey <rcdailey@gmail.com> | |||
- Robin Appelman <robin@icewind.nl> | |||
- Robin McCorkell <robin@mccorkell.me.uk> | |||
- Robin Müller <coder-hugo@users.noreply.github.com> | |||
- Roeland Jago Douma <roeland@famdouma.nl> | |||
- Roger Szabo <roger.szabo@web.de> | |||
- Roland Tapken <roland@bitarbeiter.net> | |||
- Romain Rivière <lecoyote@lecoyote.org> | |||
- Roman Kreisel <mail@romankreisel.de> | |||
- Ross Nicoll <jrn@jrn.me.uk> | |||
- Ruben Homs <ruben@homs.codes> | |||
- RussellAult <RussellAult@users.noreply.github.com> | |||
- Rémy Jacquin <remy@remyj.fr> | |||
- S. Cat <33800996+sparrowjack63@users.noreply.github.com> | |||
- SA <stephen@mthosting.net> | |||
- Sam Bull <aa6bs0@sambull.org> | |||
- Sam Tuke <mail@samtuke.com> | |||
- Samuel CHEMLA <chemla.samuel@gmail.com> | |||
- Sander Ruitenbeek <s.ruitenbeek@getgoing.nl> | |||
- Sander Ruitenbeek <sander@grids.be> | |||
- Sandro Lutz <sandro.lutz@temparus.ch> | |||
- Sascha Sambale <mastixmc@gmail.com> | |||
- Sascha Wiswedel <sascha.wiswedel@nextcloud.com> | |||
- Scott Dutton <exussum12@users.noreply.github.com> | |||
- Scott Dutton <scott@exussum.co.uk> | |||
- Scott Shambarger <devel@shambarger.net> | |||
- Sean Comeau <sean@ftlnetworks.ca> | |||
- Sebastian Döll <sebastian.doell@libasys.de> | |||
- Sebastian Steinmetz <462714+steiny2k@users.noreply.github.com> | |||
- Sebastian Steinmetz <me@sebastiansteinmetz.ch> | |||
- Sebastian Wessalowski <sebastian@wessalowski.org> | |||
- Semih Serhat Karakaya <karakayasemi@itu.edu.tr> | |||
- Senorsen <senorsen.zhang@gmail.com> | |||
- Serge Martin <edb@sigluy.net> | |||
- Sergej Nikolaev <kinolaev@gmail.com> | |||
- Sergej Pupykin <pupykin.s@gmail.com> | |||
- Sergey Shliakhov <husband.sergey@gmail.com> | |||
- Sergio Bertolin <sbertolin@solidgear.es> | |||
- Sergio Bertolín <sbertolin@solidgear.es> | |||
- Simon Könnecke <simonkoennecke@gmail.com> | |||
- Simon Spannagel <simonspa@kth.se> | |||
- Simounet <contact@simounet.net> | |||
- Sjors van der Pluijm <sjors@desjors.nl> | |||
- Stefan Rado <owncloud@sradonia.net> | |||
- Stefan Schneider <stefan.schneider@squareweave.com.au> | |||
- Stefan Weiberg <sweiberg@suse.com> | |||
- Stefan Weil <sw@weilnetz.de> | |||
- Steffen Lindner <mail@steffen-lindner.de> | |||
- Stephan Müller <mail@stephanmueller.eu> | |||
- Stephan Peijnik <speijnik@anexia-it.com> | |||
- Stephen Cuppett <steve@cuppett.com> | |||
- Steven Bühner <buehner@me.com> | |||
- Sujith H <sharidasan@owncloud.com> | |||
- Sven Strickroth <email@cs-ware.de> | |||
- Sylvia van Os <sylvia@hackerchick.me> | |||
- Tekhnee <info@tekhnee.org> | |||
- Temtaime <temtaime@gmail.com> | |||
- Thibaut GRIDEL <tgridel@free.fr> | |||
- Thomas Citharel <nextcloud@tcit.fr> | |||
- Thomas Ebert <thomas.ebert@usability.de> | |||
- Thomas Müller <thomas.mueller@tmit.eu> | |||
- Thomas Pulzer <t.pulzer@kniel.de> | |||
- Thomas Tanghus <thomas@tanghus.net> | |||
- Tiago Flores <tiago.flores@yahoo.com.br> | |||
- Tigran Mkrtchyan <tigran.mkrtchyan@desy.de> | |||
- Tim Dettrick <t.dettrick@uq.edu.au> | |||
- Tim Obert <tobert@w-commerce.de> | |||
- Tim Terhorst <mynamewastaken+gitlab@gmail.com> | |||
- TimObert <tobert@w-commerce.de> | |||
- Timo Förster <tfoerster@webfoersterei.de> | |||
- Tobia De Koninck <LEDfan@users.noreply.github.com> | |||
- Tobia De Koninck <tobia@ledfan.be> | |||
- Tobias Kaminsky <tobias@kaminsky.me> | |||
- Tobias Perschon <tobias@perschon.at> | |||
- Tom Needham <tom@owncloud.com> | |||
- Tomasz Paluszkiewicz <tomasz.paluszkiewicz@gmail.com> | |||
- Tor Lillqvist <tml@collabora.com> | |||
- Unknown <anpz.asutp@gmail.com> | |||
- Valdnet <47037905+Valdnet@users.noreply.github.com> | |||
- Victor Dubiniuk <dubiniuk@owncloud.com> | |||
- Viktor Szépe <viktor@szepe.net> | |||
- Vincent Chan <plus.vincchan@gmail.com> | |||
- Vincent Petry <pvince81@owncloud.com> | |||
- Vinicius Cubas Brand <vinicius@eita.org.br> | |||
- Vitor Mattos <vitor@php.rio> | |||
- Vlastimil Pecinka <pecinka@email.cz> | |||
- Volkan Gezer <volkangezer@gmail.com> | |||
- Volker <skydiablo@gmx.net> | |||
- William Pain <pain.william@gmail.com> | |||
- Xheni Myrtaj <myrtajxheni@gmail.com> | |||
- Xuanwo <xuanwo@yunify.com> | |||
- adrien <adrien.waksberg@believedigital.com> | |||
- alexweirig <alex.weirig@technolink.lu> | |||
- b108@volgograd "b108@volgograd" | |||
- bladewing <lukas@ifflaender-family.de> | |||
- bline <scottbeck@gmail.com> | |||
- blizzz <blizzz@arthur-schiwon.de> | |||
- brad2014 <brad2014@users.noreply.github.com> | |||
- brumsel <brumsel@losecatcher.de> | |||
- cetra3 <peter@parashift.com.au> | |||
- cmeh <cmeh@users.noreply.github.com> | |||
- comradekingu <epost@anotheragency.no> | |||
- dartcafe <github@dartcafe.de> | |||
- davidgumberg <davidnoizgumberg@gmail.com> | |||
- davitol <dtoledo@solidgear.es> | |||
- derkostka <sebastian.kostka@gmail.com> | |||
- duritong <peter.meier+github@immerda.ch> | |||
- eduardo <eduardo@vnexu.net> | |||
- enoch <lanxenet@hotmail.com> | |||
- exner104 <59639860+exner104@users.noreply.github.com> | |||
- fabian <fabian@web2.0-apps.de> | |||
- felixboehm <felix@webhippie.de> | |||
- fnuesse <felix.nuesse@t-online.de> | |||
- fnuesse <fnuesse@techfak.uni-bielefeld.de> | |||
- helix84 <helix84@centrum.sk> | |||
- hkjolhede <hkjolhede@gmail.com> | |||
- ideaship <ideaship@users.noreply.github.com> | |||
- j-ed <juergen@eisfair.org> | |||
- j3l11234 <297259024@qq.com> | |||
- jaltek <jaltek@mailbox.org> | |||
- jknockaert <jasper@knockaert.nl> | |||
- josh4trunks <joshruehlig@gmail.com> | |||
- karakayasemi <karakayasemi@itu.edu.tr> | |||
- korelstar <korelstar@users.noreply.github.com> | |||
- lui87kw <lukas.ifflaender@uni-wuerzburg.de> | |||
- macjohnny <estebanmarin@gmx.ch> | |||
- marco44 <cousinmarc@gmail.com> | |||
- martin-rueegg <martin.rueegg@metaworx.ch> | |||
- martin.mattel@diemattels.at <martin.mattel@diemattels.at> | |||
- martink-p <47943787+martink-p@users.noreply.github.com> | |||
- michaelletzgus <michaelletzgus@users.noreply.github.com> | |||
- michag86 <micha_g@arcor.de> | |||
- mmccarn <mmccarn-github@mmsionline.us> | |||
- nhirokinet <nhirokinet@nhiroki.net> | |||
- nishiki <nishiki@yaegashi.fr> | |||
- onehappycat <one.happy.cat@gmx.com> | |||
- oparoz <owncloud@interfasys.ch> | |||
- phisch <git@philippschaffrath.de> | |||
- rakekniven <mark.ziegler@rakekniven.de> | |||
- rawtaz <rawtaz@users.noreply.github.com> | |||
- root "root@oc.(none)" | |||
- root <root@localhost.localdomain> | |||
- rubo77 <github@r.z11.de> | |||
- sammo2828 <sammo2828@gmail.com> | |||
- scambra <sergio@entrecables.com> | |||
- scolebrook <scolebrook@mac.com> | |||
- shkdee <louis.traynard@m4x.org> | |||
- simonspa <1677436+simonspa@users.noreply.github.com> | |||
- sualko <klaus@jsxc.org> | |||
- tbartenstein <tbartenstein@users.noreply.github.com> | |||
- tbelau666 <thomas.belau@gmx.de> | |||
- tux-rampage <tux-rampage@users.noreply.github.com> | |||
- v1r0x <vinzenz.rosenkranz@gmail.com> | |||
- voxsim "Simon Vocella" | |||
- waleczny <michal@walczak.xyz> | |||
- zulan <git@zulan.net> | |||
- Łukasz Buśko <busko.lukasz@pm.me> | |||
With help from many libraries and frameworks including: | |||
Open Collaboration Services | |||
SabreDAV | |||
jQuery | |||
… |
@ -0,0 +1,105 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2016, ownCloud, Inc. | |||
* | |||
* @author Bart Visscher <bartv@thisnet.nl> | |||
* @author Christoph Wurst <christoph@winzerhof-wurst.at> | |||
* @author Estelle Poulin <dev@inspiredby.es> | |||
* @author Joas Schilling <coding@schilljs.com> | |||
* @author Ko- <k.stoffelen@cs.ru.nl> | |||
* @author Lukas Reschke <lukas@statuscode.ch> | |||
* @author Michael Weimann <mail@michael-weimann.eu> | |||
* @author Morris Jobke <hey@morrisjobke.de> | |||
* @author Patrick Paysant <patrick.paysant@linagora.com> | |||
* @author RealRancor <fisch.666@gmx.de> | |||
* @author Roeland Jago Douma <roeland@famdouma.nl> | |||
* @author Thomas Müller <thomas.mueller@tmit.eu> | |||
* @author Victor Dubiniuk <dubiniuk@owncloud.com> | |||
* | |||
* @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/> | |||
* | |||
*/ | |||
require_once __DIR__ . '/lib/versioncheck.php'; | |||
use OC\Console\Application; | |||
use Symfony\Component\Console\Input\ArgvInput; | |||
use Symfony\Component\Console\Output\ConsoleOutput; | |||
define('OC_CONSOLE', 1); | |||
function exceptionHandler($exception) { | |||
echo "An unhandled exception has been thrown:" . PHP_EOL; | |||
echo $exception; | |||
exit(1); | |||
} | |||
try { | |||
require_once __DIR__ . '/lib/base.php'; | |||
// set to run indefinitely if needed | |||
if (strpos(@ini_get('disable_functions'), 'set_time_limit') === false) { | |||
@set_time_limit(0); | |||
} | |||
if (!OC::$CLI) { | |||
echo "This script can be run from the command line only" . PHP_EOL; | |||
exit(1); | |||
} | |||
set_exception_handler('exceptionHandler'); | |||
if (!function_exists('posix_getuid')) { | |||
echo "The posix extensions are required - see http://php.net/manual/en/book.posix.php" . PHP_EOL; | |||
exit(1); | |||
} | |||
$user = posix_getuid(); | |||
$configUser = fileowner(OC::$configDir . 'config.php'); | |||
if ($user !== $configUser) { | |||
echo "Console has to be executed with the user that owns the file config/config.php" . PHP_EOL; | |||
echo "Current user id: " . $user . PHP_EOL; | |||
echo "Owner id of config.php: " . $configUser . PHP_EOL; | |||
echo "Try adding 'sudo -u #" . $configUser . "' to the beginning of the command (without the single quotes)" . PHP_EOL; | |||
echo "If running with 'docker exec' try adding the option '-u " . $configUser . "' to the docker command (without the single quotes)" . PHP_EOL; | |||
exit(1); | |||
} | |||
$oldWorkingDir = getcwd(); | |||
if ($oldWorkingDir === false) { | |||
echo "This script can be run from the Nextcloud root directory only." . PHP_EOL; | |||
echo "Can't determine current working dir - the script will continue to work but be aware of the above fact." . PHP_EOL; | |||
} elseif ($oldWorkingDir !== __DIR__ && !chdir(__DIR__)) { | |||
echo "This script can be run from the Nextcloud root directory only." . PHP_EOL; | |||
echo "Can't change to Nextcloud root directory." . PHP_EOL; | |||
exit(1); | |||
} | |||
if (!function_exists('pcntl_signal') && !in_array('--no-warnings', $argv)) { | |||
echo "The process control (PCNTL) extensions are required in case you want to interrupt long running commands - see http://php.net/manual/en/book.pcntl.php" . PHP_EOL; | |||
} | |||
$application = new Application( | |||
\OC::$server->getConfig(), | |||
\OC::$server->getEventDispatcher(), | |||
\OC::$server->getRequest(), | |||
\OC::$server->getLogger(), | |||
\OC::$server->query(\OC\MemoryInfo::class) | |||
); | |||
$application->loadCommands(new ArgvInput(), new ConsoleOutput()); | |||
$application->run(); | |||
} catch (Exception $ex) { | |||
exceptionHandler($ex); | |||
} catch (Error $ex) { | |||
exceptionHandler($ex); | |||
} |
@ -0,0 +1 @@ | |||
build/ |
@ -0,0 +1,19 @@ | |||
filter: | |||
excluded_paths: | |||
- 'templates/*' | |||
- 'css/*' | |||
- 'tests/*' | |||
imports: | |||
- php | |||
- javascript | |||
tools: | |||
external_code_coverage: | |||
timeout: 3600 | |||
checks: | |||
php: | |||
# this is not working properly with core exceptions | |||
catch_class_exists: false | |||
line_length: | |||
max_length: '80' |
@ -0,0 +1,44 @@ | |||
sudo: false | |||
language: php | |||
php: | |||
- 7.2 | |||
env: | |||
global: | |||
- DB=sqlite | |||
matrix: | |||
- CORE_BRANCH=stable19 REPO=nextcloud/server | |||
matrix: | |||
fast_finish: true | |||
before_install: | |||
- wget https://phar.phpunit.de/phpunit-5.7.phar | |||
- chmod +x phpunit-5.7.phar | |||
- mkdir bin | |||
- mv phpunit-5.7.phar bin/phpunit | |||
- phpunit --version | |||
- cd ../ | |||
- git clone https://github.com/$REPO.git --recursive --depth 1 -b $CORE_BRANCH mainrepo | |||
- mv apporder mainrepo/apps/ | |||
before_script: | |||
# fill owncloud with default configs and enable apporder | |||
- cd mainrepo | |||
- mkdir data | |||
- ./occ maintenance:install --database-name oc_autotest --database-user oc_autotest --admin-user admin --admin-pass admin --database $DB --database-pass='' | |||
- ./occ app:enable apporder | |||
- ./occ app:check-code apporder | |||
- php -S localhost:8080 & | |||
- cd apps/apporder | |||
- export PATH="$PWD/bin:$PATH" | |||
script: | |||
- make test | |||
after_failure: | |||
- cat ../../data/owncloud.log | |||
after_success: | |||
- wget https://scrutinizer-ci.com/ocular.phar | |||
- php ocular.phar code-coverage:upload --format=php-clover build/php-unit.clover |
@ -0,0 +1,9 @@ | |||
[main] | |||
host = https://www.transifex.com | |||
lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja | |||
[nextcloud.apporder] | |||
file_filter = translationfiles/<lang>/apporder.po | |||
source_file = translationfiles/templates/apporder.pot | |||
source_lang = en | |||
type = PO |
@ -0,0 +1,74 @@ | |||
# Changelog | |||
All notable changes to this project will be documented in this file. | |||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), | |||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). | |||
## [0.12.0] - 2021-03-03 | |||
### Added | |||
- Support for Nextcloud 21 | |||
## [0.11.0] - 2020-09-03 | |||
### Added | |||
- Support for Nextcloud 20 | |||
## [0.10.0] - 2020-05-22 | |||
### Added | |||
- Support for Nextcloud 19 | |||
- Added functionality to force an admin-defined order | |||
### Fixed | |||
- Fix for app sorting in dark mode | |||
## [0.9.0] - 2019-12-22 | |||
### Added | |||
- Support for Nextcloud 18 | |||
## [0.8.0] - 2019-08-20 | |||
### Added | |||
- Support for Nextcloud 17 | |||
## [0.7.1] - 2019-04-27 | |||
### Fixed | |||
- Scanning of outdated files | |||
## [0.7.0] - 2019-04-11 | |||
### Changed | |||
- Add support for Nextcloud 16 | |||
## [0.6.0] - 2018-11-24 | |||
## [0.5.0] - 2018-08-03 | |||
## [0.4.1] - 2017-12-05 | |||
### Fixed | |||
- Fix bug in IE11 | |||
## [0.4.0] - 2017-08-04 | |||
### Changed | |||
- Move order changing to the personal/admin settings | |||
- Make it possible to hide apps per user/as admin | |||
- Add support for new Nextcloud menu | |||
## [0.3.3] - 2016-10-12 | |||
## [0.3.2] - 2016-09-06 | |||
## [0.3.1] - 2016-09-05 | |||
## [0.3.0] - 2016-09-04 | |||
### Changed | |||
- Drop support for Nextcloud 9 / OwnCloud 9.0 | |||
### Added | |||
- Set default landing page per user (See README.md for details) | |||
## [0.2.0] - 2016-09-04 | |||
@ -0,0 +1,661 @@ | |||
GNU AFFERO GENERAL PUBLIC LICENSE | |||
Version 3, 19 November 2007 | |||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> | |||
Everyone is permitted to copy and distribute verbatim copies | |||
of this license document, but changing it is not allowed. | |||
Preamble | |||
The GNU Affero General Public License is a free, copyleft license for | |||
software and other kinds of works, specifically designed to ensure | |||
cooperation with the community in the case of network server software. | |||
The licenses for most software and other practical works are designed | |||
to take away your freedom to share and change the works. By contrast, | |||
our General Public Licenses are intended to guarantee your freedom to | |||
share and change all versions of a program--to make sure it remains free | |||
software for all its users. | |||
When we speak of free software, we are referring to freedom, not | |||
price. Our General Public Licenses are designed to make sure that you | |||
have the freedom to distribute copies of free software (and charge for | |||
them if you wish), that you receive source code or can get it if you | |||
want it, that you can change the software or use pieces of it in new | |||
free programs, and that you know you can do these things. | |||
Developers that use our General Public Licenses protect your rights | |||
with two steps: (1) assert copyright on the software, and (2) offer | |||
you this License which gives you legal permission to copy, distribute | |||
and/or modify the software. | |||
A secondary benefit of defending all users' freedom is that | |||
improvements made in alternate versions of the program, if they | |||
receive widespread use, become available for other developers to | |||
incorporate. Many developers of free software are heartened and | |||
encouraged by the resulting cooperation. However, in the case of | |||
software used on network servers, this result may fail to come about. | |||
The GNU General Public License permits making a modified version and | |||
letting the public access it on a server without ever releasing its | |||
source code to the public. | |||
The GNU Affero General Public License is designed specifically to | |||
ensure that, in such cases, the modified source code becomes available | |||
to the community. It requires the operator of a network server to | |||
provide the source code of the modified version running there to the | |||
users of that server. Therefore, public use of a modified version, on | |||
a publicly accessible server, gives the public access to the source | |||
code of the modified version. | |||
An older license, called the Affero General Public License and | |||
published by Affero, was designed to accomplish similar goals. This is | |||
a different license, not a version of the Affero GPL, but Affero has | |||
released a new version of the Affero GPL which permits relicensing under | |||
this license. | |||
The precise terms and conditions for copying, distribution and | |||
modification follow. | |||
TERMS AND CONDITIONS | |||
0. Definitions. | |||
"This License" refers to version 3 of the GNU Affero General Public License. | |||
"Copyright" also means copyright-like laws that apply to other kinds of | |||
works, such as semiconductor masks. | |||
"The Program" refers to any copyrightable work licensed under this | |||
License. Each licensee is addressed as "you". "Licensees" and | |||
"recipients" may be individuals or organizations. | |||
To "modify" a work means to copy from or adapt all or part of the work | |||
in a fashion requiring copyright permission, other than the making of an | |||
exact copy. The resulting work is called a "modified version" of the | |||
earlier work or a work "based on" the earlier work. | |||
A "covered work" means either the unmodified Program or a work based | |||
on the Program. | |||
To "propagate" a work means to do anything with it that, without | |||
permission, would make you directly or secondarily liable for | |||
infringement under applicable copyright law, except executing it on a | |||
computer or modifying a private copy. Propagation includes copying, | |||
distribution (with or without modification), making available to the | |||
public, and in some countries other activities as well. | |||
To "convey" a work means any kind of propagation that enables other | |||
parties to make or receive copies. Mere interaction with a user through | |||
a computer network, with no transfer of a copy, is not conveying. | |||
An interactive user interface displays "Appropriate Legal Notices" | |||
to the extent that it includes a convenient and prominently visible | |||
feature that (1) displays an appropriate copyright notice, and (2) | |||
tells the user that there is no warranty for the work (except to the | |||
extent that warranties are provided), that licensees may convey the | |||
work under this License, and how to view a copy of this License. If | |||
the interface presents a list of user commands or options, such as a | |||
menu, a prominent item in the list meets this criterion. | |||
1. Source Code. | |||
The "source code" for a work means the preferred form of the work | |||
for making modifications to it. "Object code" means any non-source | |||
form of a work. | |||
A "Standard Interface" means an interface that either is an official | |||
standard defined by a recognized standards body, or, in the case of | |||
interfaces specified for a particular programming language, one that | |||
is widely used among developers working in that language. | |||
The "System Libraries" of an executable work include anything, other | |||
than the work as a whole, that (a) is included in the normal form of | |||
packaging a Major Component, but which is not part of that Major | |||
Component, and (b) serves only to enable use of the work with that | |||
Major Component, or to implement a Standard Interface for which an | |||
implementation is available to the public in source code form. A | |||
"Major Component", in this context, means a major essential component | |||
(kernel, window system, and so on) of the specific operating system | |||
(if any) on which the executable work runs, or a compiler used to | |||
produce the work, or an object code interpreter used to run it. | |||
The "Corresponding Source" for a work in object code form means all | |||
the source code needed to generate, install, and (for an executable | |||
work) run the object code and to modify the work, including scripts to | |||
control those activities. However, it does not include the work's | |||
System Libraries, or general-purpose tools or generally available free | |||
programs which are used unmodified in performing those activities but | |||
which are not part of the work. For example, Corresponding Source | |||
includes interface definition files associated with source files for | |||
the work, and the source code for shared libraries and dynamically | |||
linked subprograms that the work is specifically designed to require, | |||
such as by intimate data communication or control flow between those | |||
subprograms and other parts of the work. | |||
The Corresponding Source need not include anything that users | |||
can regenerate automatically from other parts of the Corresponding | |||
Source. | |||
The Corresponding Source for a work in source code form is that | |||
same work. | |||
2. Basic Permissions. | |||
All rights granted under this License are granted for the term of | |||
copyright on the Program, and are irrevocable provided the stated | |||
conditions are met. This License explicitly affirms your unlimited | |||
permission to run the unmodified Program. The output from running a | |||
covered work is covered by this License only if the output, given its | |||
content, constitutes a covered work. This License acknowledges your | |||
rights of fair use or other equivalent, as provided by copyright law. | |||
You may make, run and propagate covered works that you do not | |||
convey, without conditions so long as your license otherwise remains | |||
in force. You may convey covered works to others for the sole purpose | |||
of having them make modifications exclusively for you, or provide you | |||
with facilities for running those works, provided that you comply with | |||
the terms of this License in conveying all material for which you do | |||
not control copyright. Those thus making or running the covered works | |||
for you must do so exclusively on your behalf, under your direction | |||
and control, on terms that prohibit them from making any copies of | |||
your copyrighted material outside their relationship with you. | |||
Conveying under any other circumstances is permitted solely under | |||
the conditions stated below. Sublicensing is not allowed; section 10 | |||
makes it unnecessary. | |||
3. Protecting Users' Legal Rights From Anti-Circumvention Law. | |||
No covered work shall be deemed part of an effective technological | |||
measure under any applicable law fulfilling obligations under article | |||
11 of the WIPO copyright treaty adopted on 20 December 1996, or | |||
similar laws prohibiting or restricting circumvention of such | |||
measures. | |||
When you convey a covered work, you waive any legal power to forbid | |||
circumvention of technological measures to the extent such circumvention | |||
is effected by exercising rights under this License with respect to | |||
the covered work, and you disclaim any intention to limit operation or | |||
modification of the work as a means of enforcing, against the work's | |||
users, your or third parties' legal rights to forbid circumvention of | |||
technological measures. | |||
4. Conveying Verbatim Copies. | |||
You may convey verbatim copies of the Program's source code as you | |||
receive it, in any medium, provided that you conspicuously and | |||
appropriately publish on each copy an appropriate copyright notice; | |||
keep intact all notices stating that this License and any | |||
non-permissive terms added in accord with section 7 apply to the code; | |||
keep intact all notices of the absence of any warranty; and give all | |||
recipients a copy of this License along with the Program. | |||
You may charge any price or no price for each copy that you convey, | |||
and you may offer support or warranty protection for a fee. | |||
5. Conveying Modified Source Versions. | |||
You may convey a work based on the Program, or the modifications to | |||
produce it from the Program, in the form of source code under the | |||
terms of section 4, provided that you also meet all of these conditions: | |||
a) The work must carry prominent notices stating that you modified | |||
it, and giving a relevant date. | |||
b) The work must carry prominent notices stating that it is | |||
released under this License and any conditions added under section | |||
7. This requirement modifies the requirement in section 4 to | |||
"keep intact all notices". | |||
c) You must license the entire work, as a whole, under this | |||
License to anyone who comes into possession of a copy. This | |||
License will therefore apply, along with any applicable section 7 | |||
additional terms, to the whole of the work, and all its parts, | |||
regardless of how they are packaged. This License gives no | |||
permission to license the work in any other way, but it does not | |||
invalidate such permission if you have separately received it. | |||
d) If the work has interactive user interfaces, each must display | |||
Appropriate Legal Notices; however, if the Program has interactive | |||
interfaces that do not display Appropriate Legal Notices, your | |||
work need not make them do so. | |||
A compilation of a covered work with other separate and independent | |||
works, which are not by their nature extensions of the covered work, | |||
and which are not combined with it such as to form a larger program, | |||
in or on a volume of a storage or distribution medium, is called an | |||
"aggregate" if the compilation and its resulting copyright are not | |||
used to limit the access or legal rights of the compilation's users | |||
beyond what the individual works permit. Inclusion of a covered work | |||
in an aggregate does not cause this License to apply to the other | |||
parts of the aggregate. | |||
6. Conveying Non-Source Forms. | |||
You may convey a covered work in object code form under the terms | |||
of sections 4 and 5, provided that you also convey the | |||
machine-readable Corresponding Source under the terms of this License, | |||
in one of these ways: | |||
a) Convey the object code in, or embodied in, a physical product | |||
(including a physical distribution medium), accompanied by the | |||
Corresponding Source fixed on a durable physical medium | |||
customarily used for software interchange. | |||
b) Convey the object code in, or embodied in, a physical product | |||
(including a physical distribution medium), accompanied by a | |||
written offer, valid for at least three years and valid for as | |||
long as you offer spare parts or customer support for that product | |||
model, to give anyone who possesses the object code either (1) a | |||
copy of the Corresponding Source for all the software in the | |||
product that is covered by this License, on a durable physical | |||
medium customarily used for software interchange, for a price no | |||
more than your reasonable cost of physically performing this | |||
conveying of source, or (2) access to copy the | |||
Corresponding Source from a network server at no charge. | |||
c) Convey individual copies of the object code with a copy of the | |||
written offer to provide the Corresponding Source. This | |||
alternative is allowed only occasionally and noncommercially, and | |||
only if you received the object code with such an offer, in accord | |||
with subsection 6b. | |||
d) Convey the object code by offering access from a designated | |||
place (gratis or for a charge), and offer equivalent access to the | |||
Corresponding Source in the same way through the same place at no | |||
further charge. You need not require recipients to copy the | |||
Corresponding Source along with the object code. If the place to | |||
copy the object code is a network server, the Corresponding Source | |||
may be on a different server (operated by you or a third party) | |||
that supports equivalent copying facilities, provided you maintain | |||
clear directions next to the object code saying where to find the | |||
Corresponding Source. Regardless of what server hosts the | |||
Corresponding Source, you remain obligated to ensure that it is | |||
available for as long as needed to satisfy these requirements. | |||
e) Convey the object code using peer-to-peer transmission, provided | |||
you inform other peers where the object code and Corresponding | |||
Source of the work are being offered to the general public at no | |||
charge under subsection 6d. | |||
A separable portion of the object code, whose source code is excluded | |||
from the Corresponding Source as a System Library, need not be | |||
included in conveying the object code work. | |||
A "User Product" is either (1) a "consumer product", which means any | |||
tangible personal property which is normally used for personal, family, | |||
or household purposes, or (2) anything designed or sold for incorporation | |||
into a dwelling. In determining whether a product is a consumer product, | |||
doubtful cases shall be resolved in favor of coverage. For a particular | |||
product received by a particular user, "normally used" refers to a | |||
typical or common use of that class of product, regardless of the status | |||
of the particular user or of the way in which the particular user | |||
actually uses, or expects or is expected to use, the product. A product | |||
is a consumer product regardless of whether the product has substantial | |||
commercial, industrial or non-consumer uses, unless such uses represent | |||
the only significant mode of use of the product. | |||
"Installation Information" for a User Product means any methods, | |||
procedures, authorization keys, or other information required to install | |||
and execute modified versions of a covered work in that User Product from | |||
a modified version of its Corresponding Source. The information must | |||
suffice to ensure that the continued functioning of the modified object | |||
code is in no case prevented or interfered with solely because | |||
modification has been made. | |||
If you convey an object code work under this section in, or with, or | |||
specifically for use in, a User Product, and the conveying occurs as | |||
part of a transaction in which the right of possession and use of the | |||
User Product is transferred to the recipient in perpetuity or for a | |||
fixed term (regardless of how the transaction is characterized), the | |||
Corresponding Source conveyed under this section must be accompanied | |||
by the Installation Information. But this requirement does not apply | |||
if neither you nor any third party retains the ability to install | |||
modified object code on the User Product (for example, the work has | |||
been installed in ROM). | |||
The requirement to provide Installation Information does not include a | |||
requirement to continue to provide support service, warranty, or updates | |||
for a work that has been modified or installed by the recipient, or for | |||
the User Product in which it has been modified or installed. Access to a | |||
network may be denied when the modification itself materially and | |||
adversely affects the operation of the network or violates the rules and | |||
protocols for communication across the network. | |||
Corresponding Source conveyed, and Installation Information provided, | |||
in accord with this section must be in a format that is publicly | |||
documented (and with an implementation available to the public in | |||
source code form), and must require no special password or key for | |||
unpacking, reading or copying. | |||
7. Additional Terms. | |||
"Additional permissions" are terms that supplement the terms of this | |||
License by making exceptions from one or more of its conditions. | |||
Additional permissions that are applicable to the entire Program shall | |||
be treated as though they were included in this License, to the extent | |||
that they are valid under applicable law. If additional permissions | |||
apply only to part of the Program, that part may be used separately | |||
under those permissions, but the entire Program remains governed by | |||
this License without regard to the additional permissions. | |||
When you convey a copy of a covered work, you may at your option | |||
remove any additional permissions from that copy, or from any part of | |||
it. (Additional permissions may be written to require their own | |||
removal in certain cases when you modify the work.) You may place | |||
additional permissions on material, added by you to a covered work, | |||
for which you have or can give appropriate copyright permission. | |||
Notwithstanding any other provision of this License, for material you | |||
add to a covered work, you may (if authorized by the copyright holders of | |||
that material) supplement the terms of this License with terms: | |||
a) Disclaiming warranty or limiting liability differently from the | |||
terms of sections 15 and 16 of this License; or | |||
b) Requiring preservation of specified reasonable legal notices or | |||
author attributions in that material or in the Appropriate Legal | |||
Notices displayed by works containing it; or | |||
c) Prohibiting misrepresentation of the origin of that material, or | |||
requiring that modified versions of such material be marked in | |||
reasonable ways as different from the original version; or | |||
d) Limiting the use for publicity purposes of names of licensors or | |||
authors of the material; or | |||
e) Declining to grant rights under trademark law for use of some | |||
trade names, trademarks, or service marks; or | |||
f) Requiring indemnification of licensors and authors of that | |||
material by anyone who conveys the material (or modified versions of | |||
it) with contractual assumptions of liability to the recipient, for | |||
any liability that these contractual assumptions directly impose on | |||
those licensors and authors. | |||
All other non-permissive additional terms are considered "further | |||
restrictions" within the meaning of section 10. If the Program as you | |||
received it, or any part of it, contains a notice stating that it is | |||
governed by this License along with a term that is a further | |||
restriction, you may remove that term. If a license document contains | |||
a further restriction but permits relicensing or conveying under this | |||
License, you may add to a covered work material governed by the terms | |||
of that license document, provided that the further restriction does | |||
not survive such relicensing or conveying. | |||
If you add terms to a covered work in accord with this section, you | |||
must place, in the relevant source files, a statement of the | |||
additional terms that apply to those files, or a notice indicating | |||
where to find the applicable terms. | |||
Additional terms, permissive or non-permissive, may be stated in the | |||
form of a separately written license, or stated as exceptions; | |||
the above requirements apply either way. | |||
8. Termination. | |||
You may not propagate or modify a covered work except as expressly | |||
provided under this License. Any attempt otherwise to propagate or | |||
modify it is void, and will automatically terminate your rights under | |||
this License (including any patent licenses granted under the third | |||
paragraph of section 11). | |||
However, if you cease all violation of this License, then your | |||
license from a particular copyright holder is reinstated (a) | |||
provisionally, unless and until the copyright holder explicitly and | |||
finally terminates your license, and (b) permanently, if the copyright | |||
holder fails to notify you of the violation by some reasonable means | |||
prior to 60 days after the cessation. | |||
Moreover, your license from a particular copyright holder is | |||
reinstated permanently if the copyright holder notifies you of the | |||
violation by some reasonable means, this is the first time you have | |||
received notice of violation of this License (for any work) from that | |||
copyright holder, and you cure the violation prior to 30 days after | |||
your receipt of the notice. | |||
Termination of your rights under this section does not terminate the | |||
licenses of parties who have received copies or rights from you under | |||
this License. If your rights have been terminated and not permanently | |||
reinstated, you do not qualify to receive new licenses for the same | |||
material under section 10. | |||
9. Acceptance Not Required for Having Copies. | |||
You are not required to accept this License in order to receive or | |||
run a copy of the Program. Ancillary propagation of a covered work | |||
occurring solely as a consequence of using peer-to-peer transmission | |||
to receive a copy likewise does not require acceptance. However, | |||
nothing other than this License grants you permission to propagate or | |||
modify any covered work. These actions infringe copyright if you do | |||
not accept this License. Therefore, by modifying or propagating a | |||
covered work, you indicate your acceptance of this License to do so. | |||
10. Automatic Licensing of Downstream Recipients. | |||
Each time you convey a covered work, the recipient automatically | |||
receives a license from the original licensors, to run, modify and | |||
propagate that work, subject to this License. You are not responsible | |||
for enforcing compliance by third parties with this License. | |||
An "entity transaction" is a transaction transferring control of an | |||
organization, or substantially all assets of one, or subdividing an | |||
organization, or merging organizations. If propagation of a covered | |||
work results from an entity transaction, each party to that | |||
transaction who receives a copy of the work also receives whatever | |||
licenses to the work the party's predecessor in interest had or could | |||
give under the previous paragraph, plus a right to possession of the | |||
Corresponding Source of the work from the predecessor in interest, if | |||
the predecessor has it or can get it with reasonable efforts. | |||
You may not impose any further restrictions on the exercise of the | |||
rights granted or affirmed under this License. For example, you may | |||
not impose a license fee, royalty, or other charge for exercise of | |||
rights granted under this License, and you may not initiate litigation | |||
(including a cross-claim or counterclaim in a lawsuit) alleging that | |||
any patent claim is infringed by making, using, selling, offering for | |||
sale, or importing the Program or any portion of it. | |||
11. Patents. | |||
A "contributor" is a copyright holder who authorizes use under this | |||
License of the Program or a work on which the Program is based. The | |||
work thus licensed is called the contributor's "contributor version". | |||
A contributor's "essential patent claims" are all patent claims | |||
owned or controlled by the contributor, whether already acquired or | |||
hereafter acquired, that would be infringed by some manner, permitted | |||
by this License, of making, using, or selling its contributor version, | |||
but do not include claims that would be infringed only as a | |||
consequence of further modification of the contributor version. For | |||
purposes of this definition, "control" includes the right to grant | |||
patent sublicenses in a manner consistent with the requirements of | |||
this License. | |||
Each contributor grants you a non-exclusive, worldwide, royalty-free | |||
patent license under the contributor's essential patent claims, to | |||
make, use, sell, offer for sale, import and otherwise run, modify and | |||
propagate the contents of its contributor version. | |||
In the following three paragraphs, a "patent license" is any express | |||
agreement or commitment, however denominated, not to enforce a patent | |||
(such as an express permission to practice a patent or covenant not to | |||
sue for patent infringement). To "grant" such a patent license to a | |||
party means to make such an agreement or commitment not to enforce a | |||
patent against the party. | |||
If you convey a covered work, knowingly relying on a patent license, | |||
and the Corresponding Source of the work is not available for anyone | |||
to copy, free of charge and under the terms of this License, through a | |||
publicly available network server or other readily accessible means, | |||
then you must either (1) cause the Corresponding Source to be so | |||
available, or (2) arrange to deprive yourself of the benefit of the | |||
patent license for this particular work, or (3) arrange, in a manner | |||
consistent with the requirements of this License, to extend the patent | |||
license to downstream recipients. "Knowingly relying" means you have | |||
actual knowledge that, but for the patent license, your conveying the | |||
covered work in a country, or your recipient's use of the covered work | |||
in a country, would infringe one or more identifiable patents in that | |||
country that you have reason to believe are valid. | |||
If, pursuant to or in connection with a single transaction or | |||
arrangement, you convey, or propagate by procuring conveyance of, a | |||
covered work, and grant a patent license to some of the parties | |||
receiving the covered work authorizing them to use, propagate, modify | |||
or convey a specific copy of the covered work, then the patent license | |||
you grant is automatically extended to all recipients of the covered | |||
work and works based on it. | |||
A patent license is "discriminatory" if it does not include within | |||
the scope of its coverage, prohibits the exercise of, or is | |||
conditioned on the non-exercise of one or more of the rights that are | |||
specifically granted under this License. You may not convey a covered | |||
work if you are a party to an arrangement with a third party that is | |||
in the business of distributing software, under which you make payment | |||
to the third party based on the extent of your activity of conveying | |||
the work, and under which the third party grants, to any of the | |||
parties who would receive the covered work from you, a discriminatory | |||
patent license (a) in connection with copies of the covered work | |||
conveyed by you (or copies made from those copies), or (b) primarily | |||
for and in connection with specific products or compilations that | |||
contain the covered work, unless you entered into that arrangement, | |||
or that patent license was granted, prior to 28 March 2007. | |||
Nothing in this License shall be construed as excluding or limiting | |||
any implied license or other defenses to infringement that may | |||
otherwise be available to you under applicable patent law. | |||
12. No Surrender of Others' Freedom. | |||
If conditions are imposed on you (whether by court order, agreement or | |||
otherwise) that contradict the conditions of this License, they do not | |||
excuse you from the conditions of this License. If you cannot convey a | |||
covered work so as to satisfy simultaneously your obligations under this | |||
License and any other pertinent obligations, then as a consequence you may | |||
not convey it at all. For example, if you agree to terms that obligate you | |||
to collect a royalty for further conveying from those to whom you convey | |||
the Program, the only way you could satisfy both those terms and this | |||
License would be to refrain entirely from conveying the Program. | |||
13. Remote Network Interaction; Use with the GNU General Public License. | |||
Notwithstanding any other provision of this License, if you modify the | |||
Program, your modified version must prominently offer all users | |||
interacting with it remotely through a computer network (if your version | |||
supports such interaction) an opportunity to receive the Corresponding | |||
Source of your version by providing access to the Corresponding Source | |||
from a network server at no charge, through some standard or customary | |||
means of facilitating copying of software. This Corresponding Source | |||
shall include the Corresponding Source for any work covered by version 3 | |||
of the GNU General Public License that is incorporated pursuant to the | |||
following paragraph. | |||
Notwithstanding any other provision of this License, you have | |||
permission to link or combine any covered work with a work licensed | |||
under version 3 of the GNU General Public License into a single | |||
combined work, and to convey the resulting work. The terms of this | |||
License will continue to apply to the part which is the covered work, | |||
but the work with which it is combined will remain governed by version | |||
3 of the GNU General Public License. | |||
14. Revised Versions of this License. | |||
The Free Software Foundation may publish revised and/or new versions of | |||
the GNU Affero General Public License from time to time. Such new versions | |||
will be similar in spirit to the present version, but may differ in detail to | |||
address new problems or concerns. | |||
Each version is given a distinguishing version number. If the | |||
Program specifies that a certain numbered version of the GNU Affero General | |||
Public License "or any later version" applies to it, you have the | |||
option of following the terms and conditions either of that numbered | |||
version or of any later version published by the Free Software | |||
Foundation. If the Program does not specify a version number of the | |||
GNU Affero General Public License, you may choose any version ever published | |||
by the Free Software Foundation. | |||
If the Program specifies that a proxy can decide which future | |||
versions of the GNU Affero General Public License can be used, that proxy's | |||
public statement of acceptance of a version permanently authorizes you | |||
to choose that version for the Program. | |||
Later license versions may give you additional or different | |||
permissions. However, no additional obligations are imposed on any | |||
author or copyright holder as a result of your choosing to follow a | |||
later version. | |||
15. Disclaimer of Warranty. | |||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY | |||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT | |||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY | |||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, | |||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM | |||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF | |||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | |||
16. Limitation of Liability. | |||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS | |||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY | |||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE | |||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF | |||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD | |||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), | |||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF | |||
SUCH DAMAGES. | |||
17. Interpretation of Sections 15 and 16. | |||
If the disclaimer of warranty and limitation of liability provided | |||
above cannot be given local legal effect according to their terms, | |||
reviewing courts shall apply local law that most closely approximates | |||
an absolute waiver of all civil liability in connection with the | |||
Program, unless a warranty or assumption of liability accompanies a | |||
copy of the Program in return for a fee. | |||
END OF TERMS AND CONDITIONS | |||
How to Apply These Terms to Your New Programs | |||
If you develop a new program, and you want it to be of the greatest | |||
possible use to the public, the best way to achieve this is to make it | |||
free software which everyone can redistribute and change under these terms. | |||
To do so, attach the following notices to the program. It is safest | |||
to attach them to the start of each source file to most effectively | |||
state the exclusion of warranty; and each file should have at least | |||
the "copyright" line and a pointer to where the full notice is found. | |||
<one line to give the program's name and a brief idea of what it does.> | |||
Copyright (C) <year> <name of author> | |||
This program is free software: you can redistribute it and/or modify | |||
it under the terms of the GNU Affero General Public License as published | |||
by the Free Software Foundation, either version 3 of the License, or | |||
(at your option) any later version. | |||
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 | |||
along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
Also add information on how to contact you by electronic and paper mail. | |||
If your software can interact with users remotely through a computer | |||
network, you should also make sure that it provides a way for users to | |||
get its source. For example, if your program is a web application, its | |||
interface could display a "Source" link that leads users to an archive | |||
of the code. There are many ways you could offer source, and different | |||
solutions will be better for different programs; see section 13 for the | |||
specific requirements. | |||
You should also get your employer (if you work as a programmer) or school, | |||
if any, to sign a "copyright disclaimer" for the program, if necessary. | |||
For more information on this, and how to apply and follow the GNU AGPL, see | |||
<http://www.gnu.org/licenses/>. |
@ -0,0 +1,177 @@ | |||
# This file is licensed under the Affero General Public License version 3 or | |||
# later. See the COPYING file. | |||
# @author Bernhard Posselt <dev@bernhard-posselt.com> | |||
# @copyright Bernhard Posselt 2016 | |||
# Generic Makefile for building and packaging an ownCloud app which uses npm and | |||
# Composer. | |||
# | |||
# Dependencies: | |||
# * make | |||
# * which | |||
# * curl: used if phpunit and composer are not installed to fetch them from the web | |||
# * tar: for building the archive | |||
# * npm: for building and testing everything JS | |||
# | |||
# If no composer.json is in the app root directory, the Composer step | |||
# will be skipped. The same goes for the package.json which can be located in | |||
# the app root or the js/ directory. | |||
# | |||
# The npm command by launches the npm build script: | |||
# | |||
# npm run build | |||
# | |||
# The npm test command launches the npm test script: | |||
# | |||
# npm run test | |||
# | |||
# The idea behind this is to be completely testing and build tool agnostic. All | |||
# build tools and additional package managers should be installed locally in | |||
# your project, since this won't pollute people's global namespace. | |||
# | |||
# The following npm scripts in your package.json install and update the bower | |||
# and npm dependencies and use gulp as build system (notice how everything is | |||
# run from the node_modules folder): | |||
# | |||
# "scripts": { | |||
# "test": "node node_modules/gulp-cli/bin/gulp.js karma", | |||
# "prebuild": "npm install && node_modules/bower/bin/bower install && node_modules/bower/bin/bower update", | |||
# "build": "node node_modules/gulp-cli/bin/gulp.js" | |||
# }, | |||
app_name=$(notdir $(CURDIR)) | |||
build_tools_directory=$(CURDIR)/build/tools | |||
source_build_directory=$(CURDIR)/build/artifacts/source | |||
source_package_name=$(source_build_directory)/$(app_name) | |||
appstore_build_directory=$(CURDIR)/build/artifacts/appstore | |||
appstore_package_name=$(appstore_build_directory)/$(app_name) | |||
npm=$(shell which npm 2> /dev/null) | |||
composer=$(shell which composer 2> /dev/null) | |||
all: build | |||
# Fetches the PHP and JS dependencies and compiles the JS. If no composer.json | |||
# is present, the composer step is skipped, if no package.json or js/package.json | |||
# is present, the npm step is skipped | |||
.PHONY: build | |||
build: | |||
ifneq (,$(wildcard $(CURDIR)/composer.json)) | |||
make composer | |||
endif | |||
ifneq (,$(wildcard $(CURDIR)/package.json)) | |||
make npm | |||
endif | |||
ifneq (,$(wildcard $(CURDIR)/js/package.json)) | |||
make npm | |||
endif | |||
# Installs and updates the composer dependencies. If composer is not installed | |||
# a copy is fetched from the web | |||
.PHONY: composer | |||
composer: | |||
ifeq (, $(composer)) | |||
@echo "No composer command available, downloading a copy from the web" | |||
mkdir -p $(build_tools_directory) | |||
curl -sS https://getcomposer.org/installer | php | |||
mv composer.phar $(build_tools_directory) | |||
php $(build_tools_directory)/composer.phar install --prefer-dist | |||
php $(build_tools_directory)/composer.phar update --prefer-dist | |||
else | |||
composer install --prefer-dist | |||
composer update --prefer-dist | |||
endif | |||
# Installs npm dependencies | |||
.PHONY: npm | |||
npm: | |||
ifeq (,$(wildcard $(CURDIR)/package.json)) | |||
cd js && $(npm) run build | |||
else | |||
npm run build | |||
endif | |||
# Removes the appstore build | |||
.PHONY: clean | |||
clean: | |||
rm -rf ./build | |||
# Same as clean but also removes dependencies installed by composer, bower and | |||
# npm | |||
.PHONY: distclean | |||
distclean: clean | |||
rm -rf vendor | |||
rm -rf node_modules | |||
rm -rf js/vendor | |||
rm -rf js/node_modules | |||
# Builds the source and appstore package | |||
.PHONY: dist | |||
dist: | |||
make source | |||
make appstore | |||
# Builds the source package | |||
.PHONY: source | |||
source: | |||
rm -rf $(source_build_directory) | |||
mkdir -p $(source_build_directory) | |||
tar cvzf $(source_package_name).tar.gz --exclude-vcs \ | |||
--exclude="../$(app_name)/build" \ | |||
--exclude="../$(app_name)/js/node_modules" \ | |||
--exclude="../$(app_name)/node_modules" \ | |||
--exclude="../$(app_name)/*.log" \ | |||
--exclude="../$(app_name)/js/*.log" \ | |||
../$(app_name) \ | |||
# Builds the source package for the app store, ignores php and js tests | |||
.PHONY: appstore | |||
appstore: | |||
rm -rf $(appstore_build_directory) | |||
mkdir -p $(appstore_build_directory) | |||
tar cvzf $(appstore_package_name).tar.gz \ | |||
--exclude="../$(app_name)/build" \ | |||
--exclude="../$(app_name)/tests" \ | |||
--exclude="../$(app_name)/Makefile" \ | |||
--exclude="../$(app_name)/*.log" \ | |||
--exclude="../$(app_name)/phpunit*xml" \ | |||
--exclude="../$(app_name)/composer.*" \ | |||
--exclude="../$(app_name)/js/node_modules" \ | |||
--exclude="../$(app_name)/js/tests" \ | |||
--exclude="../$(app_name)/js/test" \ | |||
--exclude="../$(app_name)/js/*.log" \ | |||
--exclude="../$(app_name)/js/package.json" \ | |||
--exclude="../$(app_name)/js/bower.json" \ | |||
--exclude="../$(app_name)/js/karma.*" \ | |||
--exclude="../$(app_name)/js/protractor.*" \ | |||
--exclude="../$(app_name)/package.json" \ | |||
--exclude="../$(app_name)/bower.json" \ | |||
--exclude="../$(app_name)/karma.*" \ | |||
--exclude="../$(app_name)/protractor\.*" \ | |||
--exclude="../$(app_name)/.*" \ | |||
--exclude="../$(app_name)/js/.*" \ | |||
--exclude-vcs \ | |||
../$(app_name) | |||
# Command for running JS and PHP tests. Works for package.json files in the js/ | |||
# and root directory. If phpunit is not installed systemwide, a copy is fetched | |||
# from the internet | |||
.PHONY: test | |||
test: | |||
ifneq (,$(wildcard $(CURDIR)/js/package.json)) | |||
cd js && $(npm) run test | |||
endif | |||
ifneq (,$(wildcard $(CURDIR)/package.json)) | |||
$(npm) run test | |||
endif | |||
ifeq (, $(shell which phpunit 2> /dev/null)) | |||
@echo "No phpunit command available, downloading a copy from the web" | |||
mkdir -p $(build_tools_directory) | |||
curl -sSL https://phar.phpunit.de/phpunit.phar -o $(build_tools_directory)/phpunit.phar | |||
php $(build_tools_directory)/phpunit.phar -c phpunit.xml | |||
php $(build_tools_directory)/phpunit.phar -c phpunit.integration.xml | |||
else | |||
phpunit -c phpunit.xml --coverage-clover build/php-unit.clover | |||
phpunit -c phpunit.integration.xml --coverage-clover build/php-unit.clover | |||
endif |
@ -0,0 +1,30 @@ | |||
# AppOrder | |||
[![Build Status](https://travis-ci.org/juliushaertl/apporder.svg?branch=master)](https://travis-ci.org/juliushaertl/apporder) | |||
[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/juliushaertl/apporder/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/juliushaertl/apporder/?branch=master) | |||
[![Code Coverage](https://scrutinizer-ci.com/g/juliushaertl/apporder/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/juliushaertl/apporder/?branch=master) | |||
Enable sorting the app icons from the personal settings. The order will be | |||
saved for each user individually. Administrators can define a custom default | |||
order. | |||
## Set a default order for all new users | |||
Go to the Admin settings > Additional settings and drag the icons under App order. | |||
## Use first app as default app | |||
You can easily let Nextcloud redirect your user to the first app in their | |||
personal order by changing the following parameter in your config/config.php: | |||
'defaultapp' => 'apporder', | |||
Users will now get redirected to the first app of the default order or to the | |||
first app of the user order. | |||
# Installation | |||
## From git | |||
1. Clone the app into your apps/ directory: `git clone https://github.com/juliushaertl/apporder.git` | |||
2. Enable it |
@ -0,0 +1,25 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> | |||
* | |||
* @author Julius Härtl <jus@bitgrid.net> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* 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 | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
\OCP\Util::addStyle('apporder', 'apporder'); | |||
\OCP\Util::addScript('apporder', 'apporder'); |
@ -0,0 +1,43 @@ | |||
<?xml version="1.0"?> | |||
<info xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" | |||
xsi:noNamespaceSchemaLocation="https://apps.nextcloud.com/schema/apps/info.xsd"> | |||
<id>apporder</id> | |||
<name>AppOrder</name> | |||
<summary>Sort apps in the menu with drag and drop</summary> | |||
<description> | |||
Enable sorting the app icons from the personal settings. The order will be saved for each | |||
user individually. Administrators can define a custom default order. | |||
## Set a default order for all new users | |||
Go to the Admin settings > Additional settings and drag the icons under App order. | |||
## Use first app as default app | |||
You can easily let Nextcloud redirect your user to the first app in their | |||
personal order by changing the following parameter in your config/config.php: | |||
'defaultapp' => 'apporder', | |||
Users will now get redirected to the first app of the default order or to the | |||
first app of the user order. | |||
</description> | |||
<version>0.12.0</version> | |||
<licence>agpl</licence> | |||
<author mail="jus@bitgrid.net">Julius Härtl</author> | |||
<namespace>AppOrder</namespace> | |||
<category>customization</category> | |||
<bugs>https://github.com/juliushaertl/apporder/issues</bugs> | |||
<repository type="git">https://github.com/juliushaertl/apporder.git</repository> | |||
<screenshot>https://download.bitgrid.net/nextcloud/apporder/apporder.png</screenshot> | |||
<dependencies> | |||
<nextcloud min-version="16" max-version="21" /> | |||
</dependencies> | |||
<settings> | |||
<admin>OCA\AppOrder\Settings\AdminSettings</admin> | |||
<admin-section>OCA\AppOrder\Settings\Section</admin-section> | |||
<personal>OCA\AppOrder\Settings\PersonalSettings</personal> | |||
<personal-section>OCA\AppOrder\Settings\Section</personal-section> | |||
</settings> | |||
</info> | |||
@ -0,0 +1,34 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> | |||
* | |||
* @author Julius Härtl <jus@bitgrid.net> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* 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 | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
return [ | |||
'routes' => [ | |||
['name' => 'app#index', 'url' => '/', 'verb' => 'GET'], | |||
['name' => 'settings#getOrder', 'url' => '/getOrder', 'verb' => 'GET'], | |||
['name' => 'settings#savePersonal', 'url' => '/savePersonal', 'verb' => 'POST'], | |||
['name' => 'settings#saveDefaultOrder', 'url' => '/saveDefaultOrder', 'verb' => 'POST'], | |||
['name' => 'settings#savePersonalHidden', 'url' => '/savePersonalHidden', 'verb' => 'POST'], | |||
['name' => 'settings#saveDefaultHidden', 'url' => '/saveDefaultHidden', 'verb' => 'POST'], | |||
['name' => 'settings#saveDefaultForce', 'url' => '/saveDefaultForce', 'verb' => 'POST'], | |||
] | |||
]; |
@ -0,0 +1,57 @@ | |||
#appsorter { | |||
margin-top: 10px; | |||
width: 100%; | |||
max-width: 320px; | |||
} | |||
#appsorter li { | |||
margin-bottom: 2px; | |||
display: flex; | |||
} | |||
#appsorter img { | |||
width: 20px; | |||
height: 20px; | |||
margin: 1px; | |||
margin-right: 10px; | |||
-webkit-filter: invert(1); | |||
filter: invert(1); | |||
filter: progid:DXImageTransform.Microsoft.BasicImage(invert='1'); | |||
opacity: .7; | |||
} | |||
.dark #appsorter img { | |||
-webkit-filter: invert(0); | |||
filter: invert(0); | |||
} | |||
#appsorter .placeholder { | |||
border: 1px dashed #aaaaaa; | |||
visibility: visible; | |||
width: 100%; | |||
height: 20px; | |||
margin-bottom: 2px; | |||
border-radius: 3px; | |||
} | |||
#appsorter li input { | |||
margin: 0; | |||
padding: 0; | |||
width: 14px; | |||
height: 14px; | |||
margin-top: -5px; | |||
margin-right: 10px; | |||
} | |||
#appsorter li p { | |||
padding: 1px; | |||
} | |||
#appsorterforce { | |||
margin-bottom: 2px; | |||
display: flex; | |||
} | |||
#appsorterforce input { | |||
margin: -5px 5px 0px 5px; | |||
padding: 0; | |||
width: 14px; | |||
height: 14px; | |||
} |
@ -0,0 +1,125 @@ | |||
$(function () { | |||
var app_menu = $('#appmenu'); | |||
if (!app_menu.length) | |||
return; | |||
app_menu.css('opacity', '0'); | |||
var mapMenu = function(parent, order, hidden) { | |||
available_apps = {}; | |||
parent.find('li').each(function () { | |||
var id = $(this).find('a').attr('href'); | |||
if(hidden.indexOf(id) > -1){ | |||
$(this).remove(); | |||
} | |||
available_apps[id] = $(this); | |||
}); | |||
//Remove hidden from order array | |||
order = order.filter(function(e){ | |||
return !(hidden.indexOf(e) > -1); | |||
}) | |||
$.each(order, function (order, value) { | |||
parent.prepend(available_apps[value]); | |||
}); | |||
}; | |||
// restore existing order | |||
$.get(OC.generateUrl('/apps/apporder/getOrder'),function(data){ | |||
var order_json = data.order; | |||
var hidden_json = data.hidden; | |||
var order = []; | |||
var hidden = []; | |||
try { | |||
order = JSON.parse(order_json).reverse(); | |||
} catch (e) { | |||
order = []; | |||
} | |||
try { | |||
hidden = JSON.parse(hidden_json); | |||
} catch (e) { | |||
hidden = []; | |||
} | |||
if (order.length === 0) { | |||
app_menu.css('opacity', '1'); | |||
return; | |||
} | |||
mapMenu($('#appmenu'), order, hidden); | |||
mapMenu($('#apps').find('ul'), order, hidden); | |||
$(window).trigger('resize'); | |||
app_menu.css('opacity', '1'); | |||
}); | |||
// Sorting inside settings | |||
$("#appsorter").sortable({ | |||
forcePlaceholderSize: true, | |||
placeholder: 'placeholder', | |||
stop: function (event, ui) { | |||
var items = []; | |||
var url; | |||
var type = $('#appsorter').data('type'); | |||
if(type === 'admin') { | |||
url = OC.generateUrl('/apps/apporder/saveDefaultOrder'); | |||
} else { | |||
url = OC.generateUrl('/apps/apporder/savePersonal'); | |||
} | |||
$("#appsorter").children().each(function (i, el) { | |||
var item = $(el).find('p').data("url"); | |||
items.push(item) | |||
}); | |||
var json = JSON.stringify(items); | |||
$.post(url, { | |||
order: json | |||
}, function (data) { | |||
$(event.srcElement).effect("highlight", {}, 1000); | |||
}); | |||
} | |||
}); | |||
$(".apporderhidden").change(function(){ | |||
var hiddenList = []; | |||
var url; | |||
var type = $("#appsorter").data("type"); | |||
if(type === 'admin') { | |||
url = OC.generateUrl('/apps/apporder/saveDefaultHidden'); | |||
} else { | |||
url = OC.generateUrl('/apps/apporder/savePersonalHidden'); | |||
} | |||
$(".apporderhidden").each(function(i, el){ | |||
if(!el.checked){ | |||
hiddenList.push($(el).siblings('p').attr('data-url')) | |||
} | |||
}); | |||
var json = JSON.stringify(hiddenList); | |||
$.post(url, { | |||
hidden: json | |||
}, function (data) { | |||
//$(event.srcElement).effect("highlight", {}, 1000); | |||
}); | |||
}); | |||
$("#forcecheckbox").change(function(){ | |||
var hiddenList = []; | |||
var url; | |||
var type = $("#forcecheckbox").data("type"); | |||
if(type === 'admin') { | |||
url = OC.generateUrl('/apps/apporder/saveDefaultForce'); | |||
var checked = $("#forcecheckbox").get(0).checked; | |||
var json = JSON.stringify(checked); | |||
$.post(url, { | |||
force: json | |||
}, function (data) { | |||
// Not really anything to do here ... | |||
}); | |||
} | |||
}); | |||
}); |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "ترتيب التطبيقات", | |||
"App Order" : "ترتيب التطبيقات", | |||
"Drag the app icons to change their order." : "قم بسحب أيقونة التطبيق لتغيير ترتيبتها." | |||
}, | |||
"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;"); |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "ترتيب التطبيقات", | |||
"App Order" : "ترتيب التطبيقات", | |||
"Drag the app icons to change their order." : "قم بسحب أيقونة التطبيق لتغيير ترتيبتها." | |||
},"pluralForm" :"nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;" | |||
} |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "AppOrder", | |||
"App Order" : "Orde d'aplicaciones", | |||
"Drag the app icons to change their order." : "Arrastra los iconos de l'aplicación pa camudar el so orde." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,9 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Подредба на приложения", | |||
"Sort apps in the menu with drag and drop" : "Променя реда на приложенията", | |||
"App Order" : "Подредба на приложенията", | |||
"Drag the app icons to change their order." : "Влачете иконите на приложенията, за да промените подредбата им" | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Pořadí aplikací", | |||
"AppOrder" : "Pořadí aplikací", | |||
"Sort apps in the menu with drag and drop" : "Měňte pořadí aplikací v nabídce pomocí „táhni a pusť“", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Umožňuje seřazení ikon aplikací prostřednictvím osobních nastavení. Pořadí bude uloženo\npro každého uživatele zvlášť. Správci mohou určit výchozí pořadí ikon.\n\n## Nastavení výchozího pořadí ikon pro nové uživatele\n\nJděte do Nastavení > Správa > Další nastavení a v sekci Pořadí aplikací popřetahujte ikony do vámi zvoleného pořadí.\n\n## Použití první aplikace jako výchozí\n\nUživatele můžete snadno přesměrovat na první aplikaci v jejich pořadí tím, že změníte následující parametr v souboru config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUživatelé nyní budou automaticky přesměrováni na první aplikaci výchozího popř. jimi nastaveného pořadí.", | |||
"App Order" : "Pořadí aplikací", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Nastavit výchozí pořadí pro všechny uživatele. Toto bude ignorováno, pokud si uživatel nastavil své vlastní pořadí a výchozí pořadí není vynucováno.", | |||
"Drag the app icons to change their order." : "Pořadí aplikací změníte přetažením jejich ikon.", | |||
"Force the default order for all users:" : "Vynutit výchozí pořadí pro všechny uživatele:", | |||
"If enabled, users will not be able to set a custom order." : "Pokud je zapnuto, uživatelé si nebudou moci upravovat pořadí." | |||
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Apporden", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Sorter apps i menuen med træk og slip", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Aktiver sortering af app ikoner i personlige indstillinger. Rækkefølgen bliver gemt individuelt for hver bruger. Administratorer kan definere en anden standard rækkefølge.\n\n## Indstil en standard rækkefølge for alle nye brugere\n\nGå til Administrator indstillinger > yderligere indstillinger og træk ikonerne til App rækkefølge.\n\n## Benyt første app som standard app\n\nDu kan let lade Nextcloud guide din bruger til den første app in deres\npersonlige rækkefølge ved at ændre den følgende parameter i din config/config.php:\n\n 'defaultapp' => 'apporder',\n\nBrugere bliver nu dirigeret til den første app i standard rækkefølgen eller den første app i brugerens rækkefølge.", | |||
"App Order" : "Apporden", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Angiv forvalgt rækkefølge for alle brugere. Dette ignoreres, hvis brugeren selv angiver egen rækkefølge, og den forvalgte rækkefølge er ikke påtvunget. ", | |||
"Drag the app icons to change their order." : "Flyt appikonerne for at ændre ordenen.", | |||
"Force the default order for all users:" : "Gennemtving den forvalgte rækkefølge for alle brugere:", | |||
"If enabled, users will not be able to set a custom order." : "Hvis slået til, så kan brugere ikke angive egne rækkefølger. " | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "App-Reihenfolge", | |||
"AppOrder" : "App-Reihenfolge", | |||
"Sort apps in the menu with drag and drop" : "Apps im Menü per Drag und Drop sortieren", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ermöglicht es, die Reihenfolge der App-Icons in den persönlichen Einstellungen anzupassen. Die Reihenfolge wird für jeden \nBenutzer getrennt gespeichert. Administratoren können eine Standard-Sortierung vorgeben.\n\n##Standard-Sortierung für neue Benutzer einstellen\n\nUnter Administratoren-Einstellungen > Zusätzliche Einstellungen die Icons in die gewünschte Reihenfolge ziehen.\n\nErste App als Standard-App setzen\nUm die Benutzer einfach zur ersten App in ihrer\npersönlichen Reihenfolge umzuleiten, einfach in der config/config.php folgenden Parameter setzen:\n\n 'defaultapp' => 'apporder',\n\nBenutzer werden nun zur ersten App der Standard-Reihenfolge oder ihrer\npersönlichen Reihenfolge umgeleitet.", | |||
"App Order" : "App-Reihenfolge", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Standardreihenfolge für alle Benutzer einstellen. Diese Einstellung wird ignoriert, sofern der Benutzer eine eigene Reihenfolge eingestellt hat und die Standardreihenfolge nicht erzwungen wird.", | |||
"Drag the app icons to change their order." : "Verschiebe die App-Symbole, um ihre Reihenfolge zu verändern.", | |||
"Force the default order for all users:" : "Standardreihenfolge für alle Benutzer erzwingen:", | |||
"If enabled, users will not be able to set a custom order." : "Wenn aktiviert, können Benutzer keine eigene Reihenfolge einstellen." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Σειρά εφαρμογών", | |||
"AppOrder" : "Αίτηση Εφαρμογής", | |||
"Sort apps in the menu with drag and drop" : "Ταξινόμηση εφαρμογών στο μενού με μεταφορά και απόθεση", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ενεργοποιήστε την ταξινόμηση των εικονιδίων των εφαρμογών από τις προσωπικές ρυθμίσεις. θα αποθηκευτεί για κάθε\nχρήστη ξεχωριστά. Οι διαχειριστές μπορούν να καθορίσουν μια προσαρμοσμένη προεπιλεγμένη σειρά.\n\n## Καθορίστε προεπιλογή για όλους τους νέους χρήστες\nΣτις ρυθμίσεις διαχειριστή > επιπλέον ρυθμίσεις και σέρετε και αποθέστε τα εικονίδια εφαρμογών.\n\n## Χρήση της πρώτης εφαρμογής ως προεπιλογή\n\nΠρορείτε εύκολα να επιτρέψετε στο Nextcloud να ανακατευθύνει τους χρήστες στην πρώτη εφαρμογή από τις\nπροσωπικές ρυθμίσεις αλλάζοντας την παράμετρο στο αρχείο config/config.php:\n\n 'defaultapp' => 'apporder',\n\nΟι χρήστες θα ανακατευθυνθούν στην πρώτη εφαρμογή απο την προεπιλογή ή στην πρώτη εφαρμογή του χρήστη.", | |||
"App Order" : "Σειρά εφαρμογών", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Ορίστε μια προεπιλεγμένη σειρά για όλους τους χρήστες. Αυτό θα αγνοηθεί εάν ο χρήστης έχει ρυθμίσει μια προσαρμοσμένη σειρά και η προεπιλεγμένη δεν θα εφαρμοστεί.", | |||
"Drag the app icons to change their order." : " Σύρετε τα εικονίδια των εφαρμογών για να αλλάξετε τη σειρά τους.", | |||
"Force the default order for all users:" : "Επιβολή προεπιλογής σε όλους τους χρήστες:", | |||
"If enabled, users will not be able to set a custom order." : "Αν ενεργοποιηθεί, οι χρήστες δεν θα μπορούν να ορίσουν μια προσαρμοσμένη σειρά." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Σειρά εφαρμογών", | |||
"AppOrder" : "Αίτηση Εφαρμογής", | |||
"Sort apps in the menu with drag and drop" : "Ταξινόμηση εφαρμογών στο μενού με μεταφορά και απόθεση", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ενεργοποιήστε την ταξινόμηση των εικονιδίων των εφαρμογών από τις προσωπικές ρυθμίσεις. θα αποθηκευτεί για κάθε\nχρήστη ξεχωριστά. Οι διαχειριστές μπορούν να καθορίσουν μια προσαρμοσμένη προεπιλεγμένη σειρά.\n\n## Καθορίστε προεπιλογή για όλους τους νέους χρήστες\nΣτις ρυθμίσεις διαχειριστή > επιπλέον ρυθμίσεις και σέρετε και αποθέστε τα εικονίδια εφαρμογών.\n\n## Χρήση της πρώτης εφαρμογής ως προεπιλογή\n\nΠρορείτε εύκολα να επιτρέψετε στο Nextcloud να ανακατευθύνει τους χρήστες στην πρώτη εφαρμογή από τις\nπροσωπικές ρυθμίσεις αλλάζοντας την παράμετρο στο αρχείο config/config.php:\n\n 'defaultapp' => 'apporder',\n\nΟι χρήστες θα ανακατευθυνθούν στην πρώτη εφαρμογή απο την προεπιλογή ή στην πρώτη εφαρμογή του χρήστη.", | |||
"App Order" : "Σειρά εφαρμογών", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Ορίστε μια προεπιλεγμένη σειρά για όλους τους χρήστες. Αυτό θα αγνοηθεί εάν ο χρήστης έχει ρυθμίσει μια προσαρμοσμένη σειρά και η προεπιλεγμένη δεν θα εφαρμοστεί.", | |||
"Drag the app icons to change their order." : " Σύρετε τα εικονίδια των εφαρμογών για να αλλάξετε τη σειρά τους.", | |||
"Force the default order for all users:" : "Επιβολή προεπιλογής σε όλους τους χρήστες:", | |||
"If enabled, users will not be able to set a custom order." : "Αν ενεργοποιηθεί, οι χρήστες δεν θα μπορούν να ορίσουν μια προσαρμοσμένη σειρά." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "App order", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Sort apps in the menu with drag and drop", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order.", | |||
"App Order" : "App Order", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced.", | |||
"Drag the app icons to change their order." : "Drag the app icons to change their order.", | |||
"Force the default order for all users:" : "Force the default order for all users:", | |||
"If enabled, users will not be able to set a custom order." : "If enabled, users will not be able to set a custom order." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,11 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Aplikaĵa ordo", | |||
"AppOrder" : "Aplikaĵa ordo", | |||
"Sort apps in the menu with drag and drop" : "Ordigi menuajn aplikaĵojn per ŝovo kaj demeto", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ebligas ordigi la aplikaĵajn piktogramojn el la personaj agordoj. Sian propran ordon havas ĉiu uzanto.\nAdministranto povas difini propran defaŭltan ordon.\n\n## Agordi defaŭltan ordon por ĉiuj novaj uzantoj\n\nIru al la administranto-agordoj > Plia agordo, kaj ŝovu la piktogramojn trovantajn en „Ordo de la aplikaĵoj“.\n\n## Uzi la unuan aplikaĵon kiel defaŭltan aplikaĵon\n\nVi povas agordi vian Nextcloud, por ke ĝi alidirektu la uzanton al la unua aplikaĵo de la ordo: ŝanĝu la jenan agordon en la dosiero „config/config.php“:\n\n 'defaultapp' => 'apporder',\n\nUzantoj alidirektiĝos al la unua elektita aplikaĵo de la defaŭlta ordo aŭ al la unua aplikaĵo de sia propra ordo.", | |||
"App Order" : "Ordo de la aplikaĵoj", | |||
"Drag the app icons to change their order." : "Ŝovi la aplikaĵajn piktogramojn por ŝanĝi ilian ordon." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,9 @@ | |||
{ "translations": { | |||
"App order" : "Aplikaĵa ordo", | |||
"AppOrder" : "Aplikaĵa ordo", | |||
"Sort apps in the menu with drag and drop" : "Ordigi menuajn aplikaĵojn per ŝovo kaj demeto", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ebligas ordigi la aplikaĵajn piktogramojn el la personaj agordoj. Sian propran ordon havas ĉiu uzanto.\nAdministranto povas difini propran defaŭltan ordon.\n\n## Agordi defaŭltan ordon por ĉiuj novaj uzantoj\n\nIru al la administranto-agordoj > Plia agordo, kaj ŝovu la piktogramojn trovantajn en „Ordo de la aplikaĵoj“.\n\n## Uzi la unuan aplikaĵon kiel defaŭltan aplikaĵon\n\nVi povas agordi vian Nextcloud, por ke ĝi alidirektu la uzanton al la unua aplikaĵo de la ordo: ŝanĝu la jenan agordon en la dosiero „config/config.php“:\n\n 'defaultapp' => 'apporder',\n\nUzantoj alidirektiĝos al la unua elektita aplikaĵo de la defaŭlta ordo aŭ al la unua aplikaĵo de sia propra ordo.", | |||
"App Order" : "Ordo de la aplikaĵoj", | |||
"Drag the app icons to change their order." : "Ŝovi la aplikaĵajn piktogramojn por ŝanĝi ilian ordon." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Orden de apps", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Ordenar apps en el menú mediante arrastrar y soltar", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Permite ordenar los iconos de las apps desde la configuración personal. El orden se salvará individualmente para\ncada usuario. Los administradores puede definir un orden por defecto personalizado.\n\n## Configurar un orden por defecto para todos los usuarios nuevos\n\nConfiguración > Configuración adicional y arrastrar los iconos debajo de App Order.\n\n## Usar la primera app como app por defecto\n\nPuedes dejar que Nextcloud redireccione tu usuario a la primera app en el\norden personal con mucha facilidad. Hay que cambiar el siguiente parámetro en tu config/config.php:\n\n'defaultapp' => 'apporder',\n\nLos usuarios serán redirigidos a partir de ahora la primera app del orden por defecto o a la\nprimera app del orden del usuario.", | |||
"App Order" : "Orden de apps", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Establecer un orden predeterminado para todos los usuarios. Esto se ignorará si el usuario ha configurado un orden personalizado o si el orden predeterminado no está forzado.", | |||
"Drag the app icons to change their order." : "Arrastra los iconos de las aplicaciones para cambiar el orden.", | |||
"Force the default order for all users:" : "Forzar orden para todos los usuarios:", | |||
"If enabled, users will not be able to set a custom order." : "Si se activa, los usuarios no podrán personalizar el orden de las apps." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,10 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"Sort apps in the menu with drag and drop" : "Ordena las aplicaciones en el menú arrastrándolas", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Habilita el ordenamiento de los íconos de aplicaciones desde las configuraciones personales. El orden se guardará para cada \nusuario individualmente. Los adminsitradores pueden definir un orden predeterminado. \n\n### Establece el orden predeterminado para todos los usuarios\n\nVe a las configuraciones de Admin > Configuraciones adicionales y arrastra los íconos en orden de App.\n\n## Usa la primera aplicación como la aplicación predeterminada\n\nPuedes permitirle fácilmente a Nexcloud redirigir a tu usuario a la primera aplicación en su ordenamiento personal cambiando el siguiente parámetro en tu archivo config/config.php:\n\n'defaultapp' => 'apporder',\n\nLos usuarios ahora serán redirigidos a la primera aplicación del ordenamiento predeterminado o a la primera aplicación del ordenamiento de ese usuario. ", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "Orden de la aplicación", | |||
"App Order" : "Orden de la aplicación", | |||
"Drag the app icons to change their order." : "Arrastra los íconos de la aplicación para cambiar su orden." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,8 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"AppOrder" : "AppOrder", | |||
"App Order" : "Rakenduste järjestus", | |||
"Drag the app icons to change their order." : "Rakenduste järjestuse muutmiseks lohista need sobivasse kohta." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Aplikazioen ordena", | |||
"AppOrder" : "App-en ordena", | |||
"Sort apps in the menu with drag and drop" : "Ordenatu menuko aplikazioak arrastatu eta jareginez", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Gaitu aplikazioen ikonoen ordena norbere ezarpenetatik aldatzea. Erabiltzaile bakoitzak\nbere ordena eduki dezake. Kudeatzaileek lehenetsitako ordena definitu dezakete.\n\n## Ezarri lehenetsitako ordena erabiltzaile berri guztientzat\n\nJoan Kudeatzaile ezarpenetara > Ezarpen gehigarrietara eta arrastatu App-en ordenaren azpiko ikonoak.\n\n## Erabili lehen aplikazioa lehenetsitakoa bezala\n\nNextcloudek erabiltzaile bakoitza bere ordena pertsonaleko lehen aplikaziorantz\nberbideratu dezake modu errazean, ezarpenetan honako parametroa aldatuz config/config.php:\n\n 'defaultapp' => 'apporder',\n\nErabiltzaileak berbideratuak izango dira ordena lehenetsiko lehen aplikaziora edo\nerabiltzailearen ordenaren lehen aplikaziora.", | |||
"App Order" : "App-en ordena", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Ezarri lehenetsitako orden bat erabiltzaile guztientzat. Hau ezikusi egingo da erabiltzaileak orden pertsonalizatu bat konfiguratuta badu, eta orden lehenetsia ez badago behartuta.", | |||
"Drag the app icons to change their order." : "Arrastatu app-en ikonoak ordena aldatzeko.", | |||
"Force the default order for all users:" : "Behartu lehenetsitako ordena erabiltzaile guztientzat:", | |||
"If enabled, users will not be able to set a custom order." : "Gaituta badago, erabiltzaileek ezingo dute orden pertsonalizatu bat ezarri." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Aplikazioen ordena", | |||
"AppOrder" : "App-en ordena", | |||
"Sort apps in the menu with drag and drop" : "Ordenatu menuko aplikazioak arrastatu eta jareginez", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Gaitu aplikazioen ikonoen ordena norbere ezarpenetatik aldatzea. Erabiltzaile bakoitzak\nbere ordena eduki dezake. Kudeatzaileek lehenetsitako ordena definitu dezakete.\n\n## Ezarri lehenetsitako ordena erabiltzaile berri guztientzat\n\nJoan Kudeatzaile ezarpenetara > Ezarpen gehigarrietara eta arrastatu App-en ordenaren azpiko ikonoak.\n\n## Erabili lehen aplikazioa lehenetsitakoa bezala\n\nNextcloudek erabiltzaile bakoitza bere ordena pertsonaleko lehen aplikaziorantz\nberbideratu dezake modu errazean, ezarpenetan honako parametroa aldatuz config/config.php:\n\n 'defaultapp' => 'apporder',\n\nErabiltzaileak berbideratuak izango dira ordena lehenetsiko lehen aplikaziora edo\nerabiltzailearen ordenaren lehen aplikaziora.", | |||
"App Order" : "App-en ordena", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Ezarri lehenetsitako orden bat erabiltzaile guztientzat. Hau ezikusi egingo da erabiltzaileak orden pertsonalizatu bat konfiguratuta badu, eta orden lehenetsia ez badago behartuta.", | |||
"Drag the app icons to change their order." : "Arrastatu app-en ikonoak ordena aldatzeko.", | |||
"Force the default order for all users:" : "Behartu lehenetsitako ordena erabiltzaile guztientzat:", | |||
"If enabled, users will not be able to set a custom order." : "Gaituta badago, erabiltzaileek ezingo dute orden pertsonalizatu bat ezarri." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "سفارش برنامه", | |||
"AppOrder" : "سفارش برنامه", | |||
"Sort apps in the menu with drag and drop" : "مرتب کردن برنامه ها در فهرست با کشیدن و رها کردن", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "مرتب کردن نمادهای برنامه از تنظیمات شخصی را فعال کنید. سفارش برای هر کاربر به صورت جداگانه ذخیره می شود. سرپرستان می توانند یک سفارش پیش فرض سفارشی را تعریف کنند. # # # یک سفارش پیش فرض برای همه کاربران جدید تنظیم کنید. \"برو به تنظیمات مدیر> تنظیمات اضافی و نمادها را به ترتیب برنامه بکشید.\" ## از اولین برنامه به عنوان برنامه پیش فرض استفاده کنید. به راحتی می توانید با تغییر پارامتر زیر در پیکربندی / config.php خود ، Nextcloud را به کاربر خود به اولین برنامه به ترتیب شخصی خود هدایت کنید: 'defaultapp' => 'apporder' ، - اکنون کاربران استفاده می شوند. برنامه اول سفارش پیش فرض یا برنامه اول سفارش کاربر.", | |||
"App Order" : "سفارش برنامه", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "یک سفارش پیش فرض برای همه کاربران تنظیم کنید. اگر کاربر سفارش سفارشی تنظیم کرده باشد ، و سفارش پیش فرض اجباری نیست ، این مورد نادیده گرفته می شود.", | |||
"Drag the app icons to change their order." : "نمادهای برنامه را بکشید تا ترتیب آنها تغییر کند.", | |||
"Force the default order for all users:" : "سفارش پیش فرض را برای همه کاربران مجبور کنید:", | |||
"If enabled, users will not be able to set a custom order." : "در صورت فعال بودن ، کاربران قادر به تنظیم سفارش سفارشی نخواهند بود." | |||
}, | |||
"nplurals=2; plural=(n > 1);"); |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Sovellusjärjestys", | |||
"AppOrder" : "Sovellusjärjestys", | |||
"Sort apps in the menu with drag and drop" : "Järjestä sovellukset valikkoon vetämällä ja pudottamalla", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ota käyttöön toiminto sovelluskuvakkeiden uudelleenjärjestämiseen. Järjestelmänvalvoja voi määrittää oletusjärjestyksen, \nmutta käyttäjät voivat vaihtaa sen itselleen halutessaan\n\n## Määritä oletusjärjestys kaikille uusille käyttäjille\n\nAvaa Asetukset > Ylläpito > Sovellusjärjestys ja vedä sovellukset haluamaasi järjestykseen.\n\n## Käytä ensimmäistä sovellusta oletussovelluksena\n\nAseta Nextcloud ohjaamaan käyttäjä ensimmäiseen sovellukseen henkilökohtaisessa sovellusjärjestyksessä\nvaihtamalla seuraava parametri tiedostossa config/config.php:\n\n 'defaultapp' => 'apporder',\n\nKäyttäjät ohjataan nyt sovellusten oletusjärjestyksen ensimmäisen sovelluksen sijasta käyttäjän määrittämän sovellusjärjestyksen\nensimmäiseen sovellukseen.", | |||
"App Order" : "Sovellusjärjestys", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Määritä sovellusten oletusjärjestys kaikille käyttäjille. Käyttäjät voivat halutessaan määrittää sovellukset itselleen eri järjestykseen.", | |||
"Drag the app icons to change their order." : "Vedä sovellusten kuvakkeita vaihtaaksesi niiden järjestystä.", | |||
"Force the default order for all users:" : "Pakota oletusjärjestys kaikille käyttäjille:", | |||
"If enabled, users will not be able to set a custom order." : "Jos käytössä, käyttäjät eivät voi asettaa omavalintaista järjestystä." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Sovellusjärjestys", | |||
"AppOrder" : "Sovellusjärjestys", | |||
"Sort apps in the menu with drag and drop" : "Järjestä sovellukset valikkoon vetämällä ja pudottamalla", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ota käyttöön toiminto sovelluskuvakkeiden uudelleenjärjestämiseen. Järjestelmänvalvoja voi määrittää oletusjärjestyksen, \nmutta käyttäjät voivat vaihtaa sen itselleen halutessaan\n\n## Määritä oletusjärjestys kaikille uusille käyttäjille\n\nAvaa Asetukset > Ylläpito > Sovellusjärjestys ja vedä sovellukset haluamaasi järjestykseen.\n\n## Käytä ensimmäistä sovellusta oletussovelluksena\n\nAseta Nextcloud ohjaamaan käyttäjä ensimmäiseen sovellukseen henkilökohtaisessa sovellusjärjestyksessä\nvaihtamalla seuraava parametri tiedostossa config/config.php:\n\n 'defaultapp' => 'apporder',\n\nKäyttäjät ohjataan nyt sovellusten oletusjärjestyksen ensimmäisen sovelluksen sijasta käyttäjän määrittämän sovellusjärjestyksen\nensimmäiseen sovellukseen.", | |||
"App Order" : "Sovellusjärjestys", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Määritä sovellusten oletusjärjestys kaikille käyttäjille. Käyttäjät voivat halutessaan määrittää sovellukset itselleen eri järjestykseen.", | |||
"Drag the app icons to change their order." : "Vedä sovellusten kuvakkeita vaihtaaksesi niiden järjestystä.", | |||
"Force the default order for all users:" : "Pakota oletusjärjestys kaikille käyttäjille:", | |||
"If enabled, users will not be able to set a custom order." : "Jos käytössä, käyttäjät eivät voi asettaa omavalintaista järjestystä." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Ordre des applications", | |||
"AppOrder" : "Ordre des apps", | |||
"Sort apps in the menu with drag and drop" : "Triez les applications dans le menu en les faisant glisser", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Autoriser à trier les icônes des applications dans les paramètres personnels. L'ordre sera sauvegardé pour chaque utilisateur individuellement. Les administrateurs peuvent définir un ordre par défaut.\n\n## Mettre en place un ordre par défaut pour tous les nouveaux utilisateurs\n\nAllez dans Paramètres d'administration > Paramètres supplémentaires et glisser les icônes dans l'ordre voulu.\n\n## Utiliser la première application comme application par défaut\n\nVous pouvez facilement laisser Nextcloud rediriger votre utilisateur vers la première application de leur ordre personnel en changeant le paramètre suivant dans le fichier config/config.php:\n\n 'defaultapp' => 'apporder',\n\nL'utilisateur sera désormais redirigé vers sa première application de l'ordre par défaut ou la première application de son ordre.", | |||
"App Order" : "Ordre des applications", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Définir un ordre par défaut pour tous les utilisateurs. Il sera ignoré si l'utilisateur a défini un ordre personnalisé, et que l'ordre par défaut n'est pas forcé.", | |||
"Drag the app icons to change their order." : "Faites glisser les icônes des applications pour changer leur ordre.", | |||
"Force the default order for all users:" : "Forcer l'ordre par défaut pour tous les utilisateurs :", | |||
"If enabled, users will not be able to set a custom order." : "Si activé, les utilisateurs ne pourront plus sélectionner un ordre personnalisé." | |||
}, | |||
"nplurals=2; plural=(n > 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Orde das aplicacións", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Ordenar aplicacións no menú arrastrando e soltando", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Activa a ordenación das iconas das aplicacións dende os axustes persoais. A orde\ngardaráse individualmente para cada usuario. Os administradores poden definir\nunha orde personalizada predeterminada\n\n## Estabelecer unha orde predeterminada para todos os usuarios novos\n\nIr aos axustes de administración > Axustes adicionais e arrastrar as iconas na\norde desexada.\n\n## Usar a primeira aplicación como aplicación predeterminada\n\nPode deixar que Nextcloud redireccione o seu usuario á primeira aplicación na orde\npersoal con moita facilidade, só ten que cambiar o seguinte parámetro no ficheiro\nconfig/config.php:\n\n 'defaultapp' => 'apporder',\n\nA partir de agora, os usuarios serán redirixidos cara á primeira aplicación na\norde predeterminada ou cara á primeira aplicación na orde do usuario.", | |||
"App Order" : "Orde das aplicacións", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Estabelece unha orde predeterminado para todos os usuarios. Isto ignorarase se o usuario tiver estabelecida unha orden personalizada e a orde predeterminada non estiver forzada.", | |||
"Drag the app icons to change their order." : "Arrastre as iconas das aplicacións para cambiar a orde.", | |||
"Force the default order for all users:" : "Forzar a orde predeterminada para todos os usuarios:", | |||
"If enabled, users will not be able to set a custom order." : "Se está activado, os usuarios non poderán configurar unha orde personalizada." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "סידור יישומונים", | |||
"AppOrder" : "סידור יישומונים", | |||
"Sort apps in the menu with drag and drop" : "סידור יישומונים בתפריט באמצעות גרירה", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "אפשר מיון של אייקוני האפליקציות מההגדרות האישיות. הסדר תישמר עבור כל משתמש בנפרד. מנהלי המערכת יכולים להגדיר סדר ברירת מחדל מותאם אישית. ## הגדר סדר ברירת מחדל בשביל כל המשתמשים החדשים. \nעבור אל Admin settings>Additional settings, וגרור את הסמלים תחת App order. ## השתמש באפליקציה הראשונה כאפליקציית ברירת מחדל.\nבקלות אתה יכול לאפשר ל- Nextcloud להפנות את המשתמש שלך לאפליקציה הראשונה בסדר האישי שלו על ידי שינוי הפרמטר הבא ב- config / config.php שלך: \ndefault 'defaultapp' => 'apporder', now.\nהמשתמשים יופנו עכשיו אל האפליקציה הראשונה של הסדר ברירת המחדל, או לאפליקציה הראשונה של הסדר של המשתמש.", | |||
"App Order" : "סידור יישומונים", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "הגדרת סדר בררת המחדל לכל המשתמשים. ההגדרה הזאת לא תילקח בחשבון אם המשתמש הגדיר סדר משלו ולא נאכף סדר כבררת מחדל.", | |||
"Drag the app icons to change their order." : "יש לגרור את סמלי היישומונים כדי לשנות את הסדר שלהם.", | |||
"Force the default order for all users:" : "לאלץ את סדר בררת המחדל לכל המשתמשים:", | |||
"If enabled, users will not be able to set a custom order." : "אם האפשרות פעילה, המשתמשים לא יוכלו להחליף את הסדר." | |||
}, | |||
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: (n % 10 == 0 && n % 1 == 0 && n > 10) ? 2 : 3;"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Redoslijed aplikacija", | |||
"AppOrder" : "Redoslijed aplikacija", | |||
"Sort apps in the menu with drag and drop" : "Sortirajte aplikacije u izborniku povlačenjem i ispuštanjem", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Omogućite sortiranje ikona aplikacija iz osobnih postavki. Redoslijed će biti spremljen za svaku\npojedinačno. Administratori mogu definirati zadani redoslijed.\n\n## Postavite zadani redoslijed za sve nove korisnike\n\nIdite na Postavke administratora> Dodatne postavke i povucite ikone pod redoslijedom aplikacije.\n\n## Koristite prvu aplikaciju kao zadanu aplikaciju\n\nMožete pustiti neka Nextcloud preusmjeri korisnika na prvu aplikaciju njihovog\nosobnog redoslijeda promjenom sljedećeg parametra u vašem config / config.php:\n\n'defaultapp' => 'apporder',\n\nKorisnici će biti preusmjereni na prvu aplikaciju zadanog redoslijeda ili na\nprvu aplikaciju korisnika.", | |||
"App Order" : "Redoslijed aplikacija", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Postavite zadani poredak za sve korisnike. On će biti zanemaren ako je korisnik postavio prilagođeni poredak i zadani poredak nije nametnut.", | |||
"Drag the app icons to change their order." : "Povucite ikone aplikacija za promjenu redoslijeda.", | |||
"Force the default order for all users:" : "Nametnite zadani poredak za sve korisnike:", | |||
"If enabled, users will not be able to set a custom order." : "Ako je omogućeno, korisnici neće moći postaviti prilagođeni poredak." | |||
},"pluralForm" :"nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Alkalmazássorrend", | |||
"AppOrder" : "Alkalmazássorrend", | |||
"Sort apps in the menu with drag and drop" : "Rendezze az alkalmazásait fogd és vidd módszerrel", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Lehetővé teszi az alkalmazásikonok rendezését a személyes beállításokban.\nA sorrend felhasználóként külön lesz mentve.\nAz adminisztrátorok egyéni alapértelmezett sorrendet adhatnak meg.\n\n## Alapértelmezett sorrend megadása az összes felhasználónak\n\nUgorjon az Adminisztrációs beállítások > További beállításokhoz, és húzza az ikonokat az alkalmazássorrend alatt.\n\n## Az első alkalmazás alapértelmezettként használata\n\nKönnyen beállítható, hogy a Nextcloud átirányítsa a felhasználót az\nelső alkalmazásra a saját sorrendjében, a következő paraméter\nbeállításával a config/config.php fájlban:\n\n 'defaultapp' => 'apporder',\n\nA felhasználók most már átirányításra kerülnek az alapértelmezett\nsorrend első alkalmazására, vagy az egyéni sorrendjük első\nalkalmazására.", | |||
"App Order" : "Alkalmazássorrend", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Alapértelmezett sorrend beállítása az összes felhasználónak. Ez figyelmen kívül lesz hagyva, ha a felhasználó egyéni sorrendet állít be, az alapértelmezett sorrend nincs kikényszerítve.", | |||
"Drag the app icons to change their order." : "Húzza az alkalmazásikonokat a sorrendjük megváltoztatásához.", | |||
"Force the default order for all users:" : "Az alapértelmezett sorrend kikényszerítése az összes felhasználónál:", | |||
"If enabled, users will not be able to set a custom order." : "Ha engedélyezett, akkor a felhasználók nem állíthatnak be egyéni sorrendet." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Alkalmazássorrend", | |||
"AppOrder" : "Alkalmazássorrend", | |||
"Sort apps in the menu with drag and drop" : "Rendezze az alkalmazásait fogd és vidd módszerrel", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Lehetővé teszi az alkalmazásikonok rendezését a személyes beállításokban.\nA sorrend felhasználóként külön lesz mentve.\nAz adminisztrátorok egyéni alapértelmezett sorrendet adhatnak meg.\n\n## Alapértelmezett sorrend megadása az összes felhasználónak\n\nUgorjon az Adminisztrációs beállítások > További beállításokhoz, és húzza az ikonokat az alkalmazássorrend alatt.\n\n## Az első alkalmazás alapértelmezettként használata\n\nKönnyen beállítható, hogy a Nextcloud átirányítsa a felhasználót az\nelső alkalmazásra a saját sorrendjében, a következő paraméter\nbeállításával a config/config.php fájlban:\n\n 'defaultapp' => 'apporder',\n\nA felhasználók most már átirányításra kerülnek az alapértelmezett\nsorrend első alkalmazására, vagy az egyéni sorrendjük első\nalkalmazására.", | |||
"App Order" : "Alkalmazássorrend", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Alapértelmezett sorrend beállítása az összes felhasználónak. Ez figyelmen kívül lesz hagyva, ha a felhasználó egyéni sorrendet állít be, az alapértelmezett sorrend nincs kikényszerítve.", | |||
"Drag the app icons to change their order." : "Húzza az alkalmazásikonokat a sorrendjük megváltoztatásához.", | |||
"Force the default order for all users:" : "Az alapértelmezett sorrend kikényszerítése az összes felhasználónál:", | |||
"If enabled, users will not be able to set a custom order." : "Ha engedélyezett, akkor a felhasználók nem állíthatnak be egyéni sorrendet." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Urutan Aplikasi", | |||
"AppOrder" : "UrutanAplikasi", | |||
"Sort apps in the menu with drag and drop" : "Mengurutkan aplikasi pada menu secara tarik lepas", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Mengaktifkan mengurutkan ikon aplikasi melalui setelan personal. Urutan akan tersimpan pada tiap pengguna.\nAdministrator dapat mendefinisikan pengaturan urutan bawaan.\n\n## Atur setelan bawaan bagi semua pengguna\n\nMelalui setelan **Administrasi** > **Urutan aplikasi**, atur urutan dengan cara tarik lepas ikon pada daftar.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order.", | |||
"App Order" : "Urutan Aplikasi", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Atur setelan umum bagi semua pengguna. Ini akan diabaikan, jika pengguna telah menyetel urutan khusus, maka setelan umum tidak digunakan.", | |||
"Drag the app icons to change their order." : "Tarik ikon aplikasi untuk mengubah urutan.", | |||
"Force the default order for all users:" : "Semua pengguna wajib menggunakan urutan umum.", | |||
"If enabled, users will not be able to set a custom order." : "Jika diaktifkan, pengguna tidak dapat menyetel urutan khusus." | |||
},"pluralForm" :"nplurals=1; plural=0;" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Ordine applicazioni", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Ordina le applicazioni nel menu con il trascinamento e rilascio", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Consente di ordinare le icone delle applicazioni dalle impostazioni personali. L'ordine sarà salvato per ogni\nsingolo utente. Gli amministratori possono definire un ordine predefinito personalizzato.\n\n## Imposta un ordine predefinito per i nuovi utenti\n\nVai nelle impostazioni di amministrazione > Impostazioni aggiuntive e trascina le icone sotto Ordine applicazione.\n\n## Utilizza la prima applicazione come applicazione predefinita\n\nPuoi semplicemente lasciare che Nextcloud rediriga i tuoi utenti alla prima applicazione nel loro ordine personale modificando il parametro seguente nel file config/config.php:\n\n 'defaultapp' => 'apporder',\n\nGli utenti saranno quindi rediretti alla prima applicazione dell'ordine predefinito o alla prima applicazione dell'ordine dell'utente.", | |||
"App Order" : "Ordine applicazioni", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Imposta un ordine predefinito per tutti gli utenti. Sarà ignorato se l'utente ha configurato un ordine personalizzato e l'ordine predefinito non è forzato.", | |||
"Drag the app icons to change their order." : "Trascina le icone delle applicazioni per cambiare il loro ordine.", | |||
"Force the default order for all users:" : "Forza l'ordine predefinito per tutti gli utenti:", | |||
"If enabled, users will not be able to set a custom order." : "Se abilitata, gli utenti non potranno impostare un ordine personalizzato." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Ordine applicazioni", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Ordina le applicazioni nel menu con il trascinamento e rilascio", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Consente di ordinare le icone delle applicazioni dalle impostazioni personali. L'ordine sarà salvato per ogni\nsingolo utente. Gli amministratori possono definire un ordine predefinito personalizzato.\n\n## Imposta un ordine predefinito per i nuovi utenti\n\nVai nelle impostazioni di amministrazione > Impostazioni aggiuntive e trascina le icone sotto Ordine applicazione.\n\n## Utilizza la prima applicazione come applicazione predefinita\n\nPuoi semplicemente lasciare che Nextcloud rediriga i tuoi utenti alla prima applicazione nel loro ordine personale modificando il parametro seguente nel file config/config.php:\n\n 'defaultapp' => 'apporder',\n\nGli utenti saranno quindi rediretti alla prima applicazione dell'ordine predefinito o alla prima applicazione dell'ordine dell'utente.", | |||
"App Order" : "Ordine applicazioni", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Imposta un ordine predefinito per tutti gli utenti. Sarà ignorato se l'utente ha configurato un ordine personalizzato e l'ordine predefinito non è forzato.", | |||
"Drag the app icons to change their order." : "Trascina le icone delle applicazioni per cambiare il loro ordine.", | |||
"Force the default order for all users:" : "Forza l'ordine predefinito per tutti gli utenti:", | |||
"If enabled, users will not be able to set a custom order." : "Se abilitata, gli utenti non potranno impostare un ordine personalizzato." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,6 @@ | |||
{ "translations": { | |||
"AppOrder" : "AppOrder", | |||
"App Order" : "აპლიკაციების განლაგება", | |||
"Drag the app icons to change their order." : "გადაიტანეთ აპლიკაციის პიქტოგრამები მათი გალაგების შესაცვლელად." | |||
},"pluralForm" :"nplurals=2; plural=(n!=1);" | |||
} |
@ -0,0 +1,9 @@ | |||
{ "translations": { | |||
"App order" : "앱 순서", | |||
"AppOrder" : "앱 순서", | |||
"Sort apps in the menu with drag and drop" : "드래그 앤 드롭으로 메뉴에 있는 앱 정렬", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "개인 설정에서 앱 아이콘을 정렬하는 것을 허용합니다. 개별 사용자별로 정렬 순서를\n저장합니다. 관리자는 기본 사용자 정의 순서를 지정할 수 있습니다.\n\n## 모든 새 사용자의 기본 순서 지정\n\n관리자 설정 > 추가 설정으로 이동하여 앱 순서 메뉴 아래에 있는 아이콘을 드래그하십시오.\n\n## 첫 앱을 기본 앱으로 사용\n\nconfig/config.php 파일의 다음 인자를 수정하여 Nextcloud에서 사용자를\n첫 앱으로 안내할 수 있습니다:\n\n 'defaultapp' => 'apporder',\n\n사용자는 자동으로 기본 순서의 첫 앱이나 사용자 정의 순서의 첫 앱으로\n안내됩니다.", | |||
"App Order" : "앱 순서", | |||
"Drag the app icons to change their order." : "앱 아이콘을 드래그해서 순서를 변경할 수 있습니다." | |||
},"pluralForm" :"nplurals=1; plural=0;" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Programėlių tvarka", | |||
"AppOrder" : "Programėlių išdėstymo tvarka", | |||
"Sort apps in the menu with drag and drop" : "Velkant rikiuoti meniu esančias programėles", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Įjunkite galimybę rūšiuoti programos ikonas asmeniniuose nustatymuose. Kiekvienas naudotojas galės išsisaugoti individualią \nikonų išdėstymo tvarką. Administratorius gali nustatyti numatytąją tvarką.\n\n## Nustatyti numatytąją išdėstymo tvarką visiems naujiems naudotojams\n\nPasirinkite Administratoriaus nustatymai > Papildomi nustatymai ir tempdami išrikiuokite programų tvarką.\n\n## Naudokite pirmąją programą kaip numatytąją \n\nJūs galite lengvai leisti Nextcloud programai nukreipti Jūsų naudotoją į pirmąją programą, pakeisdami sekančius parametrus config/config.php faile:\n \n'defaultapp' => 'apporder',\n\nNaudotojas bus nukreiptas į pirmąją programą, pagal numatytą arba personalinę naudotojo tvarką.", | |||
"App Order" : "Programėlių tvarka", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Nustatyti numatytąją tvarką visiems naudotojams. Jos bus nepaisoma, jei naudotojas yra nusistatęs pasirinktinę tvarką, o numatytoji tvarka nėra priverstinė.", | |||
"Drag the app icons to change their order." : "Norėdami keisti programėlių tvarką, vilkite jų piktogramas.", | |||
"Force the default order for all users:" : "Priverstinai taikyti numatytąją tvarką visiems naudotojams:", | |||
"If enabled, users will not be able to set a custom order." : "Jei įjungta, naudotojai negalės nusistatyti pasirinktinės tvarkos." | |||
}, | |||
"nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);"); |
@ -0,0 +1,11 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Lietotņu izkārtojums", | |||
"AppOrder" : "Lietotņu izkārtojums", | |||
"Sort apps in the menu with drag and drop" : "Sakārto lietotnes lietotņu logā pārvelkot un nometot", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Iespējot lietotņu ikonu sakārtošanu no personīgiem iestatījumiem. Šis izkārtojums tiks saglabāta katram\nlietotājam induviduāli. Administratori var definēt specifisku noklusējuma izkārtojumu.\n\n## Uzstādīt noklusējuma izkārtojumu priekš visiem jauniem lietotājiem\n\nAizej uz Administrēšanas iestatījumiem > Papildus iestatījumi un pārvelc ikonas zem Lietotnes izkārtojums.\n\n## Uzstādīt pirmo lietotni kā noklusējuma lietotni\n\nTu vari vienkārši ļaut Nextcloud novirzīt lietotāju uz pirmo lietotni viņu\npersonīgajā izkārtojumā pārmainot sekojošo parametru savā config/config.php:\n\n 'defaultapp' => 'apporder'\n\nLietotāji nu tiks novirzīti uz pirmo lietotni savā noklusējuma izkārtojumā vai uz\npirmo lietotni lietotāja izkārtojumā.", | |||
"App Order" : "Lietotņu izkārtojums", | |||
"Drag the app icons to change their order." : "Pārvelc lietotņu ikonas, lai mainītu to izkārtojumu." | |||
}, | |||
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "App-rekkefølge", | |||
"AppOrder" : "App-rekkefølge", | |||
"Sort apps in the menu with drag and drop" : "Sorter apper i menyen med dra og slipp", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Aktiver sortering av app-ikon fra personlige innstillinger. Rekkefølge blir lagret for hver bruker. Administrator kan tilpasse standard rekkefølge.\n\n## Definer standard rekkefølge for alle nye brukere\n\nÅpne administrator innstillinger > Ekstra innstillinger og dra ikoner i ønsket rekkefølge under \"App-rekkefølge\".\n\n## Bruk første app som standard app\n\nDu kan la Nextcloud redirigere bruker til appen som er først ved å endre følgende innstilling i config/config.php:\n\n 'defaultapp' => 'apporder',\n\nBruker vil bli redirigert til den appen som er først i app-menyen.", | |||
"App Order" : "App-rekkefølge", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Angi en standardrekkefølge for alle brukere. Dette vil bli ignorert hvis brukeren har satt opp en tilpasset ordre, og standardrekkefølgen ikke blir tvunget.", | |||
"Drag the app icons to change their order." : "Dra og slipp app ikonene for å endre rekkefølgen.", | |||
"Force the default order for all users:" : "Tving standardrekkefølgen for alle brukere:", | |||
"If enabled, users will not be able to set a custom order." : "Hvis aktivert, vil ikke brukere kunne angi en tilpasset rekkefølge." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "App Volgorde", | |||
"AppOrder" : "AppVolgorde", | |||
"Sort apps in the menu with drag and drop" : "Sorteert apps in het menu met slepen", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Maakt sorteren van de app pictogrammen mogelijk via de persoonlijke instellingen. De volgorde blijft voor elke afzonderlijke gebruikers bewaard. Beheerders kunnen zelf een standaardvolgorde instellen.\n\n## Instellen standaardvolgorde voor alle nieuwe gebruikers\n\nGa naar Beheer instellingen > Aanvullende instellingen en sleep de pictogrammen onder App volgorde.\n\n## Gebruik eerste app als standaard app\n\nJe kunt Nextcloud je gebruikers makkelijk doorsturen naar de eerste app in hun persoonlijke volgorde dooe de volgende parameter in je config/config.php:\n\n 'defaultapp' => 'apporder',\n\nGebruikers worden nu doorgeleid naar de eerste app van de standaardvolgorde of naar de eerste app in hun eigen volgorde.", | |||
"App Order" : "App Volgorde", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Stel een standaard volgorde in voor alle gebruikers. Dit zal genegeerd worden indien de gebruiker een aangepaste volgorde heeft ingesteld en de standaard volgorde is niet geforceerd.", | |||
"Drag the app icons to change their order." : "Sleep de app iconen om hun volgorde te wijzigen.", | |||
"Force the default order for all users:" : "Forceer de standaard volgorde voor alle gebruikers:", | |||
"If enabled, users will not be able to set a custom order." : "Als dit ingesteld is, kunnen gebruikers niet meer een aangepaste volgorde instellen." | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,9 @@ | |||
{ "translations": { | |||
"App order" : "App-rekkefølgje", | |||
"AppOrder" : "AppRekkjefølgje", | |||
"Sort apps in the menu with drag and drop" : "Sorter appar i menyen med dra og slepp", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Slå på sortering av app-ikona frå dei personlege innstillingane. Rekkefølgja vil verta lagra\nfor kvar brukar individuelt. Administratorar kan laga ei standard-rekkefølgje.\n\n## Vel ei standard rekkefølgje for nye brukarar\n\nGå til Administrasjon > Fleire innstillingar og dra ikona under App-rekkefølgje.\n\n## Bruk fyrste app som standard-app\n\nDu kan enkelt la Nextcloud styra brukaren til den fyrste appen i deira personlege rekkefølgje ved å endra denne parameteren i config/config.php:\n\n 'defaultapp' => 'apporder',\n\nBrukarane vil no verta styrte til den fyrste appen i standardrekkefølgja eller den\nfyrste appen i brukaren si rekkefølgje.", | |||
"App Order" : "App-rekkjefølgje", | |||
"Drag the app icons to change their order." : "Dra applikasjons ikona for å endre rekkjefølgja" | |||
},"pluralForm" :"nplurals=2; plural=(n != 1);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Kolejność aplikacji", | |||
"AppOrder" : "Kolejność aplikacji", | |||
"Sort apps in the menu with drag and drop" : "Ustaw kolejność wyświetlania aplikacji metodą przeciągnij i upuść", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Włącz sortowanie ikon aplikacji w ustawieniach osobistych. Kolejność ikon zostanie zachowana dla każdego\nużytkownika indywidualnie. Administratorzy mogą zdefiniować domyślną kolejność.\n\n## Ustaw domyślną kolejność dla wszystkich nowych użytkowników\n\nPrzejdź do Ustawienia > Administracja > Ustawienia dodatkowe i przeciągnij ikony aplikacji aby zmienić ich kolejność\n\n## Użyj pierwszej aplikacji jako aplikacji domyślnej\n\nMożesz pozwolić Nextcloud na przekierowanie użytkownika do pierwszej aplikacji w\nwybranej przez niego kolejności, zmieniając następujący parametr w config / config.php:\n\n 'defaultapp' => 'apporder',\n\nUżytkownicy zostaną teraz przekierowani do pierwszej aplikacji z kolejności domyślnej lub do pierwszej aplikacji wybranej przez użytkownika.", | |||
"App Order" : "Kolejność aplikacji", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Ustaw domyślną kolejność aplikacji dla wszystkich użytkowników. Opcja będzie zignorowana jeśli użytkownik ustali własną kolejność, chyba że kolejność domyślna jest wymuszona.", | |||
"Drag the app icons to change their order." : "Przeciągnij ikony aplikacji, aby zmienić ich kolejność.", | |||
"Force the default order for all users:" : "Wymuś domyślną kolejność dla wszystkich użytkowników:", | |||
"If enabled, users will not be able to set a custom order." : "Jeśli ta opcja jest włączona, użytkownicy nie będą mogli ustawić własnej kolejności." | |||
},"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);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Classificar aplicativos", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Classificar os aplicativos no menu com arrastar e soltar", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ative a classificação dos ícones de aplicativos nas configurações. Isso será salvo para cada\nusuário individualmente. Administradores podem definir uma ordem padrão personalizada.\n\n## Definir uma ordem padrão para todos os novos usuários\n\nVá em Configurações de Administrador > Configurações Adicionais e arraste os ícones em Ordem do aplicativo.\n\n## Use o primeiro aplicativo como aplicativo padrão\n\nVocê pode fazer o Nextcloud redirecionar o usuário para o primeiro aplicativo da sua\nordem pessoal, alterando o seguinte parâmetro no seu config/config.php:\n\n 'defaultapp' => 'apporder',\n\nOs usuários agora serão redirecionados para o primeiro aplicativo padrão ou\npara o primeiro aplicativo na ordem do usuário.", | |||
"App Order" : "Pedido de Aplicativo", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Defina um pedido padrão para todos os usuários. Isso será ignorado se o usuário tiver configurado um pedido personalizado e o pedido padrão não forçado.", | |||
"Drag the app icons to change their order." : "Arraste os ícones dos aplicativos para mudar a ordem.", | |||
"Force the default order for all users:" : "Forçar o pedido padrão para todos os usuários:", | |||
"If enabled, users will not be able to set a custom order." : "Se ativado, os usuários não poderão fazer um pedido personalizado." | |||
},"pluralForm" :"nplurals=2; plural=(n > 1);" | |||
} |
@ -0,0 +1,11 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Ordenação da aplicação", | |||
"AppOrder" : "OrdenaçãoAplicação", | |||
"Sort apps in the menu with drag and drop" : "Ordene as aplicações no menu com arrastar e largar", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Ative a ordenação dos ícones de aplicação nas definições pessoais. A ordenação será guardada individualmente\npara cada utilizador. Os administradores podem definir uma ordenação predefinida personalizada.\n\n## Defina uma ordenação predefinida para todos os novos utilizadores\n\nVás às Definições de Administrador > Definições adicionais e arraste os ícones por debaixo da ordenação da Aplicação.\n\n## Use a primeira aplicação como a aplicação predefinida \n\nPode facilmente permitir que o Nextcloud redirecione o seu utilizador para a \nprimeira aplicação na sua ordenação pessoal, alterando o seguinte \nparâmetro no seu\nconfig/config.php:\n\n 'defaultapp' => 'apporder',\n\nOs utilizadores serão agora redirecionados para a primeira aplicação da ordenação predefinida ou para \na primeira aplicação da ordenação do utilizador.", | |||
"App Order" : "Ordenação de Aplicação", | |||
"Drag the app icons to change their order." : "Arraste os ícones da aplicação para alterar a sua ordem." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Порядок приложений", | |||
"AppOrder" : "Порядок приложений", | |||
"Sort apps in the menu with drag and drop" : "Сортируйте приложения с помощью перетаскивания", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Включите сортировку иконок приложений в личных настройках. Заказ будет сохранен для каждого пользователя отдельно. Администраторы могут определять пользовательский список по умолчанию. ## Установить список по умолчанию для всех новых пользователей. Перейти к Настройки администратора > Дополнительные параметры и перетащить значки в разделе «Список приложений». ## Использовать первое приложение в качестве приложения по умолчанию Вы можете легко позволить Nextcloud перенаправить пользователя на первое приложение в своем личном списке, изменив следующий параметр в вашем config/config.php: 'defaultapp' => 'apporder', Теперь пользователи будут перенаправлены на первое приложение по умолчанию или в первое приложение в пользовательском списке.", | |||
"App Order" : "Порядок приложений", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Задаёт для всех пользователей порядок приложений по умолчанию. Не распространяется на пользователей, которые самостоятельно задали порядок приложений при отключённом параметре «принудительно использовать заданный порядок приложений».", | |||
"Drag the app icons to change their order." : "Перемещайте значки приложений для изменения порядка их следования.", | |||
"Force the default order for all users:" : "Принудительно использовать заданный порядок приложений для всех пользователей:", | |||
"If enabled, users will not be able to set a custom order." : "При включении этого параметра пользователи не смогут задавать свой порядок приложений." | |||
}, | |||
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Zoradenie aplikácií", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Poradie aplikácií v ponuke je možné meniť potiahnutím", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Umožňuje zoradenie ikon a aplikácií prostredníctvom osobných nastavení. Poradie sa uloží\npre každého používateľa zvlášť. Správcovia môžu určiť predvolené poradie ikon.\n\n## Nastavenie predvoleného poradia ikon pre nových používateľov\n\nChoďte do Nastavenia > Správa > Ďalšie nastavenia a v sekcii Poradie aplikácií popreťahujte ikony do vami zvoleného poradia.\n\n## Použitie prvej aplikácie ako predvolené\n\nPoužívateľa môžete jednoducho presmerovať na prvú aplikáciu v ich poradí tým, že zmeníte nasledujúci parameter v súbore config/config.php:\n\n'defaultapp' => 'apporder',\n\nPoužívatelia teraz budú automaticky presmerovaní na prvú aplikáciu predvoleného resp. im nastaveného poradia.", | |||
"App Order" : "Zoradenie aplikácií", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Nastaviť predvolenú objednávku pre všetkých používateľov. Toto bude ignorované, ak má užívateľ nastavenú vlastnú objednávku a predvolená objednávka nie je vynútená.", | |||
"Drag the app icons to change their order." : "Presuňte ikony aplikácií a zmeňte ich poradie.", | |||
"Force the default order for all users:" : "Vynútiť predvolenú objednávku pre všetkých používateľov:", | |||
"If enabled, users will not be able to set a custom order." : "Ak je povolená, používatelia nebudú môcť nastaviť vlastnú objednávku." | |||
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n == 1 ? 0 : n % 1 == 0 && n >= 2 && n <= 4 ? 1 : n % 1 != 0 ? 2: 3);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Razvrščevalnik menija", | |||
"AppOrder" : "Razvrščevalnik AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Enostavno razvrščanje in urejanje prikaza programov v menijski vrstici", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Program omogoča razvrščanje ikon v menijski vrstici, možnosti pa so zbrane med osebnimi nastavitvami. Vrstni red se shrani za vsakega uporabnika posebej,\nskrbniki pa lahko določajo poseben vrstni red.\n\n## Nastavitev privzetega vrstnegar eda za vse uporabnike\n\nMed skrbniškimi nastavitvami > Dodante nastavitve je na voljo seznam, ki ga je mogoče razvrstiti in posamezne predmete onemogočiti.\n\n## Uporabi prvi program kot privzeti\n\nPreusmerjanje uporabnikov na prvi program v razvrstitvi po meri je mogoče določiti s spreminjanjem parametrov v datoteki config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUporabniko bodo preusmerjeni na prvi program v privzeti razvistitvi\noziroma prvi program v uporabniški razvrstitvi.", | |||
"App Order" : "Razvrščevalnik App Order", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Nastavi privzeto razvrstitev za vse uporabnike. Spremembe se pri uporabnikih ne izrazijo, če si menije sami preuredijo po meri oziroma če razvrstitev ni vsiljena.", | |||
"Drag the app icons to change their order." : "S potegom predmeta je mogoče spreminjati vrstni red programov v menijski vrstici.", | |||
"Force the default order for all users:" : "Vsili privzeti vrstni red za vse uporabnike:", | |||
"If enabled, users will not be able to set a custom order." : "Izbrana možnost onemogoča uporabniku prilagajanje razvrstitve po meri." | |||
},"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Appordning", | |||
"AppOrder" : "AppOrder", | |||
"Sort apps in the menu with drag and drop" : "Sortera appar i menyn genom att dra och släppa", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Aktivera sortering av appikoner från de personliga inställningarna. Ordern sparas för varje\nanvändaren individuellt. Administratörer kan definiera en anpassad standardordning.\n\n## Ange en standardorder för alla nya användare\n\nGå till administratörsinställningarna > ytterligare inställningar och dra ikonerna under apporder.\n\n## Använd första appen som standard app\n\nDu kan enkelt låta Nextcloud omdirigera din användare till den första appen i deras\npersonlig order genom att ändra följande parameter i din config/config.php:\n\n 'defaultapp' => 'apporder',\n\nAnvändare kommer nu att omdirigeras till den första appen i standardordern eller till\nförsta app av användarordern.", | |||
"App Order" : "Appordning", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Välj en standardsortering för alla användare. Om användaren valt en annan sortering kommer standardvalet att ignoreras.", | |||
"Drag the app icons to change their order." : "Dra appikonerna för att ändra deras ordning.", | |||
"Force the default order for all users:" : "Bestäm standardsortering för alla användare:", | |||
"If enabled, users will not be able to set a custom order." : "Om aktiverat, kommer användarna inte att kunna välja egen sortering." | |||
}, | |||
"nplurals=2; plural=(n != 1);"); |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Uygulama sıralaması", | |||
"AppOrder" : "UygulamaSıralaması", | |||
"Sort apps in the menu with drag and drop" : "Menüdeki uygulamaların sıralamasını sürükleyip bırakarak değiştirir", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Uygulama simgelerinin kişisel tercihe göre sıralanabilmesini sağlar. Sıralama her kullanıcıya \nözel olarak kaydedilir. Yöneticiler özel bir sıralamayı varsayılan olarak atayabilir.\n\n## Tüm yeni kullanıcılar için varsayılan sıralamayı ayarlamak\n\nYönetici ayarları > Ek ayarlar bölümüne giderek Uygulama sıralaması altındaki simgeleri\nsürükleyip bırakın.\n\n## İlk uygulamayı varsayılan uygulama olarak kullanmak\n\nconfig/config.php dosyasında aşağıdaki ayarı yaparak kullanıcıların uygulama listesindeki ilk\nuygulamanın varsayılan olarak açılması sağlanabilir:\n\n 'defaultapp' => 'apporder',\n\nBöylece kullanıcılar için varsayılan sıralamadaki ilk uygulama yerine tercih ettikleri \nsıralamadaki ilk uygulama açılır.", | |||
"App Order" : "Uygulama Sıralaması", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Tüm kullanıcılar için geçerli olacak varsayılan sıralamayı ayarlayın. Kullanıcı özel bir sıralama seçtiyse bu seçenek yok sayılır ve varsayılan sıralama uygulanmaz.", | |||
"Drag the app icons to change their order." : "Simgeleri sürükleyerek uygulamaları sıralayabilirsiniz.", | |||
"Force the default order for all users:" : "Tüm kullanıcılara uygulanacak varsayılan sıralama:", | |||
"If enabled, users will not be able to set a custom order." : "Bu seçenek etkinleştirildiğinde, kullanıcılar özel bir sıralama uygulayamaz." | |||
}, | |||
"nplurals=2; plural=(n > 1);"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Uygulama sıralaması", | |||
"AppOrder" : "UygulamaSıralaması", | |||
"Sort apps in the menu with drag and drop" : "Menüdeki uygulamaların sıralamasını sürükleyip bırakarak değiştirir", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Uygulama simgelerinin kişisel tercihe göre sıralanabilmesini sağlar. Sıralama her kullanıcıya \nözel olarak kaydedilir. Yöneticiler özel bir sıralamayı varsayılan olarak atayabilir.\n\n## Tüm yeni kullanıcılar için varsayılan sıralamayı ayarlamak\n\nYönetici ayarları > Ek ayarlar bölümüne giderek Uygulama sıralaması altındaki simgeleri\nsürükleyip bırakın.\n\n## İlk uygulamayı varsayılan uygulama olarak kullanmak\n\nconfig/config.php dosyasında aşağıdaki ayarı yaparak kullanıcıların uygulama listesindeki ilk\nuygulamanın varsayılan olarak açılması sağlanabilir:\n\n 'defaultapp' => 'apporder',\n\nBöylece kullanıcılar için varsayılan sıralamadaki ilk uygulama yerine tercih ettikleri \nsıralamadaki ilk uygulama açılır.", | |||
"App Order" : "Uygulama Sıralaması", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Tüm kullanıcılar için geçerli olacak varsayılan sıralamayı ayarlayın. Kullanıcı özel bir sıralama seçtiyse bu seçenek yok sayılır ve varsayılan sıralama uygulanmaz.", | |||
"Drag the app icons to change their order." : "Simgeleri sürükleyerek uygulamaları sıralayabilirsiniz.", | |||
"Force the default order for all users:" : "Tüm kullanıcılara uygulanacak varsayılan sıralama:", | |||
"If enabled, users will not be able to set a custom order." : "Bu seçenek etkinleştirildiğinde, kullanıcılar özel bir sıralama uygulayamaz." | |||
},"pluralForm" :"nplurals=2; plural=(n > 1);" | |||
} |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "Порядок застосунків", | |||
"AppOrder" : "Перелік застосунків", | |||
"Sort apps in the menu with drag and drop" : "Впорядкування застосунків у меню за допомогою перетягування елементів", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Дозволяє сортувати значки застосунків у персональних налаштуваннях. Порядок збурігається окремо для кожного користувача. Адміністратор може налаштувати власний початковий порядок.\n\n## Налаштувати початковий порядок для всіх нових користувачів\n\nПерейдіть у Налаштування адміністратора (Admin settings) > Додаткові налаштування (Additional settings) і перетянгіть значки у бажаному порядку.\n\n## Використовувати перший застосунок як початковий\n\nВи можете дозволити Nextcloud перенаправляти користувачів на перший застосунок у їхніх налаштуваннях за допомогою насткпного параметре у вашому файоі конфігурації config/config.php:\n\n 'defaultapp' => 'apporder',\n\nТепер користувачі будуть перенаправлятися одразу після входу на перший застосунок у їхніх налаштуваннях.", | |||
"App Order" : "Впорядкування застосунків", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Встановіть типовий порядок для усіх користувачів. Це не буде застосовуватися, якщо користувач визначив власний порядок розташування елементів, при цьому типовий порядок не увімкнено.", | |||
"Drag the app icons to change their order." : "Потягніть за іконку застосунку для зміни його позиції в переліку.", | |||
"Force the default order for all users:" : "Застосувати типовий порядок для всіх користувачів:", | |||
"If enabled, users will not be able to set a custom order." : "Якщо увімкнено, користувачі не зможуть визначати власний порядок." | |||
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "Thứ tự ứng dụng", | |||
"AppOrder" : "Thứ-tự.Ứng-dụng", | |||
"Sort apps in the menu with drag and drop" : "Sắp xếp các ứng dụng trong bảng chọn bằng cách kéo và thả", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "Bật khả năng sắp xếp các biểu tượng ứng dụng từ các thiết lập cá nhân. Thứ tự sẽ được lưu lại mỗi người dùng riêng biệt.\nCác quản trị viên có thể định dạng một thiết lập thứ tự mặc định.\n\n##Đặt một thiết lập thứ tự mặc địnhcho tất cả các người dùng.\n\nĐi đến các Thiết lập Quản trị viên > các Thiết lập Bổ sung và kéo các biểu tượng dưới danh sách Thứ tự Ứng dụng.\n\n##Sử dụng ứng đụng đầu tiên như là ứng dụng mặc định\n\nBạn có thể dễ dàng khiến Nextcloud điều hướng tự động người dùng của bạn đến ứng dụng đầu tiên trong thứ tự cá nhân của họ bằng cách thay đổi tham số dưới đây trong tệp config/config.php:\n\n 'defaultapp' => 'apporder',\n\nNgười dùng bây giờ sẽ được tái điều hướng đến ứng dụng đầu tiên của thứ tự mặc định hoặc đến ứng dụng đầu tiên của thứ tự tùy chỉnh riêng của người dùng. ", | |||
"App Order" : "Thứ tự ứng dụng", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "Đặt một thứ tự mặc định cho tất cả các người dùng. Điều này có thể bị bỏ qua, nếu một người dùng đã thiết lập một tùy chỉnh thứ tự riêng, và thứ tự mặc định không bị ép buộc thực thi. ", | |||
"Drag the app icons to change their order." : "Kéo biểu tượng ứng dụng và thay đổi thứ tự của nó.", | |||
"Force the default order for all users:" : "Ép buộc thực thi thứ tự mặc định cho tất cả các người dùng:", | |||
"If enabled, users will not be able to set a custom order." : "Nếu được kích hoạt, người dùng sẽ không thể đặt một tùy chỉnh thứ tự riêng." | |||
}, | |||
"nplurals=1; plural=0;"); |
@ -0,0 +1,12 @@ | |||
{ "translations": { | |||
"App order" : "应用顺序", | |||
"AppOrder" : "应用顺序", | |||
"Sort apps in the menu with drag and drop" : "在菜单上拖拽调整应用排序", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "在个人设置中启用应用图标排序。排列顺序会为每个用户独立保存。\n管理员可以定义全局默认的排序。\n\n## 为所有用户设置默认排序\n\n转到管理员设置>其他设置,然后拖动应用图标来排序。\n\n## 将第一个应用作为默认应用\n\n您可以轻松地让 Nextcloud 将您的用户重定向到他们的第一个应用程序\n通过更改 config / config.php 中的以下参数来实现:\n\n 'defaultapp' => 'apporder',\n\n用户现在将被重定向到默认排序下的第一个应用程序或\n用户排序的第一个应用程序。", | |||
"App Order" : "应用顺序", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "为所有用户设置默认顺序。 如果用户已设置自定义顺序,并且不强制使用默认顺序,则将忽略此设置。", | |||
"Drag the app icons to change their order." : "拖动应用图标以修改顺序", | |||
"Force the default order for all users:" : "对所有用户强制使用默认顺序:", | |||
"If enabled, users will not be able to set a custom order." : "如果启用,用户将无法设置自定义顺序。" | |||
},"pluralForm" :"nplurals=1; plural=0;" | |||
} |
@ -0,0 +1,14 @@ | |||
OC.L10N.register( | |||
"apporder", | |||
{ | |||
"App order" : "應用程式順序", | |||
"AppOrder" : "應用程式順序", | |||
"Sort apps in the menu with drag and drop" : "拖曳來調整選單中應用程式的順序", | |||
"Enable sorting the app icons from the personal settings. The order will be saved for each\nuser individually. Administrators can define a custom default order.\n\n## Set a default order for all new users\n\nGo to the Admin settings > Additional settings and drag the icons under App order.\n\n## Use first app as default app\n\nYou can easily let Nextcloud redirect your user to the first app in their\npersonal order by changing the following parameter in your config/config.php:\n\n 'defaultapp' => 'apporder',\n\nUsers will now get redirected to the first app of the default order or to the\nfirst app of the user order." : "允許使用者在個人設定當中調整應用程式圖示的順序,每個使用者可以獨立設定自己偏好的順序,管理員可以也設定預設的順序。\n\n## 為所有新使用者設定預設的順序\n\n前往「設定」>「其他設定」,然後拖曳「應用程式順序」下方的圖示\n\n## 使用第一個應用程式為預設應用程式\n\n您可以設定 Nextcloud 自動在登入時將使用者重導向至他們設定的順序中最前面的應用程式,您需要修改 config/config.php 中的參數如下:\n\n 'defaultapp' => 'apporder',\n\n設定完成之後使用者就會自動被重導向至他們設定的順序中最前面的應用程式。", | |||
"App Order" : "應用程式順序", | |||
"Set a default order for all users. This will be ignored, if the user has setup a custom order, and the default order is not forced." : "對所有使用者設定預設順序。如果使用者有設定自訂順序則會忽略,不強制使用預設順序。", | |||
"Drag the app icons to change their order." : "拖曳應用程式的圖示來更改順序", | |||
"Force the default order for all users:" : "強制讓所有使用者使用預設順序:", | |||
"If enabled, users will not be able to set a custom order." : "若開啟,使用者將無法設定自訂順序。" | |||
}, | |||
"nplurals=1; plural=0;"); |
@ -0,0 +1,86 @@ | |||
<?php | |||
/** | |||
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net> | |||
* | |||
* @author Julius Härtl <jus@bitgrid.net> | |||
* | |||
* @license GNU AGPL version 3 or any later version | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU Affero General Public License as | |||
* published by the Free Software Foundation, either version 3 of the | |||
* License, or (at your option) any later version. | |||
* | |||
* 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 | |||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
* | |||
*/ | |||
namespace OCA\AppOrder\Controller; | |||
use \OCP\AppFramework\Controller; | |||
use OCP\AppFramework\Http\RedirectResponse; | |||
use \OCP\IRequest; | |||
use \OCA\AppOrder\Service\ConfigService; | |||
use OCA\AppOrder\Util; | |||
use OCP\IURLGenerator; | |||
class AppController extends Controller { | |||
private $userId; | |||
private $urlGenerator; | |||
private $util; | |||
public function __construct($appName, | |||
IRequest $request, | |||
IURLGenerator $urlGenerator, | |||
Util $util, $userId) { | |||
parent::__construct($appName, $request); | |||
$this->userId = $userId; | |||
$this->urlGenerator = $urlGenerator; | |||
$this->util = $util; | |||
} | |||
/** | |||
* @NoCSRFRequired | |||
* @NoAdminRequired | |||
* @return RedirectResponse | |||
*/ | |||
public function index() { | |||
$order = json_decode($this->util->getAppOrder()); | |||
$hidden = json_decode($this->util->getAppHidden()); | |||
$firstPage = null; | |||
if ($order !== null && sizeof($order) > 0) { | |||
if($hidden !== null && sizeof($hidden) > 0){ | |||
foreach($order as $app){ | |||
if(!in_array($app,$hidden)){ | |||
$firstPage = $app; | |||
break; | |||
} | |||
} | |||
} | |||
else{ | |||
$firstPage = $order[0]; | |||
} | |||
} | |||
if($firstPage===null) { | |||
$appId = 'files'; | |||
if (getenv('front_controller_active') === 'true') { | |||
$firstPage = $this->urlGenerator->getAbsoluteURL('/apps/' . $appId . '/'); | |||
} else { | |||
$firstPage = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . $appId . '/'); | |||
} | |||
} | |||
return new RedirectResponse($firstPage); | |||
} | |||
} |