Created PUT API and added edit support
This commit is contained in:
parent
658c0b091c
commit
8210f4957e
@ -13,13 +13,19 @@ import ListSecrets from "./components/ListSecrets.vue";
|
|||||||
Create
|
Create
|
||||||
</el-button>
|
</el-button>
|
||||||
<el-button type="warning" class="ml-2" @click="logout">Logout</el-button>
|
<el-button type="warning" class="ml-2" @click="logout">Logout</el-button>
|
||||||
|
<el-button type="error" @click="refresh">Refresh</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="timer" :style="{ width: timerWidth + '%' }"></div>
|
||||||
|
|
||||||
<el-dialog v-model="creationDialog" title="Add a new TOTP secret" width="80vw">
|
<el-dialog v-model="creationDialog" title="Add a new TOTP secret" width="80vw">
|
||||||
<CreateSecret @close="creationDialog = false" />
|
<CreateSecret @close="creationDialog = false" />
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
<el-dialog v-model="editDialog" title="Edit TOTP secret" width="80vw">
|
||||||
|
<CreateSecret :editSecret="editingSecret" @close="editDialog = false" />
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<HomePage
|
<HomePage
|
||||||
msg="You did it!"
|
msg="You did it!"
|
||||||
@ -33,7 +39,7 @@ import ListSecrets from "./components/ListSecrets.vue";
|
|||||||
<el-button @click="showSecrets = false" v-if="showSecrets && loggedin">
|
<el-button @click="showSecrets = false" v-if="showSecrets && loggedin">
|
||||||
Hide secrets
|
Hide secrets
|
||||||
</el-button> -->
|
</el-button> -->
|
||||||
<ListSecrets :key="listUpdated" v-if="showSecrets && loggedin" />
|
<ListSecrets :key="listUpdated" v-if="showSecrets && loggedin" @edit="editSecret" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -47,6 +53,9 @@ export default {
|
|||||||
creationDialog: false,
|
creationDialog: false,
|
||||||
listUpdated: 1,
|
listUpdated: 1,
|
||||||
apiBaseUrl: "http://localhost:8000",
|
apiBaseUrl: "http://localhost:8000",
|
||||||
|
editDialog: false,
|
||||||
|
editingSecret: {},
|
||||||
|
timerWidth: 100,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -91,6 +100,29 @@ export default {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
editSecret(secret) {
|
||||||
|
this.editingSecret = secret;
|
||||||
|
// console.log(this.editingSecret);
|
||||||
|
this.editDialog = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
refresh() {
|
||||||
|
this.listUpdated += 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
startTimer() {
|
||||||
|
this.interval = setInterval(() => {
|
||||||
|
const now = new Date();
|
||||||
|
const seconds = now.getSeconds();
|
||||||
|
const remainingTime = (seconds > 30 ? 60 : 30) - seconds;
|
||||||
|
// console.log(remainingTime);
|
||||||
|
this.timerWidth = (remainingTime / 30) * 100;
|
||||||
|
if (remainingTime === 30) {
|
||||||
|
this.refresh();
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
async mounted() {
|
async mounted() {
|
||||||
@ -101,6 +133,7 @@ export default {
|
|||||||
this.loggedin = true;
|
this.loggedin = true;
|
||||||
this.showSecrets = true;
|
this.showSecrets = true;
|
||||||
}
|
}
|
||||||
|
this.startTimer();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@ -118,7 +151,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
margin-top: 2rem;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.logoutBtn {
|
.logoutBtn {
|
||||||
@ -147,4 +180,10 @@ export default {
|
|||||||
font-size: 1.3rem;
|
font-size: 1.3rem;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.timer {
|
||||||
|
margin-top: 1.2rem;
|
||||||
|
height: 0.3rem;
|
||||||
|
background-color: green;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
40
main.py
40
main.py
@ -123,9 +123,7 @@ async def login(user: UserLogin):
|
|||||||
@app.post("/secret")
|
@app.post("/secret")
|
||||||
async def create_secret(secret: Secret, current_user: dict = Depends(get_current_user)):
|
async def create_secret(secret: Secret, current_user: dict = Depends(get_current_user)):
|
||||||
"""
|
"""
|
||||||
Stores and encrypted secret for the user.
|
Stores an encrypted secret for the user.
|
||||||
|
|
||||||
The encrypted secret is unreadable on the server and is encrypted on the front-end
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
data = []
|
data = []
|
||||||
@ -148,6 +146,40 @@ async def create_secret(secret: Secret, current_user: dict = Depends(get_current
|
|||||||
return secret
|
return secret
|
||||||
|
|
||||||
|
|
||||||
|
@app.put("/secret")
|
||||||
|
async def update_secret(secret: Secret, current_user: dict = Depends(get_current_user)):
|
||||||
|
"""
|
||||||
|
Updates an encrypted secret for the user.
|
||||||
|
"""
|
||||||
|
|
||||||
|
data = []
|
||||||
|
with open('database/secrets.json', 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
if text:
|
||||||
|
data.extend(json.loads(text))
|
||||||
|
|
||||||
|
if secret.id is None:
|
||||||
|
raise HTTPException(status.HTTP_400_BAD_REQUEST, detail="Id must be passed for updating secret")
|
||||||
|
|
||||||
|
secret.user_id = current_user['id']
|
||||||
|
|
||||||
|
found_secrets = [(i, j) for i, j in enumerate(data) if j['user_id'] == secret.user_id and j['id']==secret.id]
|
||||||
|
if not found_secrets:
|
||||||
|
raise HTTPException(status.HTTP_400_BAD_REQUEST, deatil="Secret with this Id not found for this user")
|
||||||
|
|
||||||
|
secret_pos = found_secrets[0][0]
|
||||||
|
|
||||||
|
encryption_key = current_user['encryption_key'].encode()
|
||||||
|
encrypted_data = fernet_encrypt(secret.data.encode(), encryption_key)
|
||||||
|
|
||||||
|
secret.data = encrypted_data.decode('utf-8')
|
||||||
|
data[secret_pos] = jsonable_encoder(secret)
|
||||||
|
|
||||||
|
with open('database/secrets.json', 'w') as f:
|
||||||
|
json.dump(data, f)
|
||||||
|
return secret
|
||||||
|
|
||||||
|
|
||||||
@app.get('/secret')
|
@app.get('/secret')
|
||||||
async def list_secret(current_user: dict = Depends(get_current_user)):
|
async def list_secret(current_user: dict = Depends(get_current_user)):
|
||||||
"""Returns the encrypted secrets of the user."""
|
"""Returns the encrypted secrets of the user."""
|
||||||
@ -161,7 +193,7 @@ async def list_secret(current_user: dict = Depends(get_current_user)):
|
|||||||
user_id = current_user['id']
|
user_id = current_user['id']
|
||||||
encryption_key = current_user['encryption_key'].encode()
|
encryption_key = current_user['encryption_key'].encode()
|
||||||
|
|
||||||
user_secrets = [i for i in data if i['user_id']==user_id]
|
user_secrets = [i for i in data if i['user_id']==user_id and i['active']]
|
||||||
for secret in user_secrets:
|
for secret in user_secrets:
|
||||||
cur_data = secret['data']
|
cur_data = secret['data']
|
||||||
decrypted_data = fernet_decrypt(cur_data, encryption_key)
|
decrypted_data = fernet_decrypt(cur_data, encryption_key)
|
||||||
|
Loading…
Reference in New Issue
Block a user