Skip to content

Commit cea987d

Browse files
authored
Merge pull request #6 from Libertech-FR/change-password
Change password
2 parents 2b004c6 + ff1dc7d commit cea987d

File tree

4 files changed

+416
-3
lines changed

4 files changed

+416
-3
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
"@quasar/extras": "^1.16.9",
2626
"@vueuse/router": "^10.7.2",
2727
"cookie": "^0.6.0",
28+
"fast-password-entropy": "^1.1.1",
29+
"hibp": "^14.1.2",
2830
"moment": "^2.30.1",
2931
"openapi-fetch": "^0.8.2",
3032
"pinia": "^2.1.7",

src/components/identityForm/actions.vue

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,13 @@ div.flex
1111
label="Activation"
1212
v-model="props.identity.dataStatus"
1313
:true-value="1"
14-
:false-value="0"
14+
:indeterminate-value="-2"
15+
:false-value="-3"
1516
)
17+
q-btn.q-mx-xs( @click="forceChangePassword()" color="orange-8" icon="mdi-lock-reset" :disabled="props.identity.state != IdentityState.SYNCED")
18+
q-tooltip.text-body2(slot="trigger") Obliger l'utilisateur à changer son mot de passe
19+
q-btn.q-mx-xs(@click="resetPasswordModal = true" color="red-8" icon="mdi-account-key" :disabled="props.identity.state != IdentityState.SYNCED")
20+
q-tooltip.text-body2(slot="trigger") Définir le mot de passe
1621
q-btn.q-mx-xs(@click="sendInit" color="primary" icon="mdi-email-arrow-right" :disabled="props.identity.state != IdentityState.SYNCED")
1722
q-tooltip.text-body2(slot="trigger") Envoyer le mail d'invitation
1823
q-btn.q-mx-xs(@click="submit" color="positive" icon="mdi-check" v-show="!isNew" v-if="crud.update")
@@ -24,6 +29,15 @@ div.flex
2429
q-tooltip.text-body2(slot="trigger") Voir les logs de l'identité
2530
q-btn.q-mx-xs(v-if="props.identity?._id" @click="deleteIdentity" color="negative" icon="mdi-delete")
2631
q-tooltip.text-body2(slot="trigger") Supprimer l'identité
32+
q-dialog(v-model="resetPasswordModal" persistent medium)
33+
q-card(style="width:800px")
34+
q-card-section(class="text-h6 bg-primary text-white") definition du mot de passe
35+
q-card-section
36+
input-new-password(v-model="newpassword")
37+
q-card-actions(align="right" class="bg-white text-teal")
38+
q-btn( label="Abandonner" color="negative" @click="resetPasswordModal = false" )
39+
q-btn( label="Sauver" color="positive" @click="doChangePassword" :disabled="newpassword === ''")
40+
2741
</template>
2842

2943
<script lang="ts" setup>
@@ -35,8 +49,11 @@ import { useRouter } from 'vue-router'
3549
import { useFetch } from 'nuxt/app'
3650
import { useIdentityStates } from '~/composables'
3751
import { useErrorHandling } from '#imports'
52+
import InputNewPassword from "~/components/inputNewPassword.vue";
53+
const resetPasswordModal=ref(false)
54+
const forcePasswordModal=ref(false)
3855
39-
56+
const newpassword=ref('')
4057
type IdentityResponse = operations['IdentitiesController_search']['responses']['200']['content']['application/json']
4158
type Identity = components['schemas']['IdentitiesDto']
4259
const activation=ref(true)
@@ -61,6 +78,27 @@ const { handleError } = useErrorHandling()
6178
6279
const emits = defineEmits(['submit', 'sync', 'logs', 'create', 'delete'])
6380
81+
async function doChangePassword(){
82+
const requestOptions={method: 'POST',
83+
body:JSON.stringify({id:props.identity._id,newPassword: newpassword.value})}
84+
try{
85+
const data=await $http.post('/management/identities/forcepassword', requestOptions)
86+
$q.notify({
87+
message: 'Le mot de passe a été changé : ',
88+
color: 'positive',
89+
position: 'top-right',
90+
icon: 'mdi-check-circle-outline',
91+
})
92+
}catch(error){
93+
$q.notify({
94+
message: 'Impossible de modifier le mot de passe : ' + error.response._data.message,
95+
color: 'negative',
96+
position: 'top-right',
97+
icon: 'mdi-alert-circle-outline',
98+
})
99+
}
100+
resetPasswordModal.value = false
101+
}
64102
async function submit() {
65103
// console.log('submit from actions')
66104
emits('submit')
@@ -84,6 +122,43 @@ function showActivate(){
84122
return false
85123
}
86124
}
125+
async function forceChangePassword(){
126+
$q.dialog({
127+
title: 'Confirmation',
128+
message: "Voulez vous forcer le changement de mot de passe ? ",
129+
persistent: true,
130+
ok: {
131+
push: true,
132+
color: 'positive',
133+
label: 'Forcer',
134+
},
135+
cancel: {
136+
push: true,
137+
color: 'negative',
138+
label: 'Annuler',
139+
},
140+
}).onOk(async() => {
141+
const requestOptions={method: 'POST',
142+
body:JSON.stringify({id:props.identity._id})}
143+
try{
144+
const data=await $http.post('/management/identities/needtochangepassword', requestOptions)
145+
$q.notify({
146+
message: 'LE changement de mot de passe est forcé : ',
147+
color: 'positive',
148+
position: 'top-right',
149+
icon: 'mdi-check-circle-outline',
150+
})
151+
}catch(error){
152+
$q.notify({
153+
message: 'Impossible de forcer le changement de mot de passe : ' + error.response._data.message,
154+
color: 'negative',
155+
position: 'top-right',
156+
icon: 'mdi-alert-circle-outline',
157+
})
158+
}
159+
160+
})
161+
}
87162
async function activate(){
88163
89164
@@ -99,7 +174,6 @@ async function activate(){
99174
bouton="Activer"
100175
initialStatus=0
101176
}
102-
debugger
103177
if (showActivate() === false){
104178
props.identity.dataStatus = initialStatus
105179
return

0 commit comments

Comments
 (0)