From dea1878efe1c97e7e9048f71c15d065c59f602f9 Mon Sep 17 00:00:00 2001 From: David Ormsbee Date: Tue, 10 Sep 2013 14:17:58 -0400 Subject: [PATCH] Require that permission be given for Flash camera before we process snapshots. --- lms/static/js/verify_student/CameraCapture.as | 25 +++++++++++++++++- .../js/verify_student/CameraCapture.swf | Bin 2272 -> 2438 bytes lms/static/js/verify_student/photocapture.js | 9 +++++-- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/lms/static/js/verify_student/CameraCapture.as b/lms/static/js/verify_student/CameraCapture.as index 0f5d5acae1..a3f68863c6 100644 --- a/lms/static/js/verify_student/CameraCapture.as +++ b/lms/static/js/verify_student/CameraCapture.as @@ -18,11 +18,13 @@ package import flash.display.PNGEncoderOptions; import flash.display.Sprite; import flash.events.Event; + import flash.events.StatusEvent; import flash.external.ExternalInterface; import flash.geom.Rectangle; import flash.media.Camera; import flash.media.Video; import flash.utils.ByteArray; + import mx.utils.Base64Encoder; [SWF(width="640", height="480")] @@ -35,15 +37,17 @@ package private var camera:Camera; private var video:Video; private var b64EncodedImage:String = null; + private var permissionGiven:Boolean = false; public function CameraCapture() { - addEventListener(Event.ADDED_TO_STAGE, init); + addEventListener(Event.ADDED_TO_STAGE, init); } protected function init(e:Event):void { camera = Camera.getCamera(); camera.setMode(VIDEO_WIDTH, VIDEO_HEIGHT, 30); + camera.addEventListener(StatusEvent.STATUS, statusHandler); video = new Video(VIDEO_WIDTH, VIDEO_HEIGHT); video.attachCamera(camera); @@ -53,6 +57,7 @@ package ExternalInterface.addCallback("snap", snap); ExternalInterface.addCallback("reset", reset); ExternalInterface.addCallback("imageDataUrl", imageDataUrl); + ExternalInterface.addCallback("cameraAuthorized", cameraAuthorized); // Notify the container that the SWF is ready to be called. ExternalInterface.call("setSWFIsReady"); @@ -98,6 +103,24 @@ package } return ""; } + + public function cameraAuthorized():Boolean { + return permissionGiven; + } + + public function statusHandler(event:StatusEvent):void { + switch (event.code) + { + case "Camera.Muted": + // User clicked Deny. + permissionGiven = false; + break; + case "Camera.Unmuted": + // "User clicked Accept. + permissionGiven = true; + break; + } + } } } diff --git a/lms/static/js/verify_student/CameraCapture.swf b/lms/static/js/verify_student/CameraCapture.swf index d35e25fc26b15447ab997489a1ddcacf38d884d3..47f87c9493a6f8fd4f9f0f4ea8f81534b40a370a 100644 GIT binary patch delta 2166 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 diff --git a/lms/static/js/verify_student/photocapture.js b/lms/static/js/verify_student/photocapture.js index ee8e2426e5..5c16294177 100644 --- a/lms/static/js/verify_student/photocapture.js +++ b/lms/static/js/verify_student/photocapture.js @@ -124,7 +124,12 @@ function initSnapshotHandler(names, hasHtml5CameraSupport) { video[0].pause(); } else { - image[0].src = flashCapture[0].snap(); + if (flashCapture[0].cameraAuthorized()) { + image[0].src = flashCapture[0].snap(); + } + else { + return false; + } } doSnapshotButton(captureButton, resetButton, approveButton); @@ -186,7 +191,7 @@ function initSnapshotHandler(names, hasHtml5CameraSupport) { function objectTagForFlashCamera(name) { return '';