Compare commits

...

4 Commits

15 changed files with 154 additions and 128 deletions

View File

@ -1,11 +1,8 @@
use std::convert::TryInto;
use chrono::Utc;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl};
use rocket::State;
use crate::database::controller::connector::establish_connection;
use crate::modules::api::events::instances::update::PatchInstanceData;
use crate::schema::eu_instances;
use crate::Settings;

View File

@ -1,8 +1,7 @@
use diesel::sql_types::Integer;
use rocket::serde::json::Json;
use rocket::State;
use crate::database::controller::events::{add_position_to_template, EventUnitTemplatePosition, RawEventUnitTemplatePosition, update_eu_template, update_positions_templates};
use crate::database::controller::events::{EventUnitTemplatePosition, RawEventUnitTemplatePosition, update_eu_template, update_positions_templates};
use crate::database::model::events::EventUnitTemplate;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
@ -72,7 +71,7 @@ pub fn update_position_for_template(
let data = position_template_data.into_inner();
if (data.template_id != template_id || data.position_entity_id != position_id || data.position_template_id != position_template_id) {
if data.template_id != template_id || data.position_entity_id != position_id || data.position_template_id != position_template_id {
return Err(Json(
ApiError::new(400, "template_id or position_entity_id or position_template_id in URI doesn't match PUT data!".to_string()).to_wrapper(),
));

View File

@ -1,6 +1,3 @@
use chrono::{DateTime, FixedOffset, NaiveDateTime};
use chrono_tz::Tz;
use diesel::result::Error;
use rocket::serde::json::Json;
use rocket::State;

View File

@ -1,9 +1,7 @@
use std::convert::TryInto;
use chrono::{DateTime, ParseError, Utc};
use rocket::serde::json::Json;
use rocket::State;
use uuid::Uuid;
use crate::database::controller::events::{change_position_instances, get_event};
use crate::database::controller::events::instances::instances::{RawEventUnitInstanceChangeset, update_instance};

View File

@ -1,16 +1,15 @@
use rocket::State;
use crate::helper::settings::Settings;
use crate::helper::session_cookies::model::SessionCookie;
use chrono::{Local, NaiveDateTime};
use rocket::serde::json::Json;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_option_uuid};
use crate::database::model::event_requests::EventRequest;
use rocket::State;
use crate::database::controller::entities::generate_entity;
use diesel::sql_types::Integer;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::database::controller::event_requests::add_event_request;
use chrono::{NaiveDateTime, ParseError, Local};
use std::str::FromStr;
use crate::database::model::event_requests::EventRequest;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_option_uuid};
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
#[derive(Queryable, Clone, Deserialize, Serialize)]
pub struct RequestData {

View File

@ -1,15 +1,16 @@
use rocket::{State, Request};
use crate::helper::settings::Settings;
use crate::helper::session_cookies::model::SessionCookie;
use crate::database::model::event_requests::EventRequest;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::parse_member_cookie;
use crate::database::controller::event_requests::{get_event_requests, get_event_request_count};
use crate::helper::translate_diesel_error::translate_diesel;
use rocket::serde::json::Json;
use rocket::State;
use crate::database::controller::event_requests::{get_event_request_count, get_event_requests};
use crate::database::model::event_requests::EventRequest;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::member_management::controller::parser::parse_member_cookie;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
#[derive(Queryable, Clone, Deserialize, Serialize)]
pub struct EventRequestList{
pub struct EventRequestList {
pub(crate) requests: Vec<EventRequest>,
pub(crate) total_request_count: i64,
}

View File

@ -1,23 +1,24 @@
use crate::helper::settings::Settings;
use rocket::State;
use rocket::serde::json::Json;
use crate::helper::session_cookies::model::SessionCookie;
use crate::modules::api::events::requests::create::RequestData;
use crate::database::model::event_requests::EventRequest;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_option_uuid, parse_uuid};
use crate::database::controller::entities::generate_entity;
use chrono::{NaiveDateTime, Local};
use crate::database::controller::event_requests::{add_event_request, change_event_request, get_event_request};
use crate::helper::translate_diesel_error::translate_diesel;
use crate::helper::mail_templates::MailTemplates;
use crate::helper::mail_queue::queue::{MailQueue, Mail};
use std::sync::Arc;
use crate::database::model::organisers::Organiser;
use chrono::NaiveDateTime;
use rocket::serde::json::Json;
use rocket::State;
use crate::database::controller::api_communication_targets::get_member_email_addresses;
use crate::database::controller::event_requests::{change_event_request, get_event_request};
use crate::database::controller::members::get_member_by_uuid;
use crate::database::controller::organisers::get_organiser;
use crate::database::controller::permissions::get_members_with_permission;
use crate::database::controller::api_communication_targets::get_member_email_addresses;
use crate::database::controller::members::get_member_by_uuid;
use crate::database::model::event_requests::EventRequest;
use crate::database::model::organisers::Organiser;
use crate::helper::mail_queue::queue::{Mail, MailQueue};
use crate::helper::mail_templates::MailTemplates;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::events::requests::create::RequestData;
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_option_uuid, parse_uuid};
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
#[put("/api/event_requests/<request_id>", format = "json", data = "<create_request_data>")]
pub fn update_event_request(

View File

@ -1,19 +1,18 @@
use crate::database::controller::api_communication_targets::{update_communication_target, get_member_communication_types};
use rocket::serde::json::Json;
use rocket::State;
use crate::database::controller::api_communication_targets::{get_member_communication_types, update_communication_target};
use crate::database::controller::groups::get_groups_for_member;
use crate::database::controller::member_communication::{add_communication_target, get_communication_target, remove_communication_target};
use crate::database::model::member_communication::CommunicationTargetCreate;
use crate::helper::check_access::check_access_to_member_or_group;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_uuid_string};
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
use crate::schema::communication_targets;
use rocket::State;
use rocket::serde::json::Json;
use crate::helper::check_access::check_access_to_member_or_group;
use crate::database::controller::groups::get_groups_for_member;
use crate::database::controller::member_communication::{get_communication_target, add_communication_target, remove_communication_target};
use crate::helper::translate_diesel_error::translate_diesel;
use crate::database::model::member_communication::CommunicationTargetCreate;
#[derive(Serialize, Deserialize, Queryable, Clone, AsChangeset)]
#[table_name = "communication_targets"]
pub struct CommunicationTarget {
@ -58,9 +57,18 @@ pub fn api_communication_targets_create(
let caller = parse_member_cookie(cookie.member)?;
let communication_target = communication_target.into_inner();
let groups = get_groups_for_member(settings, communication_target.entity_id).unwrap().into_iter().map(|m|crate::modules::member_management::model::groups::Group::from(m)).collect();
if !check_access_to_member_or_group(settings, communication_target.entity_id, groups, caller.entity_id, crate::permissions::modules::member_management::profile::communication::EDIT.to_string()){
return Err(Json(ApiError::new(401, "Keine Berechtigung, ein Kommunikationsziel hinzuzufügen.".to_string()).to_wrapper()))
let groups = get_groups_for_member(settings, communication_target.entity_id).unwrap().into_iter().map(|m| crate::modules::member_management::model::groups::Group::from(m)).collect();
if communication_target.entity_id != caller.entity_id { //if Member edits own communication target, do not check permissions
if !check_access_to_member_or_group(settings, communication_target.entity_id, groups, caller.entity_id, crate::permissions::modules::member_management::profile::communication::EDIT.to_string()) {
return Err(Json(
ApiError::new(
403,
"Keine Berechtigung, Kommunikationsziel hinzuzufügen!".to_string(),
)
.to_wrapper(),
));
}
}
match add_communication_target(settings, communication_target) {
@ -156,20 +164,28 @@ pub fn api_communication_targets_delete(
settings: &State<Settings>,
target_id: String,
) -> Result<(), Json<ApiErrorWrapper>> {
let member = parse_member_cookie(cookie.member)?;
let caller = parse_member_cookie(cookie.member)?;
let target_id = parse_uuid_string(target_id)?;
let target = match get_communication_target(settings, target_id){
let target = match get_communication_target(settings, target_id) {
Ok(target) => target,
Err(e) => {
return Err(translate_diesel(e))
}
};
let groups = get_groups_for_member(settings, target.entity_id).unwrap().into_iter().map(|m|crate::modules::member_management::model::groups::Group::from(m)).collect();
let groups = get_groups_for_member(settings, target.entity_id).unwrap().into_iter().map(|m| crate::modules::member_management::model::groups::Group::from(m)).collect();
if !check_access_to_member_or_group(settings, target.entity_id, groups, member.entity_id, crate::permissions::modules::member_management::profile::communication::EDIT.to_string()){
return Err(Json(ApiError::new(401, "Keine Berechtigung Kommunikationseintrag zu löschen!".to_string()).to_wrapper()))
if target.entity_id != caller.entity_id { //if Member edits own communication target, do not check permissions
if !check_access_to_member_or_group(settings, target.entity_id, groups, caller.entity_id, crate::permissions::modules::member_management::profile::communication::EDIT.to_string()) {
return Err(Json(
ApiError::new(
403,
"Keine Berechtigung, Kommunikationsziel zu entfernen!".to_string(),
)
.to_wrapper(),
));
}
}
match remove_communication_target(settings, target_id) {

View File

@ -1,12 +1,12 @@
use rocket::State;
use crate::helper::settings::Settings;
use crate::helper::session_cookies::model::SessionCookie;
use rocket::serde::json::Json;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::parse_member_cookie;
use crate::database::controller::roles::get_permissions_for_role;
use crate::helper::translate_diesel_error::translate_diesel;
use rocket::State;
use crate::database::model::permissions::Permission;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::member_management::controller::parser::parse_member_cookie;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
/// Get all permissions
///

View File

@ -1,16 +1,16 @@
use rocket::State;
use crate::helper::settings::Settings;
use crate::helper::session_cookies::model::SessionCookie;
use rocket::serde::json::Json;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::parse_member_cookie;
use crate::database::controller::roles::{get_permissions_for_role, get_roles, get_members_for_role};
use crate::helper::translate_diesel_error::translate_diesel;
use crate::database::model::permissions::Permission;
use crate::database::controller::permissions::{get_role_permission_id, get_role_permission_context};
use crate::database::model::roles::Role;
use crate::modules::api::members::get_member::MemberSearchResult;
use rocket::State;
use crate::database::controller::permissions::{get_role_permission_context, get_role_permission_id};
use crate::database::controller::roles::{get_members_for_role, get_permissions_for_role, get_roles};
use crate::database::model::api_members::RawMemberSearchResult;
use crate::database::model::permissions::Permission;
use crate::database::model::roles::Role;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::member_management::controller::parser::parse_member_cookie;
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
/// Get all permissions for role
///

View File

@ -1,14 +1,14 @@
use rocket::State;
use crate::helper::settings::Settings;
use crate::helper::session_cookies::model::SessionCookie;
use rocket::serde::json::Json;
use crate::modules::api::model::api_outcome::{ApiErrorWrapper, ApiError};
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_uuid};
use crate::database::controller::roles::{get_permissions_for_role, add_permission_context, remove_permission_context, add_member_to_role, remove_member_from_role, update_role};
use crate::helper::translate_diesel_error::translate_diesel;
use crate::database::model::permissions::Permission;
use crate::database::controller::permissions::{add_permission_to_role, remove_permission_from_role, get_role_permission_id};
use rocket::State;
use crate::database::controller::permissions::{add_permission_to_role, get_role_permission_id, remove_permission_from_role};
use crate::database::controller::roles::{add_member_to_role, add_permission_context, remove_member_from_role, remove_permission_context, update_role};
use crate::database::model::roles::Role;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::translate_diesel_error::translate_diesel;
use crate::modules::api::member_management::controller::parser::{parse_member_cookie, parse_uuid};
use crate::modules::api::model::api_outcome::{ApiError, ApiErrorWrapper};
/// Add permission to role
///
@ -102,15 +102,18 @@ pub fn api_add_context(
return Err(Json(ApiError::new(403, "No permission to edit role permissions".to_string()).to_wrapper()))
}
let rpi = match get_role_permission_id(settings, &permission_id, &role_id){
Ok(rpi) => match rpi{
let rpi = match get_role_permission_id(settings, &permission_id, &role_id) {
Ok(rpi) => match rpi {
Some(rpi) => rpi,
None => {
warn!("Couldn't find role_permission_id");
return Err(Json(ApiError::new(404, "role_permission_id not found.".to_string()).to_wrapper()))
}
},
Err(e) => return Err(Json(ApiError::new(500, "Couldn't get role_permission_id.".to_string()).to_wrapper())),
Err(e) => {
warn!("Couldn't get role_permission_id: {}", e);
return Err(Json(ApiError::new(500, "Couldn't get role_permission_id.".to_string()).to_wrapper()))
},
};
let context_id = parse_uuid(&context_id)?;
@ -148,12 +151,15 @@ pub fn api_remove_context(
return Err(Json(ApiError::new(403, "No permission to edit role permissions".to_string()).to_wrapper()))
}
let rpi = match get_role_permission_id(settings, &permission_id, &role_id){
Ok(rpi) => match rpi{
let rpi = match get_role_permission_id(settings, &permission_id, &role_id) {
Ok(rpi) => match rpi {
Some(rpi) => rpi,
None => return Err(Json(ApiError::new(404, "role_permission_id not found.".to_string()).to_wrapper()))
},
Err(e) => return Err(Json(ApiError::new(500, "Couldn't get role_permission_id.".to_string()).to_wrapper())),
Err(e) => {
warn!("Couldn't get role_permission_id: {}", e);
return Err(Json(ApiError::new(500, "Couldn't get role_permission_id.".to_string()).to_wrapper()))
},
};
let context_id = parse_uuid(&context_id)?;

View File

@ -1,19 +1,20 @@
use rocket::State;
use crate::helper::settings::Settings;
use crate::database::controller::events::get_eu_position;
use crate::modules::api::member_management::controller::parser::parse_uuid_string;
use serde_json::{Value, Map};
use std::fmt;
use crate::database::controller::member_licenses::check_license_for_member;
use crate::database::model::member_licenses::MemberDrivePermission;
use crate::database::controller::member_qualifications::check_qualification_for_member;
pub fn check_position_requirements(settings: &State<Settings>, position_id: uuid::Uuid, member_id: uuid::Uuid) -> Result<bool, RequirementParserError>{
let position = match get_eu_position(settings, position_id){
use rocket::State;
use serde_json::{Map, Value};
use crate::database::controller::events::get_eu_position;
use crate::database::controller::member_licenses::check_license_for_member;
use crate::database::controller::member_qualifications::check_qualification_for_member;
use crate::helper::settings::Settings;
use crate::modules::api::member_management::controller::parser::parse_uuid_string;
pub fn check_position_requirements(settings: &State<Settings>, position_id: uuid::Uuid, member_id: uuid::Uuid) -> Result<bool, RequirementParserError> {
let position = match get_eu_position(settings, position_id) {
Ok(pos) => pos,
Err(e) => return Err(RequirementParserError::from(e))
};
match position.requirements{
match position.requirements {
Some(req) => parse_requirements(req, settings, member_id),
None => Ok(true)
}

View File

@ -1,13 +1,22 @@
use crate::helper::session_cookies::model::SessionCookie;
use rocket::State;
use crate::helper::settings::Settings;
use rocket::http::Status;
use crate::helper::sitebuilder::model::general::{Header, Stylesheet, Footer, Script};
use crate::helper::sitebuilder::model::sidebar::Sidebar;
use crate::modules::event_management::eventlist::EventTemplates;
use rocket::State;
use rocket_dyn_templates::Template;
use crate::helper::session_cookies::model::SessionCookie;
use crate::helper::settings::Settings;
use crate::helper::sitebuilder::model::general::{Footer, Header, Script, Stylesheet};
use crate::helper::sitebuilder::model::sidebar::Sidebar;
use crate::modules::api::member_management::controller::parser::parse_uuid_string;
#[derive(Serialize)]
pub struct EditEvent {
pub header: Header,
pub footer: Footer,
pub sidebar: Sidebar,
pub caller: uuid::Uuid,
pub event_id: uuid::Uuid,
}
#[get("/portal/em/event?<id>")]
pub fn edit_event(cookie: SessionCookie, _settings: &State<Settings>, id: String) -> Result<Template, Status> {
let member = match cookie.member {
@ -42,11 +51,12 @@ pub fn edit_event(cookie: SessionCookie, _settings: &State<Settings>, id: String
let mut sidebar = Sidebar::new(member.clone());
sidebar.event_management.active = true;
let eventlist = EventTemplates {
let eventlist = EditEvent {
header,
footer,
sidebar,
caller: member.entity_id
caller: member.entity_id,
event_id: parse_uuid_string(id).unwrap(), //TODO: do not unwrap
};
Ok(Template::render("module_em_edit_event", eventlist))

View File

@ -1,18 +1,19 @@
use crate::database::controller::users::get_user_by_email;
use crate::database::model::users::User;
use crate::helper::session_cookies::model::SessionCookieStorage;
use crate::modules::welcome::model::login_error_type::LoginError;
use crate::helper::settings::Settings;
use crate::modules::welcome::model::login_form::LoginForm;
use crate::database::controller::login_protection::{add_login_attempt, add_login_attempt_username};
use chrono::{Duration, Utc};
use rocket::http::{Cookie, CookieJar};
use rocket::State;
use crate::database::controller::login_protection::add_login_attempt;
use crate::database::controller::login_protection::login_attempts_exceeded;
use crate::database::controller::users::get_user_by_email;
use crate::database::model::users::User;
use crate::helper::session_cookies::model::SessionCookieStorage;
use crate::helper::settings::Settings;
use crate::modules::welcome::model::login_error_type::LoginError;
use crate::modules::welcome::model::login_form::LoginForm;
pub fn check_login(login_form: LoginForm, settings: &State<Settings>) -> Result<User, LoginError> {
let user: User = match get_user_by_email(login_form.login_email.clone().to_lowercase(), &settings){
Some(user) => match login_attempts_exceeded(settings, login_form.login_email.to_lowercase()){
let user: User = match get_user_by_email(login_form.login_email.clone().to_lowercase(), &settings) {
Some(user) => match login_attempts_exceeded(settings, login_form.login_email.to_lowercase()) {
Ok(result) => {
if result{
return Err(LoginError::MaxLoginAttemptsExceeded)

View File

@ -1,5 +1,5 @@
use crate::helper::sitebuilder::model::alerts::Alert;
use crate::helper::sitebuilder::model::general::{Footer, Header, Script, Stylesheet};
use crate::helper::sitebuilder::model::general::{Footer, Header, Stylesheet};
use crate::modules::welcome::model::welcome_module::WelcomeModule;
pub fn get_context(alert: Option<Alert>) -> WelcomeModule {