use of org.activityinfo.model.type.attachment.AttachmentType in project activityinfo by bedatadriven.
the class FormFieldWidgetFactory method createWidget.
public Promise<? extends FormFieldWidget> createWidget(FormClass formClass, FormField field, FieldUpdater valueUpdater) {
FieldType type = field.getType();
if (type instanceof QuantityType) {
return Promise.resolved(new QuantityFieldWidget((QuantityType) type, valueUpdater));
} else if (type instanceof SerialNumberType) {
return Promise.resolved(new SerialNumberFieldWidget((SerialNumberType) type));
} else if (type instanceof NarrativeType) {
return Promise.resolved(new NarrativeFieldWidget(valueUpdater));
} else if (type instanceof TextType) {
return Promise.resolved(new TextFieldWidget((TextType) type, valueUpdater));
} else if (type instanceof CalculatedFieldType) {
return Promise.resolved(new CalculatedFieldWidget(valueUpdater));
} else if (type instanceof LocalDateType) {
return Promise.resolved(new DateFieldWidget(valueUpdater));
} else if (type instanceof LocalDateIntervalType) {
return Promise.resolved(new DateIntervalFieldWidget(valueUpdater));
} else if (type instanceof GeoPointType) {
return Promise.resolved(new GeographicPointWidget(valueUpdater));
} else if (type instanceof EnumType) {
return Promise.resolved(new EnumFieldWidget((EnumType) field.getType(), valueUpdater, fieldWidgetMode));
} else if (type instanceof BooleanType) {
return Promise.resolved(new BooleanFieldWidget(valueUpdater));
} else if (type instanceof AttachmentType) {
AttachmentType attachmentType = (AttachmentType) type;
if (attachmentType.getKind() == AttachmentType.Kind.IMAGE) {
return Promise.resolved(new ImageUploadFieldWidget(formClass.getId(), valueUpdater, fieldWidgetMode));
} else {
return Promise.resolved(new AttachmentUploadFieldWidget(formClass.getId(), valueUpdater, fieldWidgetMode));
}
} else if (type instanceof ReferenceType) {
return createReferenceWidget(field, valueUpdater);
} else if (type instanceof BarcodeType) {
return Promise.resolved(new BarcodeFieldWidget(valueUpdater));
}
Log.error("Unexpected field type " + type.getTypeClass());
throw new UnsupportedOperationException();
}
use of org.activityinfo.model.type.attachment.AttachmentType in project activityinfo by bedatadriven.
the class AttachmentFieldTemplate method create.
@Override
public FormField create() {
AttachmentType type = (AttachmentType) AttachmentType.TYPE_CLASS.createType();
type.setKind(kind);
FormField formField = new FormField(CuidAdapter.indicatorField(new KeyGenerator().generateInt()));
formField.setType(type);
formField.setLabel(label);
return formField;
}
use of org.activityinfo.model.type.attachment.AttachmentType in project activityinfo by bedatadriven.
the class Updater method checkBlobPermissions.
/**
* Verifies that the user has permission to associate the given blob with this record.
*
* <p>Updating blob-valued fields is done by the user in two steps. First, the user uploads a file and
* receives a unique id for the blob. Then, the user updates a record's field with the blob's unique id. </p>
*
* <p>Once the blob is associated with the record, then any user with permission to view the record is extended
* permission to view the blob. This opens an avenue of attack where by an attacker with seeks to obtain access
* to a blob with some id by assigning it to an unrelated record to which they have access.</p>
*
* <p>For this reason, only users who originally uploaded the blob may assign the blob to a record's field value.</p>
*/
private void checkBlobPermissions(FormField field, Optional<FormRecord> existingResource, AttachmentValue updatedValue) {
AttachmentType fieldType = (AttachmentType) field.getType();
// Identity the blob ids that are already associated with this record
Set<String> existingBlobIds = new HashSet<>();
if (existingResource.isPresent()) {
JsonValue existingFieldValue = existingResource.get().getFields().get(field.getId().asString());
if (!existingFieldValue.isJsonNull()) {
AttachmentValue existingValue = fieldType.parseJsonValue(existingFieldValue);
for (Attachment attachment : existingValue.getValues()) {
existingBlobIds.add(attachment.getBlobId());
}
}
}
// Assert that the user owns the blob they are associating with the record
for (Attachment attachment : updatedValue.getValues()) {
if (!existingBlobIds.contains(attachment.getBlobId())) {
if (!blobAuthorizer.isOwner(userId, attachment.getBlobId())) {
throw new InvalidUpdateException(String.format("User %d does not own blob %s", userId, attachment.getBlobId()));
}
}
}
}
Aggregations