Remove change password button from sidebar if local auth is disabled
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			This commit is contained in:
		@@ -18,29 +18,29 @@ use crate::utils::string_utils::rand_str;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/clients_list.html")]
 | 
					#[template(path = "settings/clients_list.html")]
 | 
				
			||||||
struct ClientsListTemplate {
 | 
					struct ClientsListTemplate<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    clients: Vec<Client>,
 | 
					    clients: Vec<Client>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/providers_list.html")]
 | 
					#[template(path = "settings/providers_list.html")]
 | 
				
			||||||
struct ProvidersListTemplate {
 | 
					struct ProvidersListTemplate<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    providers: Vec<Provider>,
 | 
					    providers: Vec<Provider>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/users_list.html")]
 | 
					#[template(path = "settings/users_list.html")]
 | 
				
			||||||
struct UsersListTemplate {
 | 
					struct UsersListTemplate<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    users: Vec<User>,
 | 
					    users: Vec<User>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/edit_user.html")]
 | 
					#[template(path = "settings/edit_user.html")]
 | 
				
			||||||
struct EditUserTemplate {
 | 
					struct EditUserTemplate<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    u: User,
 | 
					    u: User,
 | 
				
			||||||
    clients: Vec<Client>,
 | 
					    clients: Vec<Client>,
 | 
				
			||||||
    providers: Vec<Provider>,
 | 
					    providers: Vec<Provider>,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -12,31 +12,29 @@ use crate::data::current_user::CurrentUser;
 | 
				
			|||||||
use crate::data::remote_ip::RemoteIP;
 | 
					use crate::data::remote_ip::RemoteIP;
 | 
				
			||||||
use crate::data::user::User;
 | 
					use crate::data::user::User;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub(crate) struct BaseSettingsPage {
 | 
					pub(crate) struct BaseSettingsPage<'a> {
 | 
				
			||||||
    pub danger_message: Option<String>,
 | 
					    pub danger_message: Option<String>,
 | 
				
			||||||
    pub success_message: Option<String>,
 | 
					    pub success_message: Option<String>,
 | 
				
			||||||
    pub page_title: &'static str,
 | 
					    pub page_title: &'static str,
 | 
				
			||||||
    pub app_name: &'static str,
 | 
					    pub app_name: &'static str,
 | 
				
			||||||
    pub is_admin: bool,
 | 
					    pub user: &'a User,
 | 
				
			||||||
    pub user_name: String,
 | 
					 | 
				
			||||||
    pub version: &'static str,
 | 
					    pub version: &'static str,
 | 
				
			||||||
    pub ip_location_api: Option<&'static str>,
 | 
					    pub ip_location_api: Option<&'static str>,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
impl BaseSettingsPage {
 | 
					impl<'a> BaseSettingsPage<'a> {
 | 
				
			||||||
    pub fn get(
 | 
					    pub fn get(
 | 
				
			||||||
        page_title: &'static str,
 | 
					        page_title: &'static str,
 | 
				
			||||||
        user: &User,
 | 
					        user: &'a User,
 | 
				
			||||||
        danger_message: Option<String>,
 | 
					        danger_message: Option<String>,
 | 
				
			||||||
        success_message: Option<String>,
 | 
					        success_message: Option<String>,
 | 
				
			||||||
    ) -> BaseSettingsPage {
 | 
					    ) -> BaseSettingsPage<'a> {
 | 
				
			||||||
        Self {
 | 
					        Self {
 | 
				
			||||||
            danger_message,
 | 
					            danger_message,
 | 
				
			||||||
            success_message,
 | 
					            success_message,
 | 
				
			||||||
            page_title,
 | 
					            page_title,
 | 
				
			||||||
            app_name: APP_NAME,
 | 
					            app_name: APP_NAME,
 | 
				
			||||||
            is_admin: user.admin,
 | 
					            user,
 | 
				
			||||||
            user_name: user.username.to_string(),
 | 
					 | 
				
			||||||
            version: env!("CARGO_PKG_VERSION"),
 | 
					            version: env!("CARGO_PKG_VERSION"),
 | 
				
			||||||
            ip_location_api: AppConfig::get().ip_location_service.as_deref(),
 | 
					            ip_location_api: AppConfig::get().ip_location_service.as_deref(),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
@@ -45,15 +43,14 @@ impl BaseSettingsPage {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/account_details.html")]
 | 
					#[template(path = "settings/account_details.html")]
 | 
				
			||||||
struct AccountDetailsPage {
 | 
					struct AccountDetailsPage<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    u: User,
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/change_password.html")]
 | 
					#[template(path = "settings/change_password.html")]
 | 
				
			||||||
struct ChangePasswordPage {
 | 
					struct ChangePasswordPage<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    min_pwd_len: usize,
 | 
					    min_pwd_len: usize,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -63,7 +60,6 @@ pub async fn account_settings_details_route(user: CurrentUser) -> impl Responder
 | 
				
			|||||||
    HttpResponse::Ok().body(
 | 
					    HttpResponse::Ok().body(
 | 
				
			||||||
        AccountDetailsPage {
 | 
					        AccountDetailsPage {
 | 
				
			||||||
            _p: BaseSettingsPage::get("Account details", &user, None, None),
 | 
					            _p: BaseSettingsPage::get("Account details", &user, None, None),
 | 
				
			||||||
            u: user,
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        .render()
 | 
					        .render()
 | 
				
			||||||
        .unwrap(),
 | 
					        .unwrap(),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,14 +17,14 @@ use crate::data::webauthn_manager::WebAuthManagerReq;
 | 
				
			|||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/two_factors_page.html")]
 | 
					#[template(path = "settings/two_factors_page.html")]
 | 
				
			||||||
struct TwoFactorsPage<'a> {
 | 
					struct TwoFactorsPage<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    user: &'a User,
 | 
					    user: &'a User,
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/add_2fa_totp_page.html")]
 | 
					#[template(path = "settings/add_2fa_totp_page.html")]
 | 
				
			||||||
struct AddTotpPage {
 | 
					struct AddTotpPage<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    qr_code: String,
 | 
					    qr_code: String,
 | 
				
			||||||
    account_name: String,
 | 
					    account_name: String,
 | 
				
			||||||
    secret_key: String,
 | 
					    secret_key: String,
 | 
				
			||||||
@@ -33,8 +33,8 @@ struct AddTotpPage {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#[derive(Template)]
 | 
					#[derive(Template)]
 | 
				
			||||||
#[template(path = "settings/add_webauthn_page.html")]
 | 
					#[template(path = "settings/add_webauthn_page.html")]
 | 
				
			||||||
struct AddWebauhtnPage {
 | 
					struct AddWebauhtnPage<'a> {
 | 
				
			||||||
    _p: BaseSettingsPage,
 | 
					    _p: BaseSettingsPage<'a>,
 | 
				
			||||||
    opaque_state: String,
 | 
					    opaque_state: String,
 | 
				
			||||||
    challenge_json: String,
 | 
					    challenge_json: String,
 | 
				
			||||||
    max_name_len: usize,
 | 
					    max_name_len: usize,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,27 +5,27 @@
 | 
				
			|||||||
    <tbody>
 | 
					    <tbody>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th scope="row">User ID</th>
 | 
					        <th scope="row">User ID</th>
 | 
				
			||||||
        <td>{{ u.uid.0 }}</td>
 | 
					        <td>{{ _p.user.uid.0 }}</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th scope="row">First name</th>
 | 
					        <th scope="row">First name</th>
 | 
				
			||||||
        <td>{{ u.first_name }}</td>
 | 
					        <td>{{ _p.user.first_name }}</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th scope="row">Last name</th>
 | 
					        <th scope="row">Last name</th>
 | 
				
			||||||
        <td>{{ u.last_name }}</td>
 | 
					        <td>{{ _p.user.last_name }}</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th scope="row">Username</th>
 | 
					        <th scope="row">Username</th>
 | 
				
			||||||
        <td>{{ u.username }}</td>
 | 
					        <td>{{ _p.user.username }}</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th scope="row">Email</th>
 | 
					        <th scope="row">Email</th>
 | 
				
			||||||
        <td>{{ u.email }}</td>
 | 
					        <td>{{ _p.user.email }}</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <th scope="row">Account type</th>
 | 
					        <th scope="row">Account type</th>
 | 
				
			||||||
        <td>{% if u.admin %}Admin{% else %}Regular user{% endif %}</td>
 | 
					        <td>{% if _p.user.admin %}Admin{% else %}Regular user{% endif %}</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    </tbody>
 | 
					    </tbody>
 | 
				
			||||||
</table>
 | 
					</table>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@
 | 
				
			|||||||
    <a href="/" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto link-dark text-decoration-none">
 | 
					    <a href="/" class="d-flex align-items-center mb-3 mb-md-0 me-md-auto link-dark text-decoration-none">
 | 
				
			||||||
        <span class="fs-4">{{ _p.app_name }}</span>
 | 
					        <span class="fs-4">{{ _p.app_name }}</span>
 | 
				
			||||||
    </a>
 | 
					    </a>
 | 
				
			||||||
    {% if _p.is_admin %}
 | 
					    {% if _p.user.admin %}
 | 
				
			||||||
    <span>Version {{ _p.version }}</span>
 | 
					    <span>Version {{ _p.version }}</span>
 | 
				
			||||||
    {% endif %}
 | 
					    {% endif %}
 | 
				
			||||||
    <hr>
 | 
					    <hr>
 | 
				
			||||||
@@ -24,18 +24,20 @@
 | 
				
			|||||||
                Account details
 | 
					                Account details
 | 
				
			||||||
            </a>
 | 
					            </a>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
 | 
					        {% if _p.user.allow_local_login %}
 | 
				
			||||||
        <li>
 | 
					        <li>
 | 
				
			||||||
            <a href="/settings/change_password" class="nav-link link-dark">
 | 
					            <a href="/settings/change_password" class="nav-link link-dark">
 | 
				
			||||||
                Change password
 | 
					                Change password
 | 
				
			||||||
            </a>
 | 
					            </a>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
 | 
					        {% endif %}
 | 
				
			||||||
        <li>
 | 
					        <li>
 | 
				
			||||||
            <a href="/settings/two_factors" class="nav-link link-dark">
 | 
					            <a href="/settings/two_factors" class="nav-link link-dark">
 | 
				
			||||||
                Two-factor authentication
 | 
					                Two-factor authentication
 | 
				
			||||||
            </a>
 | 
					            </a>
 | 
				
			||||||
        </li>
 | 
					        </li>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        {% if _p.is_admin %}
 | 
					        {% if _p.user.admin %}
 | 
				
			||||||
        <hr/>
 | 
					        <hr/>
 | 
				
			||||||
        <li>
 | 
					        <li>
 | 
				
			||||||
            <a href="/admin/clients" class="nav-link link-dark">
 | 
					            <a href="/admin/clients" class="nav-link link-dark">
 | 
				
			||||||
@@ -59,7 +61,7 @@
 | 
				
			|||||||
        <a href="#" class="d-flex align-items-center link-dark text-decoration-none dropdown-toggle" id="dropdownUser"
 | 
					        <a href="#" class="d-flex align-items-center link-dark text-decoration-none dropdown-toggle" id="dropdownUser"
 | 
				
			||||||
           data-bs-toggle="dropdown" aria-expanded="false">
 | 
					           data-bs-toggle="dropdown" aria-expanded="false">
 | 
				
			||||||
            <img src="/assets/img/account.png" alt="" width="32" height="32" class="rounded-circle me-2">
 | 
					            <img src="/assets/img/account.png" alt="" width="32" height="32" class="rounded-circle me-2">
 | 
				
			||||||
            <strong>{{ _p.user_name }}</strong>
 | 
					            <strong>{{ _p.user.username }}</strong>
 | 
				
			||||||
        </a>
 | 
					        </a>
 | 
				
			||||||
        <ul class="dropdown-menu text-small shadow" aria-labelledby="dropdownUser">
 | 
					        <ul class="dropdown-menu text-small shadow" aria-labelledby="dropdownUser">
 | 
				
			||||||
            <li><a class="dropdown-item" href="/logout">Sign out</a></li>
 | 
					            <li><a class="dropdown-item" href="/logout">Sign out</a></li>
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user