mirror of
https://github.com/discourse/discourse.git
synced 2025-03-01 08:53:10 +08:00

Currently, if creating an API key in "granular" mode, and not selecting any scopes, a globally scoped API key is created. This can be surprising and is not ideal. Having a key with no scopes isn't useful in the first place, so this PR adds client- and server side validations to check that at least one scope is selected if using "granular" mode.
73 lines
1.6 KiB
JavaScript
73 lines
1.6 KiB
JavaScript
import { computed } from "@ember/object";
|
|
import { ajax } from "discourse/lib/ajax";
|
|
import { fmt } from "discourse/lib/computed";
|
|
import discourseComputed from "discourse/lib/decorators";
|
|
import RestModel from "discourse/models/rest";
|
|
import AdminUser from "admin/models/admin-user";
|
|
|
|
export default class ApiKey extends RestModel {
|
|
@fmt("truncated_key", "%@ ...") truncatedKey;
|
|
|
|
@computed("_user")
|
|
get user() {
|
|
return this._user;
|
|
}
|
|
|
|
set user(value) {
|
|
if (value && !(value instanceof AdminUser)) {
|
|
this.set("_user", AdminUser.create(value));
|
|
} else {
|
|
this.set("_user", value);
|
|
}
|
|
}
|
|
|
|
@computed("_created_by")
|
|
get createdBy() {
|
|
return this._created_by;
|
|
}
|
|
|
|
set created_by(value) {
|
|
if (value && !(value instanceof AdminUser)) {
|
|
this.set("_created_by", AdminUser.create(value));
|
|
} else {
|
|
this.set("_created_by", value);
|
|
}
|
|
}
|
|
|
|
@discourseComputed("description")
|
|
shortDescription(description) {
|
|
if (!description || description.length < 40) {
|
|
return description;
|
|
}
|
|
return `${description.substring(0, 40)}...`;
|
|
}
|
|
|
|
revoke() {
|
|
return ajax(`${this.basePath}/revoke`, {
|
|
type: "POST",
|
|
}).then((result) => this.setProperties(result.api_key));
|
|
}
|
|
|
|
undoRevoke() {
|
|
return ajax(`${this.basePath}/undo-revoke`, {
|
|
type: "POST",
|
|
}).then((result) => this.setProperties(result.api_key));
|
|
}
|
|
|
|
createProperties() {
|
|
return this.getProperties(
|
|
"description",
|
|
"username",
|
|
"scopes",
|
|
"scope_mode"
|
|
);
|
|
}
|
|
|
|
@discourseComputed()
|
|
basePath() {
|
|
return this.store
|
|
.adapterFor("api-key")
|
|
.pathFor(this.store, "api-key", this.id);
|
|
}
|
|
}
|