Found 2,254 repositories(showing 30)
fsprojects
A prototypical .NET solution (file system layout and tooling), recommended for F# projects
pcooksey
BibTeX-js can parse a BibTeX-file and render it as part of an HTML file. This way, you can easily add a list of publications to your private homepage or display a list of recommended publications for a seminar. The way the entries are display can be customized using a simple template system and CSS.
chrisneagu
NOTICE This repository contains the public FTC SDK for the SKYSTONE (2019-2020) competition season. If you are looking for the current season's FTC SDK software, please visit the new and permanent home of the public FTC SDK: FtcRobotController repository Welcome! This GitHub repository contains the source code that is used to build an Android app to control a FIRST Tech Challenge competition robot. To use this SDK, download/clone the entire project to your local computer. Getting Started If you are new to robotics or new to the FIRST Tech Challenge, then you should consider reviewing the FTC Blocks Tutorial to get familiar with how to use the control system: FTC Blocks Online Tutorial Even if you are an advanced Java programmer, it is helpful to start with the FTC Blocks tutorial, and then migrate to the OnBot Java Tool or to Android Studio afterwards. Downloading the Project If you are an Android Studio programmer, there are several ways to download this repo. Note that if you use the Blocks or OnBot Java Tool to program your robot, then you do not need to download this repository. If you are a git user, you can clone the most current version of the repository: git clone https://github.com/FIRST-Tech-Challenge/SKYSTONE.git Or, if you prefer, you can use the "Download Zip" button available through the main repository page. Downloading the project as a .ZIP file will keep the size of the download manageable. You can also download the project folder (as a .zip or .tar.gz archive file) from the Downloads subsection of the Releases page for this repository. Once you have downloaded and uncompressed (if needed) your folder, you can use Android Studio to import the folder ("Import project (Eclipse ADT, Gradle, etc.)"). Getting Help User Documentation and Tutorials FIRST maintains online documentation with information and tutorials on how to use the FIRST Tech Challenge software and robot control system. You can access this documentation using the following link: SKYSTONE Online Documentation Note that the online documentation is an "evergreen" document that is constantly being updated and edited. It contains the most current information about the FIRST Tech Challenge software and control system. Javadoc Reference Material The Javadoc reference documentation for the FTC SDK is now available online. Click on the following link to view the FTC SDK Javadoc documentation as a live website: FTC Javadoc Documentation Documentation for the FTC SDK is also included with this repository. There is a subfolder called "doc" which contains several subfolders: The folder "apk" contains the .apk files for the FTC Driver Station and FTC Robot Controller apps. The folder "javadoc" contains the JavaDoc user documentation for the FTC SDK. Online User Forum For technical questions regarding the Control System or the FTC SDK, please visit the FTC Technology forum: FTC Technology Forum Release Information Version 5.5 (20200824-090813) Version 5.5 requires Android Studio 4.0 or later. New features Adds support for calling custom Java classes from Blocks OpModes (fixes SkyStone issue #161). Classes must be in the org.firstinspires.ftc.teamcode package. Methods must be public static and have no more than 21 parameters. Parameters declared as OpMode, LinearOpMode, Telemetry, and HardwareMap are supported and the argument is provided automatically, regardless of the order of the parameters. On the block, the sockets for those parameters are automatically filled in. Parameters declared as char or java.lang.Character will accept any block that returns text and will only use the first character in the text. Parameters declared as boolean or java.lang.Boolean will accept any block that returns boolean. Parameters declared as byte, java.lang.Byte, short, java.lang.Short, int, java.lang.Integer, long, or java.lang.Long, will accept any block that returns a number and will round that value to the nearest whole number. Parameters declared as float, java.lang.Float, double, java.lang.Double will accept any block that returns a number. Adds telemetry API method for setting display format Classic Monospace HTML (certain tags only) Adds blocks support for switching cameras. Adds Blocks support for TensorFlow Object Detection with a custom model. Adds support for uploading a custom TensorFlow Object Detection model in the Manage page, which is especially useful for Blocks and OnBotJava users. Shows new Control Hub blink codes when the WiFi band is switched using the Control Hub's button (only possible on Control Hub OS 1.1.2) Adds new warnings which can be disabled in the Advanced RC Settings Mismatched app versions warning Unnecessary 2.4 GHz WiFi usage warning REV Hub is running outdated firmware (older than version 1.8.2) Adds support for Sony PS4 gamepad, and reworks how gamepads work on the Driver Station Removes preference which sets gamepad type based on driver position. Replaced with menu which allows specifying type for gamepads with unknown VID and PID Attempts to auto-detect gamepad type based on USB VID and PID If gamepad VID and PID is not known, use type specified by user for that VID and PID If gamepad VID and PID is not known AND the user has not specified a type for that VID and PID, an educated guess is made about how to map the gamepad Driver Station will now attempt to automatically recover from a gamepad disconnecting, and re-assign it to the position it was assigned to when it dropped If only one gamepad is assigned and it drops: it can be recovered If two gamepads are assigned, and have different VID/PID signatures, and only one drops: it will be recovered If two gamepads are assigned, and have different VID/PID signatures, and BOTH drop: both will be recovered If two gamepads are assigned, and have the same VID/PID signatures, and only one drops: it will be recovered If two gamepads are assigned, and have the same VID/PID signatures, and BOTH drop: neither will be recovered, because of the ambiguity of the gamepads when they re-appear on the USB bus. There is currently one known edge case: if there are two gamepads with the same VID/PID signature plugged in, but only one is assigned, and they BOTH drop, it's a 50-50 chance of which one will be chosen for automatic recovery to the assigned position: it is determined by whichever one is re-enumerated first by the USB bus controller. Adds landscape user interface to Driver Station New feature: practice timer with audio cues New feature (Control Hub only): wireless network connection strength indicator (0-5 bars) New feature (Control Hub only): tapping on the ping/channel display will switch to an alternate display showing radio RX dBm and link speed (tap again to switch back) The layout will NOT autorotate. You can switch the layout from the Driver Station's settings menu. Breaking changes Removes support for Android versions 4.4 through 5.1 (KitKat and Lollipop). The minSdkVersion is now 23. Removes the deprecated LinearOpMode methods waitOneFullHardwareCycle() and waitForNextHardwareCycle() Enhancements Handles RS485 address of Control Hub automatically The Control Hub is automatically given a reserved address Existing configuration files will continue to work All addresses in the range of 1-10 are still available for Expansion Hubs The Control Hub light will now normally be solid green, without blinking to indicate the address The Control Hub will not be shown on the Expansion Hub Address Change settings page Improves REV Hub firmware updater The user can now choose between all available firmware update files Version 1.8.2 of the REV Hub firmware is bundled into the Robot Controller app. Text was added to clarify that Expansion Hubs can only be updated via USB. Firmware update speed was reduced to improve reliability Allows REV Hub firmware to be updated directly from the Manage webpage Improves log viewer on Robot Controller Horizontal scrolling support (no longer word wrapped) Supports pinch-to-zoom Uses a monospaced font Error messages are highlighted New color scheme Attempts to force-stop a runaway/stuck OpMode without restarting the entire app Not all types of runaway conditions are stoppable, but if the user code attempts to talk to hardware during the runaway, the system should be able to capture it. Makes various tweaks to the Self Inspect screen Renames "OS version" entry to "Android version" Renames "WiFi Direct Name" to "WiFi Name" Adds Control Hub OS version, when viewing the report of a Control Hub Hides the airplane mode entry, when viewing the report of a Control Hub Removes check for ZTE Speed Channel Changer Shows firmware version for all Expansion and Control Hubs Reworks network settings portion of Manage page All network settings are now applied with a single click The WiFi Direct channel of phone-based Robot Controllers can now be changed from the Manage page WiFi channels are filtered by band (2.4 vs 5 GHz) and whether they overlap with other channels The current WiFi channel is pre-selected on phone-based Robot Controllers, and Control Hubs running OS 1.1.2 or later. On Control Hubs running OS 1.1.2 or later, you can choose to have the system automatically select a channel on the 5 GHz band Improves OnBotJava New light and dark themes replace the old themes (chaos, github, chrome,...) the new default theme is light and will be used when you first update to this version OnBotJava now has a tabbed editor Read-only offline mode Improves function of "exit" menu item on Robot Controller and Driver Station Now guaranteed to be fully stopped and unloaded from memory Shows a warning message if a LinearOpMode exists prematurely due to failure to monitor for the start condition Improves error message shown when the Driver Station and Robot Controller are incompatible with each other Driver Station OpMode Control Panel now disabled while a Restart Robot is in progress Disables advanced settings related to WiFi direct when the Robot Controller is a Control Hub. Tint phone battery icons on Driver Station when low/critical. Uses names "Control Hub Portal" and "Control Hub" (when appropriate) in new configuration files Improve I2C read performance Very large improvement on Control Hub; up to ~2x faster with small (e.g. 6 byte) reads Not as apparent on Expansion Hubs connected to a phone Update/refresh build infrastructure Update to 'androidx' support library from 'com.android.support:appcompat', which is end-of-life Update targetSdkVersion and compileSdkVersion to 28 Update Android Studio's Android plugin to latest Fix reported build timestamp in 'About' screen Add sample illustrating manual webcam use: ConceptWebcam Bug fixes Fixes SkyStone issue #248 Fixes SkyStone issue #232 and modifies bulk caching semantics to allow for cache-preserving MANUAL/AUTO transitions. Improves performance when REV 2M distance sensor is unplugged Improves readability of Toast messages on certain devices Allows a Driver Station to connect to a Robot Controller after another has disconnected Improves generation of fake serial numbers for UVC cameras which do not provide a real serial number Previously some devices would assign such cameras a serial of 0:0 and fail to open and start streaming Fixes ftc_app issue #638. Fixes a slew of bugs with the Vuforia camera monitor including: Fixes bug where preview could be displayed with a wonky aspect ratio Fixes bug where preview could be cut off in landscape Fixes bug where preview got totally messed up when rotating phone Fixes bug where crosshair could drift off target when using webcams Fixes issue in UVC driver on some devices (ftc_app 681) if streaming was started/stopped multiple times in a row Issue manifested as kernel panic on devices which do not have this kernel patch. On affected devices which do have the patch, the issue was manifest as simply a failure to start streaming. The Tech Team believes that the root cause of the issue is a bug in the Linux kernel XHCI driver. A workaround was implemented in the SDK UVC driver. Fixes bug in UVC driver where often half the frames from the camera would be dropped (e.g. only 15FPS delivered during a streaming session configured for 30FPS). Fixes issue where TensorFlow Object Detection would show results whose confidence was lower than the minimum confidence parameter. Fixes a potential exploitation issue of CVE-2019-11358 in OnBotJava Fixes changing the address of an Expansion Hub with additional Expansion Hubs connected to it Preserves the Control Hub's network connection when "Restart Robot" is selected Fixes issue where device scans would fail while the Robot was restarting Fix RenderScript usage Use androidx.renderscript variant: increased compatibility Use RenderScript in Java mode, not native: simplifies build Fixes webcam-frame-to-bitmap conversion problem: alpha channel wasn't being initialized, only R, G, & B Fixes possible arithmetic overflow in Deadline Fixes deadlock in Vuforia webcam support which could cause 5-second delays when stopping OpMode Version 5.4 (20200108-101156) Fixes SkyStone issue #88 Adds an inspection item that notes when a robot controller (Control Hub) is using the factory default password. Fixes SkyStone issue #61 Fixes SkyStone issue #142 Fixes ftc_app issue #417 by adding more current and voltage monitoring capabilities for REV Hubs. Fixes a crash sometimes caused by OnBotJava activity Improves OnBotJava autosave functionality ftc_app #738 Fixes system responsiveness issue when an Expansion Hub is disconnected Fixes issue where IMU initialization could prevent Op Modes from stopping Fixes issue where AndroidTextToSpeech.speak() would fail if it was called too early Adds telemetry.speak() methods and blocks, which cause the Driver Station (if also updated) to speak text Adds and improves Expansion Hub-related warnings Improves Expansion Hub low battery warning Displays the warning immediately after the hub reports it Specifies whether the condition is current or occurred temporarily during an OpMode run Displays which hubs reported low battery Displays warning when hub loses and regains power during an OpMode run Fixes the hub's LED pattern after this condition Displays warning when Expansion Hub is not responding to commands Specifies whether the condition is current or occurred temporarily during an OpMode run Clarifies warning when Expansion Hub is not present at startup Specifies that this condition requires a Robot Restart before the hub can be used. The hub light will now accurately reflect this state Improves logging and reduces log spam during these conditions Syncs the Control Hub time and timezone to a connected web browser programming the robot, if a Driver Station is not available. Adds bulk read functionality for REV Hubs A bulk caching mode must be set at the Hub level with LynxModule#setBulkCachingMode(). This applies to all relevant SDK hardware classes that reference that Hub. The following following Hub bulk caching modes are available: BulkCachingMode.OFF (default): All hardware calls operate as usual. Bulk data can read through LynxModule#getBulkData() and processed manually. BulkCachingMode.AUTO: Applicable hardware calls are served from a bulk read cache that is cleared/refreshed automatically to ensure identical commands don't hit the same cache. The cache can also be cleared manually with LynxModule#clearBulkCache(), although this is not recommended. (advanced users) BulkCachingMode.MANUAL: Same as BulkCachingMode.AUTO except the cache is never cleared automatically. To avoid getting stale data, the cache must be manually cleared at the beginning of each loop body or as the user deems appropriate. Removes PIDF Annotation values added in Rev 5.3 (to AndyMark, goBILDA and TETRIX motor configurations). The new motor types will still be available but their Default control behavior will revert back to Rev 5.2 Adds new ConceptMotorBulkRead sample Opmode to demonstrate and compare Motor Bulk-Read modes for reducing I/O latencies. Version 5.3 (20191004-112306) Fixes external USB/UVC webcam support Makes various bugfixes and improvements to Blocks page, including but not limited to: Many visual tweaks Browser zoom and window resize behave better Resizing the Java preview pane works better and more consistently across browsers The Java preview pane consistently gets scrollbars when needed The Java preview pane is hidden by default on phones Internet Explorer 11 should work Large dropdown lists display properly on lower res screens Disabled buttons are now visually identifiable as disabled A warning is shown if a user selects a TFOD sample, but their device is not compatible Warning messages in a Blocks op mode are now visible by default. Adds goBILDA 5201 and 5202 motors to Robot Configurator Adds PIDF Annotation values to AndyMark, goBILDA and TETRIX motor configurations. This has the effect of causing the RUN_USING_ENCODERS and RUN_TO_POSITION modes to use PIDF vs PID closed loop control on these motors. This should provide more responsive, yet stable, speed control. PIDF adds Feedforward control to the basic PID control loop. Feedforward is useful when controlling a motor's speed because it "anticipates" how much the control voltage must change to achieve a new speed set-point, rather than requiring the integrated error to change sufficiently. The PIDF values were chosen to provide responsive, yet stable, speed control on a lightly loaded motor. The more heavily a motor is loaded (drag or friction), the more noticable the PIDF improvement will be. Fixes startup crash on Android 10 Fixes ftc_app issue #712 (thanks to FROGbots-4634) Fixes ftc_app issue #542 Allows "A" and lowercase letters when naming device through RC and DS apps. Version 5.2 (20190905-083277) Fixes extra-wide margins on settings activities, and placement of the new configuration button Adds Skystone Vuforia image target data. Includes sample Skystone Vuforia Navigation op modes (Java). Includes sample Skystone Vuforia Navigation op modes (Blocks). Adds TensorFlow inference model (.tflite) for Skystone game elements. Includes sample Skystone TensorFlow op modes (Java). Includes sample Skystone TensorFlow op modes (Blocks). Removes older (season-specific) sample op modes. Includes 64-bit support (to comply with Google Play requirements). Protects against Stuck OpModes when a Restart Robot is requested. (Thanks to FROGbots-4634) (ftc_app issue #709) Blocks related changes: Fixes bug with blocks generated code when hardware device name is a java or javascript reserved word. Shows generated java code for blocks, even when hardware items are missing from the active configuration. Displays warning icon when outdated Vuforia and TensorFlow blocks are used (SkyStone issue #27) Version 5.1 (20190820-222104) Defines default PIDF parameters for the following motors: REV Core Hex Motor REV 20:1 HD Hex Motor REV 40:1 HD Hex Motor Adds back button when running on a device without a system back button (such as a Control Hub) Allows a REV Control Hub to update the firmware on a REV Expansion Hub via USB Fixes SkyStone issue #9 Fixes ftc_app issue #715 Prevents extra DS User clicks by filtering based on current state. Prevents incorrect DS UI state changes when receiving new OpMode list from RC Adds support for REV Color Sensor V3 Adds a manual-refresh DS Camera Stream for remotely viewing RC camera frames. To show the stream on the DS, initialize but do not run a stream-enabled opmode, select the Camera Stream option in the DS menu, and tap the image to refresh. This feature is automatically enabled when using Vuforia or TFOD—no additional RC configuration is required for typical use cases. To hide the stream, select the same menu item again. Note that gamepads are disabled and the selected opmode cannot be started while the stream is open as a safety precaution. To use custom streams, consult the API docs for CameraStreamServer#setSource and CameraStreamSource. Adds many Star Wars sounds to RobotController resources. Added SKYSTONE Sounds Chooser Sample Program. Switches out startup, connect chimes, and error/warning sounds for Star Wars sounds Updates OnBot Java to use a WebSocket for communication with the robot The OnBot Java page no longer has to do a full refresh when a user switches from editing one file to another Known issues: Camera Stream The Vuforia camera stream inherits the issues present in the phone preview (namely ftc_app issue #574). This problem does not affect the TFOD camera stream even though it receives frames from Vuforia. The orientation of the stream frames may not always match the phone preview. For now, these frames may be rotated manually via a custom CameraStreamSource if desired. OnBotJava Browser back button may not always work correctly It's possible for a build to be queued, but not started. The OnBot Java build console will display a warning if this occurs. A user might not realize they are editing a different file if the user inadvertently switches from one file to another since this switch is now seamless. The name of the currently open file is displayed in the browser tab. Version 5.0 (built on 19.06.14) Support for the REV Robotics Control Hub. Adds a Java preview pane to the Blocks editor. Adds a new offline export feature to the Blocks editor. Display wifi channel in Network circle on Driver Station. Adds calibration for Logitech C270 Updates build tooling and target SDK. Compliance with Google's permissions infrastructure (Required after build tooling update). Keep Alives to mitigate the Motorola wifi scanning problem. Telemetry substitute no longer necessary. Improves Vuforia error reporting. Fixes ftctechnh/ftc_app issues 621, 713. Miscellaneous bug fixes and improvements. Version 4.3 (built on 18.10.31) Includes missing TensorFlow-related libraries and files. Version 4.2 (built on 18.10.30) Includes fix to avoid deadlock situation with WatchdogMonitor which could result in USB communication errors. Comm error appeared to require that user disconnect USB cable and restart the Robot Controller app to recover. robotControllerLog.txt would have error messages that included the words "E RobotCore: lynx xmit lock: #### abandoning lock:" Includes fix to correctly list the parent module address for a REV Robotics Expansion Hub in a configuration (.xml) file. Bug in versions 4.0 and 4.1 would incorrect list the address module for a parent REV Robotics device as "1". If the parent module had a higher address value than the daisy-chained module, then this bug would prevent the Robot Controller from communicating with the downstream Expansion Hub. Added requirement for ACCESS_COARSE_LOCATION to allow a Driver Station running Android Oreo to scan for Wi-Fi Direct devices. Added google() repo to build.gradle because aapt2 must be downloaded from the google() repository beginning with version 3.2 of the Android Gradle Plugin. Important Note: Android Studio users will need to be connected to the Internet the first time build the ftc_app project. Internet connectivity is required for the first build so the appropriate files can be downloaded from the Google repository. Users should not need to be connected to the Internet for subsequent builds. This should also fix buid issue where Android Studio would complain that it "Could not find com.android.tools.lint:lint-gradle:26.1.4" (or similar). Added support for REV Spark Mini motor controller as part of the configuration menu for a servo/PWM port on the REV Expansion Hub. Provide examples for playing audio files in an Op Mode. Block Development Tool Changes Includes a fix for a problem with the Velocity blocks that were reported in the FTC Technology forum (Blocks Programming subforum). Change the "Save completed successfully." message to a white color so it will contrast with a green background. Fixed the "Download image" feature so it will work if there are text blocks in the op mode. Introduce support for Google's TensorFlow Lite technology for object detetion for 2018-2019 game. TensorFlow lite can recognize Gold Mineral and Silver Mineral from 2018-2019 game. Example Java and Block op modes are included to show how to determine the relative position of the gold block (left, center, right). Version 4.1 (released on 18.09.24) Changes include: Fix to prevent crash when deprecated configuration annotations are used. Change to allow FTC Robot Controller APK to be auto-updated using FIRST Global Control Hub update scripts. Removed samples for non supported / non legal hardware. Improvements to Telemetry.addData block with "text" socket. Updated Blocks sample op mode list to include Rover Ruckus Vuforia example. Update SDK library version number. Version 4.0 (released on 18.09.12) Changes include: Initial support for UVC compatible cameras If UVC camera has a unique serial number, RC will detect and enumerate by serial number. If UVC camera lacks a unique serial number, RC will only support one camera of that type connected. Calibration settings for a few cameras are included (see TeamCode/src/main/res/xml/teamwebcamcalibrations.xml for details). User can upload calibration files from Program and Manage web interface. UVC cameras seem to draw a fair amount of electrical current from the USB bus. This does not appear to present any problems for the REV Robotics Control Hub. This does seem to create stability problems when using some cameras with an Android phone-based Robot Controller. FTC Tech Team is investigating options to mitigate this issue with the phone-based Robot Controllers. Updated sample Vuforia Navigation and VuMark Op Modes to demonstrate how to use an internal phone-based camera and an external UVC webcam. Support for improved motor control. REV Robotics Expansion Hub firmware 1.8 and greater will support a feed forward mechanism for closed loop motor control. FTC SDK has been modified to support PIDF coefficients (proportional, integral, derivative, and feed forward). FTC Blocks development tool modified to include PIDF programming blocks. Deprecated older PID-related methods and variables. REV's 1.8.x PIDF-related changes provide a more linear and accurate way to control a motor. Wireless Added 5GHz support for wireless channel changing for those devices that support it. Tested with Moto G5 and E4 phones. Also tested with other (currently non-approved) phones such as Samsung Galaxy S8. Improved Expansion Hub firmware update support in Robot Controller app Changes to make the system more robust during the firmware update process (when performed through Robot Controller app). User no longer has to disconnect a downstream daisy-chained Expansion Hub when updating an Expansion Hub's firmware. If user is updating an Expansion Hub's firmware through a USB connection, he/she does not have to disconnect RS485 connection to other Expansion Hubs. The user still must use a USB connection to update an Expansion Hub's firmware. The user cannot update the Expansion Hub firmware for a downstream device that is daisy chained through an RS485 connection. If an Expansion Hub accidentally gets "bricked" the Robot Controller app is now more likely to recognize the Hub when it scans the USB bus. Robot Controller app should be able to detect an Expansion Hub, even if it accidentally was bricked in a previous update attempt. Robot Controller app should be able to install the firmware onto the Hub, even if if accidentally was bricked in a previous update attempt. Resiliency FTC software can detect and enable an FTDI reset feature that is available with REV Robotics v1.8 Expansion Hub firmware and greater. When enabled, the Expansion Hub can detect if it hasn't communicated with the Robot Controller over the FTDI (USB) connection. If the Hub hasn't heard from the Robot Controller in a while, it will reset the FTDI connection. This action helps system recover from some ESD-induced disruptions. Various fixes to improve reliability of FTC software. Blocks Fixed errors with string and list indices in blocks export to java. Support for USB connected UVC webcams. Refactored optimized Blocks Vuforia code to support Rover Ruckus image targets. Added programming blocks to support PIDF (proportional, integral, derivative and feed forward) motor control. Added formatting options (under Telemetry and Miscellaneous categories) so user can set how many decimal places to display a numerical value. Support to play audio files (which are uploaded through Blocks web interface) on Driver Station in addition to the Robot Controller. Fixed bug with Download Image of Blocks feature. Support for REV Robotics Blinkin LED Controller. Support for REV Robotics 2m Distance Sensor. Added support for a REV Touch Sensor (no longer have to configure as a generic digital device). Added blocks for DcMotorEx methods. These are enhanced methods that you can use when supported by the motor controller hardware. The REV Robotics Expansion Hub supports these enhanced methods. Enhanced methods include methods to get/set motor velocity (in encoder pulses per second), get/set PIDF coefficients, etc.. Modest Improvements in Logging Decrease frequency of battery checker voltage statements. Removed non-FTC related log statements (wherever possible). Introduced a "Match Logging" feature. Under "Settings" a user can enable/disable this feature (it's disabled by default). If enabled, user provides a "Match Number" through the Driver Station user interface (top of the screen). The Match Number is used to create a log file specifically with log statements from that particular Op Mode run. Match log files are stored in /sdcard/FIRST/matlogs on the Robot Controller. Once an op mode run is complete, the Match Number is cleared. This is a convenient way to create a separate match log with statements only related to a specific op mode run. New Devices Support for REV Robotics Blinkin LED Controller. Support for REV Robotics 2m Distance Sensor. Added configuration option for REV 20:1 HD Hex Motor. Added support for a REV Touch Sensor (no longer have to configure as a generic digital device). Miscellaneous Fixed some errors in the definitions for acceleration and velocity in our javadoc documentation. Added ability to play audio files on Driver Station When user is configuring an Expansion Hub, the LED on the Expansion Hub will change blink pattern (purple-cyan) to indicate which Hub is currently being configured. Renamed I2cSensorType to I2cDeviceType. Added an external sample Op Mode that demonstrates localization using 2018-2019 (Rover Ruckus presented by QualComm) Vuforia targets. Added an external sample Op Mode that demonstrates how to use the REV Robotics 2m Laser Distance Sensor. Added an external sample Op Mode that demonstrates how to use the REV Robotics Blinkin LED Controller. Re-categorized external Java sample Op Modes to "TeleOp" instead of "Autonomous". Known issues: Initial support for UVC compatible cameras UVC cameras seem to draw significant amount of current from the USB bus. This does not appear to present any problems for the REV Robotics Control Hub. This does seem to create stability problems when using some cameras with an Android phone-based Robot Controller. FTC Tech Team is investigating options to mitigate this issue with the phone-based Robot Controllers. There might be a possible deadlock which causes the RC to become unresponsive when using a UVC webcam with a Nougat Android Robot Controller. Wireless When user selects a wireless channel, this channel does not necessarily persist if the phone is power cycled. Tech Team is hoping to eventually address this issue in a future release. Issue has been present since apps were introduced (i.e., it is not new with the v4.0 release). Wireless channel is not currently displayed for WiFi Direct connections. Miscellaneous The blink indication feature that shows which Expansion Hub is currently being configured does not work for a newly created configuration file. User has to first save a newly created configuration file and then close and re-edit the file in order for blink indicator to work. Version 3.6 (built on 17.12.18) Changes include: Blocks Changes Uses updated Google Blockly software to allow users to edit their op modes on Apple iOS devices (including iPad and iPhone). Improvement in Blocks tool to handle corrupt op mode files. Autonomous op modes should no longer get switched back to tele-op after re-opening them to be edited. The system can now detect type mismatches during runtime and alert the user with a message on the Driver Station. Updated javadoc documentation for setPower() method to reflect correct range of values (-1 to +1). Modified VuforiaLocalizerImpl to allow for user rendering of frames Added a user-overrideable onRenderFrame() method which gets called by the class's renderFrame() method. Version 3.5 (built on 17.10.30) Changes with version 3.5 include: Introduced a fix to prevent random op mode stops, which can occur after the Robot Controller app has been paused and then resumed (for example, when a user temporarily turns off the display of the Robot Controller phone, and then turns the screen back on). Introduced a fix to prevent random op mode stops, which were previously caused by random peer disconnect events on the Driver Station. Fixes issue where log files would be closed on pause of the RC or DS, but not re-opened upon resume. Fixes issue with battery handler (voltage) start/stop race. Fixes issue where Android Studio generated op modes would disappear from available list in certain situations. Fixes problem where OnBot Java would not build on REV Robotics Control Hub. Fixes problem where OnBot Java would not build if the date and time on the Robot Controller device was "rewound" (set to an earlier date/time). Improved error message on OnBot Java that occurs when renaming a file fails. Removed unneeded resources from android.jar binaries used by OnBot Java to reduce final size of Robot Controller app. Added MR_ANALOG_TOUCH_SENSOR block to Blocks Programming Tool. Version 3.4 (built on 17.09.06) Changes with version 3.4 include: Added telemetry.update() statement for BlankLinearOpMode template. Renamed sample Block op modes to be more consistent with Java samples. Added some additional sample Block op modes. Reworded OnBot Java readme slightly. Version 3.3 (built on 17.09.04) This version of the software includes improves for the FTC Blocks Programming Tool and the OnBot Java Programming Tool. Changes with verion 3.3 include: Android Studio ftc_app project has been updated to use Gradle Plugin 2.3.3. Android Studio ftc_app project is already using gradle 3.5 distribution. Robot Controller log has been renamed to /sdcard/RobotControllerLog.txt (note that this change was actually introduced w/ v3.2). Improvements in I2C reliability. Optimized I2C read for REV Expansion Hub, with v1.7 firmware or greater. Updated all external/samples (available through OnBot and in Android project folder). Vuforia Added support for VuMarks that will be used for the 2017-2018 season game. Blocks Update to latest Google Blockly release. Sample op modes can be selected as a template when creating new op mode. Fixed bug where the blocks would disappear temporarily when mouse button is held down. Added blocks for Range.clip and Range.scale. User can now disable/enable Block op modes. Fix to prevent occasional Blocks deadlock. OnBot Java Significant improvements with autocomplete function for OnBot Java editor. Sample op modes can be selected as a template when creating new op mode. Fixes and changes to complete hardware setup feature. Updated (and more useful) onBot welcome message. Known issues: Android Studio After updating to the new v3.3 Android Studio project folder, if you get error messages indicating "InvalidVirtualFileAccessException" then you might need to do a File->Invalidate Caches / Restart to clear the error. OnBot Java Sometimes when you push the build button to build all op modes, the RC returns an error message that the build failed. If you press the build button a second time, the build typically suceeds. Version 3.2 (built on 17.08.02) This version of the software introduces the "OnBot Java" Development Tool. Similar to the FTC Blocks Development Tool, the FTC OnBot Java Development Tool allows a user to create, edit and build op modes dynamically using only a Javascript-enabled web browser. The OnBot Java Development Tool is an integrated development environment (IDE) that is served up by the Robot Controller. Op modes are created and edited using a Javascript-enabled browser (Google Chromse is recommended). Op modes are saved on the Robot Controller Android device directly. The OnBot Java Development Tool provides a Java programming environment that does NOT need Android Studio. Changes with version 3.2 include: Enhanced web-based development tools Introduction of OnBot Java Development Tool. Web-based programming and management features are "always on" (user no longer needs to put Robot Controller into programming mode). Web-based management interface (where user can change Robot Controller name and also easily download Robot Controller log file). OnBot Java, Blocks and Management features available from web based interface. Blocks Programming Development Tool: Changed "LynxI2cColorRangeSensor" block to "REV Color/range sensor" block. Fixed tooltip for ColorSensor.isLightOn block. Added blocks for ColorSensor.getNormalizedColors and LynxI2cColorRangeSensor.getNormalizedColors. Added example op modes for digital touch sensor and REV Robotics Color Distance sensor. User selectable color themes. Includes many minor enhancements and fixes (too numerous to list). Known issues: Auto complete function is incomplete and does not support the following (for now): Access via this keyword Access via super keyword Members of the super cloass, not overridden by the class Any methods provided in the current class Inner classes Can't handle casted objects Any objects coming from an parenthetically enclosed expression Version 3.10 (built on 17.05.09) This version of the software provides support for the REV Robotics Expansion Hub. This version also includes improvements in the USB communication layer in an effort to enhance system resiliency. If you were using a 2.x version of the software previously, updating to version 3.1 requires that you also update your Driver Station software in addition to updating the Robot Controller software. Also note that in version 3.10 software, the setMaxSpeed and getMaxSpeed methods are no longer available (not deprecated, they have been removed from the SDK). Also note that the the new 3.x software incorporates motor profiles that a user can select as he/she configures the robot. Changes include: Blocks changes Added VuforiaTrackableDefaultListener.getPose and Vuforia.trackPose blocks. Added optimized blocks support for Vuforia extended tracking. Added atan2 block to the math category. Added useCompetitionFieldTargetLocations parameter to Vuforia.initialize block. If set to false, the target locations are placed at (0,0,0) with target orientation as specified in https://github.com/gearsincorg/FTCVuforiaDemo/blob/master/Robot_Navigation.java tutorial op mode. Incorporates additional improvements to USB comm layer to improve system resiliency (to recover from a greater number of communication disruptions). Additional Notes Regarding Version 3.00 (built on 17.04.13) In addition to the release changes listed below (see section labeled "Version 3.00 (built on 17.04.013)"), version 3.00 has the following important changes: Version 3.00 software uses a new version of the FTC Robocol (robot protocol). If you upgrade to v3.0 on the Robot Controller and/or Android Studio side, you must also upgrade the Driver Station software to match the new Robocol. Version 3.00 software removes the setMaxSpeed and getMaxSpeed methods from the DcMotor class. If you have an op mode that formerly used these methods, you will need to remove the references/calls to these methods. Instead, v3.0 provides the max speed information through the use of motor profiles that are selected by the user during robot configuration. Version 3.00 software currently does not have a mechanism to disable extra i2c sensors. We hope to re-introduce this function with a release in the near future. Version 3.00 (built on 17.04.13) *** Use this version of the software at YOUR OWN RISK!!! *** This software is being released as an "alpha" version. Use this version at your own risk! This pre-release software contains SIGNIFICANT changes, including changes to the Wi-Fi Direct pairing mechanism, rewrites of the I2C sensor classes, changes to the USB/FTDI layer, and the introduction of support for the REV Robotics Expansion Hub and the REV Robotics color-range-light sensor. These changes were implemented to improve the reliability and resiliency of the FTC control system. Please note, however, that version 3.00 is considered "alpha" code. This code is being released so that the FIRST community will have an opportunity to test the new REV Expansion Hub electronics module when it becomes available in May. The developers do not recommend using this code for critical applications (i.e., competition use). *** Use this version of the software at YOUR OWN RISK!!! *** Changes include: Major rework of sensor-related infrastructure. Includes rewriting sensor classes to implement synchronous I2C communication. Fix to reset Autonomous timer back to 30 seconds. Implementation of specific motor profiles for approved 12V motors (includes Tetrix, AndyMark, Matrix and REV models). Modest improvements to enhance Wi-Fi P2P pairing. Fixes telemetry log addition race. Publishes all the sources (not just a select few). Includes Block programming improvements Addition of optimized Vuforia blocks. Auto scrollbar to projects and sounds pages. Fixed blocks paste bug. Blocks execute after while-opModeIsActive loop (to allow for cleanup before exiting op mode). Added gyro integratedZValue block. Fixes bug with projects page for Firefox browser. Added IsSpeaking block to AndroidTextToSpeech. Implements support for the REV Robotics Expansion Hub Implements support for integral REV IMU (physically installed on I2C bus 0, uses same Bosch BNO055 9 axis absolute orientation sensor as Adafruit 9DOF abs orientation sensor). - Implements support for REV color/range/light sensor. Provides support to update Expansion Hub firmware through FTC SDK. Detects REV firmware version and records in log file. Includes support for REV Control Hub (note that the REV Control Hub is not yet approved for FTC use). Implements FTC Blocks programming support for REV Expansion Hub and sensor hardware. Detects and alerts when I2C device disconnect. Version 2.62 (built on 17.01.07) Added null pointer check before calling modeToByte() in finishModeSwitchIfNecessary method for ModernRoboticsUsbDcMotorController class. Changes to enhance Modern Robotics USB protocol robustness. Version 2.61 (released on 16.12.19) Blocks Programming mode changes: Fix to correct issue when an exception was thrown because an OpticalDistanceSensor object appears twice in the hardware map (the second time as a LightSensor). Version 2.6 (released on 16.12.16) Fixes for Gyro class: Improve (decrease) sensor refresh latency. fix isCalibrating issues. Blocks Programming mode changes: Blocks now ignores a device in the configuration xml if the name is empty. Other devices work in configuration work fine. Version 2.5 (internal release on released on 16.12.13) Blocks Programming mode changes: Added blocks support for AdafruitBNO055IMU. Added Download Op Mode button to FtcBocks.html. Added support for copying blocks in one OpMode and pasting them in an other OpMode. The clipboard content is stored on the phone, so the programming mode server must be running. Modified Utilities section of the toolbox. In Programming Mode, display information about the active connections. Fixed paste location when workspace has been scrolled. Added blocks support for the android Accelerometer. Fixed issue where Blocks Upload Op Mode truncated name at first dot. Added blocks support for Android SoundPool. Added type safety to blocks for Acceleration. Added type safety to blocks for AdafruitBNO055IMU.Parameters. Added type safety to blocks for AnalogInput. Added type safety to blocks for AngularVelocity. Added type safety to blocks for Color. Added type safety to blocks for ColorSensor. Added type safety to blocks for CompassSensor. Added type safety to blocks for CRServo. Added type safety to blocks for DigitalChannel. Added type safety to blocks for ElapsedTime. Added type safety to blocks for Gamepad. Added type safety to blocks for GyroSensor. Added type safety to blocks for IrSeekerSensor. Added type safety to blocks for LED. Added type safety to blocks for LightSensor. Added type safety to blocks for LinearOpMode. Added type safety to blocks for MagneticFlux. Added type safety to blocks for MatrixF. Added type safety to blocks for MrI2cCompassSensor. Added type safety to blocks for MrI2cRangeSensor. Added type safety to blocks for OpticalDistanceSensor. Added type safety to blocks for Orientation. Added type safety to blocks for Position. Added type safety to blocks for Quaternion. Added type safety to blocks for Servo. Added type safety to blocks for ServoController. Added type safety to blocks for Telemetry. Added type safety to blocks for Temperature. Added type safety to blocks for TouchSensor. Added type safety to blocks for UltrasonicSensor. Added type safety to blocks for VectorF. Added type safety to blocks for Velocity. Added type safety to blocks for VoltageSensor. Added type safety to blocks for VuforiaLocalizer.Parameters. Added type safety to blocks for VuforiaTrackable. Added type safety to blocks for VuforiaTrackables. Added type safety to blocks for enums in AdafruitBNO055IMU.Parameters. Added type safety to blocks for AndroidAccelerometer, AndroidGyroscope, AndroidOrientation, and AndroidTextToSpeech. Version 2.4 (released on 16.11.13) Fix to avoid crashing for nonexistent resources. Blocks Programming mode changes: Added blocks to support OpenGLMatrix, MatrixF, and VectorF. Added blocks to support AngleUnit, AxesOrder, AxesReference, CameraDirection, CameraMonitorFeedback, DistanceUnit, and TempUnit. Added blocks to support Acceleration. Added blocks to support LinearOpMode.getRuntime. Added blocks to support MagneticFlux and Position. Fixed typos. Made blocks for ElapsedTime more consistent with other objects. Added blocks to support Quaternion, Velocity, Orientation, AngularVelocity. Added blocks to support VuforiaTrackables, VuforiaTrackable, VuforiaLocalizer, VuforiaTrackableDefaultListener. Fixed a few blocks. Added type checking to new blocks. Updated to latest blockly. Added default variable blocks to navigation and matrix blocks. Fixed toolbox entry for openGLMatrix_rotation_withAxesArgs. When user downloads Blocks-generated op mode, only the .blk file is downloaded. When user uploads Blocks-generated op mode (.blk file), Javascript code is auto generated. Added DbgLog support. Added logging when a blocks file is read/written. Fixed bug to properly render blocks even if missing devices from configuration file. Added support for additional characters (not just alphanumeric) for the block file names (for download and upload). Added support for OpMode flavor (“Autonomous” or “TeleOp”) and group. Changes to Samples to prevent tutorial issues. Incorporated suggested changes from public pull 216 (“Replace .. paths”). Remove Servo Glitches when robot stopped. if user hits “Cancels” when editing a configuration file, clears the unsaved changes and reverts to original unmodified configuration. Added log info to help diagnose why the Robot Controller app was terminated (for example, by watch dog function). Added ability to transfer log from the controller. Fixed inconsistency for AngularVelocity Limit unbounded growth of data for telemetry. If user does not call telemetry.update() for LinearOpMode in a timely manner, data added for telemetry might get lost if size limit is exceeded. Version 2.35 (released on 16.10.06) Blockly programming mode - Removed unnecesary idle() call from blocks for new project. Version 2.30 (released on 16.10.05) Blockly programming mode: Mechanism added to save Blockly op modes from Programming Mode Server onto local device To avoid clutter, blocks are displayed in categorized folders Added support for DigitalChannel Added support for ModernRoboticsI2cCompassSensor Added support for ModernRoboticsI2cRangeSensor Added support for VoltageSensor Added support for AnalogInput Added support for AnalogOutput Fix for CompassSensor setMode block Vuforia Fix deadlock / make camera data available while Vuforia is running. Update to Vuforia 6.0.117 (recommended by Vuforia and Google to close security loophole). Fix for autonomous 30 second timer bug (where timer was in effect, even though it appeared to have timed out). opModeIsActive changes to allow cleanup after op mode is stopped (with enforced 2 second safety timeout). Fix to avoid reading i2c twice. Updated sample Op Modes. Improved logging and fixed intermittent freezing. Added digital I/O sample. Cleaned up device names in sample op modes to be consistent with Pushbot guide. Fix to allow use of IrSeekerSensorV3. Version 2.20 (released on 16.09.08) Support for Modern Robotics Compass Sensor. Support for Modern Robotics Range Sensor. Revise device names for Pushbot templates to match the names used in Pushbot guide. Fixed bug so that IrSeekerSensorV3 device is accessible as IrSeekerSensor in hardwareMap. Modified computer vision code to require an individual Vuforia license (per legal requirement from PTC). Minor fixes. Blockly enhancements: Support for Voltage Sensor. Support for Analog Input. Support for Analog Output. Support for Light Sensor. Support for Servo Controller. Version 2.10 (released on 16.09.03) Support for Adafruit IMU. Improvements to ModernRoboticsI2cGyro class Block on reset of z axis. isCalibrating() returns true while gyro is calibration. Updated sample gyro program. Blockly enhancements support for android.graphics.Color. added support for ElapsedTime. improved look and legibility of blocks. support for compass sensor. support for ultrasonic sensor. support for IrSeeker. support for LED. support for color sensor. support for CRServo prompt user to configure robot before using programming mode. Provides ability to disable audio cues. various bug fixes and improvements. Version 2.00 (released on 16.08.19) This is the new release for the upcoming 2016-2017 FIRST Tech Challenge Season. Channel change is enabled in the FTC Robot Controller app for Moto G 2nd and 3rd Gen phones. Users can now use annotations to register/disable their Op Modes. Changes in the Android SDK, JDK and build tool requirements (minsdk=19, java 1.7, build tools 23.0.3). Standardized units in analog input. Cleaned up code for existing analog sensor classes. setChannelMode and getChannelMode were REMOVED from the DcMotorController class. This is important - we no longer set the motor modes through the motor controller. setMode and getMode were added to the DcMotor class. ContinuousRotationServo class has been added to the FTC SDK. Range.clip() method has been overloaded so it can support this operation for int, short and byte integers. Some changes have been made (new methods added) on how a user can access items from the hardware map. Users can now set the zero power behavior for a DC motor so that the motor will brake or float when power is zero. Prototype Blockly Programming Mode has been added to FTC Robot Controller. Users can place the Robot Controller into this mode, and then use a device (such as a laptop) that has a Javascript enabled browser to write Blockly-based Op Modes directly onto the Robot Controller. Users can now configure the robot remotely through the FTC Driver Station app. Android Studio project supports Android Studio 2.1.x and compile SDK Version 23 (Marshmallow). Vuforia Computer Vision SDK integrated into FTC SDK. Users can use sample vision targets to get localization information on a standard FTC field. Project structure has been reorganized so that there is now a TeamCode package that users can use to place their local/custom Op Modes into this package. Inspection function has been integrated into the FTC Robot Controller and Driver Station Apps (Thanks Team HazMat… 9277 & 10650!). Audio cues have been incorporated into FTC SDK. Swap mechanism added to FTC Robot Controller configuration activity. For example, if you have two motor controllers on a robot, and you misidentified them in your configuration file, you can use the Swap button to swap the devices within the configuration file (so you do not have to manually re-enter in the configuration info for the two devices). Fix mechanism added to all user to replace an electronic module easily. For example, suppose a servo controller dies on your robot. You replace the broken module with a new module, which has a different serial number from the original servo controller. You can use the Fix button to automatically reconfigure your configuration file to use the serial number of the new module. Improvements made to fix resiliency and responsiveness of the system. For LinearOpMode the user now must for a telemetry.update() to update the telemetry data on the driver station. This update() mechanism ensures that the driver station gets the updated data properly and at the same time. The Auto Configure function of the Robot Controller is now template based. If there is a commonly used robot configuration, a template can be created so that the Auto Configure mechanism can be used to quickly configure a robot of this type. The logic to detect a runaway op mode (both in the LinearOpMode and OpMode types) and to abort the run, then auto recover has been improved/implemented. Fix has been incorporated so that Logitech F310 gamepad mappings will be correct for Marshmallow users. Release 16.07.08 For the ftc_app project, the gradle files have been modified to support Android Studio 2.1.x. Release 16.03.30 For the MIT App Inventor, the design blocks have new icons that better represent the function of each design component. Some changes were made to the shutdown logic to ensure the robust shutdown of some of our USB services. A change was made to LinearOpMode so as to allow a given instance to be executed more than once, which is required for the App Inventor. Javadoc improved/updated. Release 16.03.09 Changes made to make the FTC SDK synchronous (significant change!) waitOneFullHardwareCycle() and waitForNextHardwareCycle() are no longer needed and have been deprecated. runOpMode() (for a LinearOpMode) is now decoupled from the system's hardware read/write thread. loop() (for an OpMode) is now decoupled from the system's hardware read/write thread. Methods are synchronous. For example, if you call setMode(DcMotorController.RunMode.RESET_ENCODERS) for a motor, the encoder is guaranteed to be reset when the method call is complete. For legacy module (NXT compatible), user no longer has to toggle between read and write modes when reading from or writing to a legacy device. Changes made to enhance reliability/robustness during ESD event. Changes made to make code thread safe. Debug keystore added so that user-generated robot controller APKs will all use the same signed key (to avoid conflicts if a team has multiple developer laptops for example). Firmware version information for Modern Robotics modules are now logged. Changes made to improve USB comm reliability and robustness. Added support for voltage indicator for legacy (NXT-compatible) motor controllers. Changes made to provide auto stop capabilities for op modes. A LinearOpMode class will stop when the statements in runOpMode() are complete. User does not have to push the stop button on the driver station. If an op mode is stopped by the driver station, but there is a run away/uninterruptible thread persisting, the app will log an error message then force itself to crash to stop the runaway thread. Driver Station UI modified to display lowest measured voltage below current voltage (12V battery). Driver Station UI modified to have color background for current voltage (green=good, yellow=caution, red=danger, extremely low voltage). javadoc improved (edits and additional classes). Added app build time to About activity for driver station and robot controller apps. Display local IP addresses on Driver Station About activity. Added I2cDeviceSynchImpl. Added I2cDeviceSync interface. Added seconds() and milliseconds() to ElapsedTime for clarity. Added getCallbackCount() to I2cDevice. Added missing clearI2cPortActionFlag. Added code to create log messages while waiting for LinearOpMode shutdown. Fix so Wifi Direct Config activity will no longer launch multiple times. Added the ability to specify an alternate i2c address in software for the Modern Robotics gyro. Release 16.02.09 Improved battery checker feature so that voltage values get refreshed regularly (every 250 msec) on Driver Station (DS) user interface. Improved software so that Robot Controller (RC) is much more resilient and “self-healing” to USB disconnects: If user attempts to start/restart RC with one or more module missing, it will display a warning but still start up. When running an op mode, if one or more modules gets disconnected, the RC & DS will display warnings,and robot will keep on working in spite of the missing module(s). If a disconnected module gets physically reconnected the RC will auto detect the module and the user will regain control of the recently connected module. Warning messages are more helpful (identifies the type of module that’s missing plus its USB serial number). Code changes to fix the null gamepad reference when users try to reference the gamepads in the init() portion of their op mode. NXT light sensor output is now properly scaled. Note that teams might have to readjust their light threshold values in their op modes. On DS user interface, gamepad icon for a driver will disappear if the matching gamepad is disconnected or if that gamepad gets designated as a different driver. Robot Protocol (ROBOCOL) version number info is displayed in About screen on RC and DS apps. Incorporated a display filter on pairing screen to filter out devices that don’t use the “-“ format. This filter can be turned off to show all WiFi Direct devices. Updated text in License file. Fixed formatting error in OpticalDistanceSensor.toString(). Fixed issue on with a blank (“”) device name that would disrupt WiFi Direct Pairing. Made a change so that the WiFi info and battery info can be displayed more quickly on the DS upon connecting to RC. Improved javadoc generation. Modified code to make it easier to support language localization in the future. Release 16.01.04 Updated compileSdkVersion for apps Prevent Wifi from entering power saving mode removed unused import from driver station Corrrected "Dead zone" joystick code. LED.getDeviceName and .getConnectionInfo() return null apps check for ROBOCOL_VERSION mismatch Fix for Telemetry also has off-by-one errors in its data string sizing / short size limitations error User telemetry output is sorted. added formatting variants to DbgLog and RobotLog APIs code modified to allow for a long list of op mode names. changes to improve thread safety of RobocolDatagramSocket Fix for "missing hardware leaves robot controller disconnected from driver station" error fix for "fast tapping of Init/Start causes problems" (toast is now only instantiated on UI thread). added some log statements for thread life cycle. moved gamepad reset logic inside of initActiveOpMode() for robustness changes made to mitigate risk of race conditions on public methods. changes to try and flag when WiFi Direct name contains non-printable characters. fix to correct race condition between .run() and .close() in ReadWriteRunnableStandard. updated FTDI driver made ReadWriteRunnableStanard interface public. fixed off-by-one errors in Command constructor moved specific hardware implmentations into their own package. moved specific gamepad implemnatations to the hardware library. changed LICENSE file to new BSD version. fixed race condition when shutting down Modern Robotics USB devices. methods in the ColorSensor classes have been synchronized. corrected isBusy() status to reflect end of motion. corrected "back" button keycode. the notSupported() method of the GyroSensor class was changed to protected (it should not be public). Release 15.11.04.001 Added Support for Modern Robotics Gyro. The GyroSensor class now supports the MR Gyro Sensor. Users can access heading data (about Z axis) Users can also access raw gyro data (X, Y, & Z axes). Example MRGyroTest.java op mode included. Improved error messages More descriptive error messages for exceptions in user code. Updated DcMotor API Enable read mode on new address in setI2cAddress Fix so that driver station app resets the gamepads when switching op modes. USB-related code changes to make USB comm more responsive and to display more explicit error messages. Fix so that USB will recover properly if the USB bus returns garbage data. Fix USB initializtion race condition. Better error reporting during FTDI open. More explicit messages during USB failures. Fixed bug so that USB device is closed if event loop teardown method was not called. Fixed timer UI issue Fixed duplicate name UI bug (Legacy Module configuration). Fixed race condition in EventLoopManager. Fix to keep references stable when updating gamepad. For legacy Matrix motor/servo controllers removed necessity of appending "Motor" and "Servo" to controller names. Updated HT color sensor driver to use constants from ModernRoboticsUsbLegacyModule class. Updated MR color sensor driver to use constants from ModernRoboticsUsbDeviceInterfaceModule class. Correctly handle I2C Address change in all color sensors Updated/cleaned up op modes. Updated comments in LinearI2cAddressChange.java example op mode. Replaced the calls to "setChannelMode" with "setMode" (to match the new of the DcMotor method). Removed K9AutoTime.java op mode. Added MRGyroTest.java op mode (demonstrates how to use MR Gyro Sensor). Added MRRGBExample.java op mode (demonstrates how to use MR Color Sensor). Added HTRGBExample.java op mode (demonstrates how to use HT legacy color sensor). Added MatrixControllerDemo.java (demonstrates how to use legacy Matrix controller). Updated javadoc documentation. Updated release .apk files for Robot Controller and Driver Station apps. Release 15.10.06.002 Added support for Legacy Matrix 9.6V motor/servo controller. Cleaned up build.gradle file. Minor UI and bug fixes for driver station and robot controller apps. Throws error if Ultrasonic sensor (NXT) is not configured for legacy module port 4 or 5. Release 15.08.03.001 New user interfaces for FTC Driver Station and FTC Robot Controller apps. An init() method is added to the OpMode class. For this release, init() is triggered right before the start() method. Eventually, the init() method will be triggered when the user presses an "INIT" button on driver station. The init() and loop() methods are now required (i.e., need to be overridden in the user's op mode). The start() and stop() methods are optional. A new LinearOpMode class is introduced. Teams can use the LinearOpMode mode to create a linear (not event driven) program model. Teams can use blocking statements like Thread.sleep() within a linear op mode. The API for the Legacy Module and Core Device Interface Module have been updated. Support for encoders with the Legacy Module is now working. The hardware loop has been updated for better performance.
jtydhr88
A curated collection of [Claude Code skills](https://docs.anthropic.com/en/docs/claude-code/skills) for developing ComfyUI custom nodes. These skills give Claude comprehensive knowledge of the ComfyUI node system, covering both the V3 (recommended) and V1 (legacy) APIs.
Masudbro94
Open in app Get started ITNEXT Published in ITNEXT You have 2 free member-only stories left this month. Sign up for Medium and get an extra one Kush Kush Follow Apr 15, 2021 · 7 min read · Listen Save How you can Control your Android Device with Python Photo by Caspar Camille Rubin on Unsplash Photo by Caspar Camille Rubin on Unsplash Introduction A while back I was thinking of ways in which I could annoy my friends by spamming them with messages for a few minutes, and while doing some research I came across the Android Debug Bridge. In this quick guide I will show you how you can interface with it using Python and how to create 2 quick scripts. The ADB (Android Debug Bridge) is a command line tool (CLI) which can be used to control and communicate with an Android device. You can do many things such as install apps, debug apps, find hidden features and use a shell to interface with the device directly. To enable the ADB, your device must firstly have Developer Options unlocked and USB debugging enabled. To unlock developer options, you can go to your devices settings and scroll down to the about section and find the build number of the current software which is on the device. Click the build number 7 times and Developer Options will be enabled. Then you can go to the Developer Options panel in the settings and enable USB debugging from there. Now the only other thing you need is a USB cable to connect your device to your computer. Here is what todays journey will look like: Installing the requirements Getting started The basics of writing scripts Creating a selfie timer Creating a definition searcher Installing the requirements The first of the 2 things we need to install, is the ADB tool on our computer. This comes automatically bundled with Android Studio, so if you already have that then do not worry. Otherwise, you can head over to the official docs and at the top of the page there should be instructions on how to install it. Once you have installed the ADB tool, you need to get the python library which we will use to interface with the ADB and our device. You can install the pure-python-adb library using pip install pure-python-adb. Optional: To make things easier for us while developing our scripts, we can install an open-source program called scrcpy which allows us to display and control our android device with our computer using a mouse and keyboard. To install it, you can head over to the Github repo and download the correct version for your operating system (Windows, macOS or Linux). If you are on Windows, then extract the zip file into a directory and add this directory to your path. This is so we can access the program from anywhere on our system just by typing in scrcpy into our terminal window. Getting started Now that all the dependencies are installed, we can start up our ADB and connect our device. Firstly, connect your device to your PC with the USB cable, if USB debugging is enabled then a message should pop up asking if it is okay for your PC to control the device, simply answer yes. Then on your PC, open up a terminal window and start the ADB server by typing in adb start-server. This should print out the following messages: * daemon not running; starting now at tcp:5037 * daemon started successfully If you also installed scrcpy, then you can start that by just typing scrcpy into the terminal. However, this will only work if you added it to your path, otherwise you can open the executable by changing your terminal directory to the directory of where you installed scrcpy and typing scrcpy.exe. Hopefully if everything works out, you should be able to see your device on your PC and be able to control it using your mouse and keyboard. Now we can create a new python file and check if we can find our connected device using the library: Here we import the AdbClient class and create a client object using it. Then we can get a list of devices connected. Lastly, we get the first device out of our list (it is generally the only one there if there is only one device connected). The basics of writing scripts The main way we are going to interface with our device is using the shell, through this we can send commands to simulate a touch at a specific location or to swipe from A to B. To simulate screen touches (taps) we first need to work out how the screen coordinates work. To help with these we can activate the pointer location setting in the developer options. Once activated, wherever you touch on the screen, you can see that the coordinates for that point appear at the top. The coordinate system works like this: A diagram to show how the coordinate system works A diagram to show how the coordinate system works The top left corner of the display has the x and y coordinates (0, 0) respectively, and the bottom right corners’ coordinates are the largest possible values of x and y. Now that we know how the coordinate system works, we need to check out the different commands we can run. I have made a list of commands and how to use them below for quick reference: Input tap x y Input text “hello world!” Input keyevent eventID Here is a list of some common eventID’s: 3: home button 4: back button 5: call 6: end call 24: volume up 25: volume down 26: turn device on or off 27: open camera 64: open browser 66: enter 67: backspace 207: contacts 220: brightness down 221: brightness up 277: cut 278: copy 279: paste If you wanted to find more, here is a long list of them here. Creating a selfie timer Now we know what we can do, let’s start doing it. In this first example I will show you how to create a quick selfie timer. To get started we need to import our libraries and create a connect function to connect to our device: You can see that the connect function is identical to the previous example of how to connect to your device, except here we return the device and client objects for later use. In our main code, we can call the connect function to retrieve the device and client objects. From there we can open up the camera app, wait 5 seconds and take a photo. It’s really that simple! As I said before, this is simply replicating what you would usually do, so thinking about how to do things is best if you do them yourself manually first and write down the steps. Creating a definition searcher We can do something a bit more complex now, and that is to ask the browser to find the definition of a particular word and take a screenshot to save it on our computer. The basic flow of this program will be as such: 1. Open the browser 2. Click the search bar 3. Enter the search query 4. Wait a few seconds 5. Take a screenshot and save it But, before we get started, you need to find the coordinates of your search bar in your default browser, you can use the method I suggested earlier to find them easily. For me they were (440, 200). To start, we will have to import the same libraries as before, and we will also have our same connect method. In our main function we can call the connect function, as well as assign a variable to the x and y coordinates of our search bar. Notice how this is a string and not a list or tuple, this is so we can easily incorporate the coordinates into our shell command. We can also take an input from the user to see what word they want to get the definition for: We will add that query to a full sentence which will then be searched, this is so that we can always get the definition. After that we can open the browser and input our search query into the search bar as such: Here we use the eventID 66 to simulate the press of the enter key to execute our search. If you wanted to, you could change the wait timings per your needs. Lastly, we will take a screenshot using the screencap method on our device object, and we can save that as a .png file: Here we must open the file in the write bytes mode because the screencap method returns bytes representing the image. If all went according to plan, you should have a quick script which searches for a specific word. Here it is working on my phone: A GIF to show how the definition searcher example works on my phone A GIF to show how the definition searcher example works on my phone Final thoughts Hopefully you have learned something new today, personally I never even knew this was a thing before I did some research into it. The cool thing is, that you can do anything you normal would be able to do, and more since it just simulates your own touches and actions! I hope you enjoyed the article and thank you for reading! 💖 468 9 468 9 More from ITNEXT Follow ITNEXT is a platform for IT developers & software engineers to share knowledge, connect, collaborate, learn and experience next-gen technologies. Sabrina Amrouche Sabrina Amrouche ·Apr 15, 2021 Using the Spotify Algorithm to Find High Energy Physics Particles Python 5 min read Using the Spotify Algorithm to Find High Energy Physics Particles Wenkai Fan Wenkai Fan ·Apr 14, 2021 Responsive design at different levels in Flutter Flutter 3 min read Responsive design at different levels in Flutter Abhishek Gupta Abhishek Gupta ·Apr 14, 2021 Getting started with Kafka and Rust: Part 2 Kafka 9 min read Getting started with Kafka and Rust: Part 2 Adriano Raiano Adriano Raiano ·Apr 14, 2021 How to properly internationalize a React application using i18next React 17 min read How to properly internationalize a React application using i18next Gary A. Stafford Gary A. Stafford ·Apr 14, 2021 AWS IoT Core for LoRaWAN, AWS IoT Analytics, and Amazon QuickSight Lora 11 min read AWS IoT Core for LoRaWAN, Amazon IoT Analytics, and Amazon QuickSight Read more from ITNEXT Recommended from Medium Morpheus Morpheus Morpheus Swap — Resurrection Ashutosh Kumar Ashutosh Kumar GIT Branching strategies and GitFlow Balachandar Paulraj Balachandar Paulraj Delta Lake Clones: Systematic Approach for Testing, Sharing data Jason Porter Jason Porter Week 3 -Yieldly No-Loss Lottery Results Casino slot machines Mikolaj Szabó Mikolaj Szabó in HackerNoon.com Why functional programming matters Tt Tt Set Up LaTeX on Mac OS X Sierra Goutham Pratapa Goutham Pratapa Upgrade mongo to the latest build Julia Says Julia Says in Top Software Developers in the World How to Choose a Software Vendor AboutHelpTermsPrivacy Get the Medium app A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
hackcrypto
Fluxion is a security auditing and social-engineering research tool. It is a remake of linset by vk496 with (hopefully) less bugs and more functionality. The script attempts to retrieve the WPA/WPA2 key from a target access point by means of a social engineering (phishing) attack. It's compatible with the latest release of Kali (rolling). Fluxion's attacks' setup is mostly manual, but experimental auto-mode handles some of the attacks' setup parameters. Read the FAQ before requesting issues. If you need quick help, fluxion is also avaible on gitter. You can talk with us on Gitter or on Discord. Installation Read here before you do the following steps. Download the latest revision git clone --recursive git@github.com:FluxionNetwork/fluxion.git Switch to tool's directory cd fluxion Run fluxion (missing dependencies will be auto-installed) ./fluxion.sh Fluxion is also available in arch cd bin/arch makepkg or using the blackarch repo pacman -S fluxion scroll Changelog Fluxion gets weekly updates with new features, improvements, and bugfixes. Be sure to check out the changelog here. :octocat: How to contribute All contributions are welcome! Code, documentation, graphics, or even design suggestions are welcome; use GitHub to its fullest. Submit pull requests, contribute tutorials or other wiki content -- whatever you have to offer, it'll be appreciated but please follow the style guide. book How it works Scan for a target wireless network. Launch the Handshake Snooper attack. Capture a handshake (necessary for password verification). Launch Captive Portal attack. Spawns a rogue (fake) AP, imitating the original access point. Spawns a DNS server, redirecting all requests to the attacker's host running the captive portal. Spawns a web server, serving the captive portal which prompts users for their WPA/WPA2 key. Spawns a jammer, deauthenticating all clients from original AP and lureing them to the rogue AP. All authentication attempts at the captive portal are checked against the handshake file captured earlier. The attack will automatically terminate once a correct key has been submitted. The key will be logged and clients will be allowed to reconnect to the target access point. For a guide to the Captive Portal attack, read the Captive Portal attack guide exclamation Requirements A Linux-based operating system. We recommend Kali Linux 2 or Kali rolling. Kali 2 & rolling support the latest aircrack-ng versions. An external wifi card is recommended. Related work For development I use vim and tmux. Here are my dotfiles :octocat: Credits l3op - contributor dlinkproto - contributor vk496 - developer of linset Derv82 - @Wifite/2 Princeofguilty - @webpages and @buteforce Photos for wiki @http://www.kalitutorials.net Ons Ali @wallpaper PappleTec @sites MPX4132 - Fluxion V3 Disclaimer Authors do not own the logos under the /attacks/Captive Portal/sites/ directory. Copyright Disclaimer Under Section 107 of the Copyright Act 1976, allowance is made for "fair use" for purposes such as criticism, comment, news reporting, teaching, scholarship, and research. The usage of Fluxion for attacking infrastructures without prior mutual consent could be considered an illegal activity, and is highly discouraged by its authors/developers. It is the end user's responsibility to obey all applicable local, state and federal laws. Authors assume no liability and are not responsible for any misuse or damage caused by this program. Note Beware of sites pretending to be related with the Fluxion Project. These may be delivering malware. Fluxion DOES NOT WORK on Linux Subsystem For Windows 10, because the subsystem doesn't allow access to network interfaces. Any Issue regarding the same would be Closed Immediately Links Fluxion website: https://fluxionnetwork.github.io/fluxion/ Discord: https://discordapp.com/invite/G43gptk Gitter: https://gitter.im/FluxionNetwork/Lobby
No description available
nbicocchi
Basic course introducing installation, maintenance, and automation of modern Unix systems. Recommended to learners without previous experience.
easezyc
推荐系统实践书及笔记
mercerheather476
 [](https://search.maven.org/search?q=g:net.openid%20appauth) [](http://javadoc.io/doc/net.openid/appauth) [](https://github.com/openid/AppAuth-Android/actions/workflows/build.yml) [](https://codecov.io/github/openid/AppAuth-Android?branch=master) AppAuth for Android is a client SDK for communicating with [OAuth 2.0](https://tools.ietf.org/html/rfc6749) and [OpenID Connect](http://openid.net/specs/openid-connect-core-1_0.html) providers. It strives to directly map the requests and responses of those specifications, while following the idiomatic style of the implementation language. In addition to mapping the raw protocol flows, convenience methods are available to assist with common tasks like performing an action with fresh tokens. The library follows the best practices set out in [RFC 8252 - OAuth 2.0 for Native Apps](https://tools.ietf.org/html/rfc8252), including using [Custom Tabs](https://developer.chrome.com/multidevice/android/customtabs) for authorization requests. For this reason, `WebView` is explicitly *not* supported due to usability and security reasons. The library also supports the [PKCE](https://tools.ietf.org/html/rfc7636) extension to OAuth which was created to secure authorization codes in public clients when custom URI scheme redirects are used. The library is friendly to other extensions (standard or otherwise) with the ability to handle additional parameters in all protocol requests and responses. A talk providing an overview of using the library for enterprise single sign-on (produced by Google) can be found here: [Enterprise SSO with Chrome Custom Tabs](https://www.youtube.com/watch?v=DdQTXrk6YTk). ## Download AppAuth for Android is available on [MavenCentral](https://search.maven.org/search?q=g:net.openid%20appauth) ```groovy implementation 'net.openid:appauth:<version>' ``` ## Requirements AppAuth supports Android API 16 (Jellybean) and above. Browsers which provide a custom tabs implementation are preferred by the library, but not required. Both Custom URI Schemes (all supported versions of Android) and App Links (Android M / API 23+) can be used with the library. In general, AppAuth can work with any Authorization Server (AS) that supports native apps as documented in [RFC 8252](https://tools.ietf.org/html/rfc8252), either through custom URI scheme redirects, or App Links. AS's that assume all clients are web-based or require clients to maintain confidentiality of the client secrets may not work well. ## Demo app A demo app is contained within this repository. For instructions on how to build and configure this app, see the [demo app readme](https://github.com/openid/AppAuth-Android/blob/master/app/README.md). ## Conceptual overview AppAuth encapsulates the authorization state of the user in the [net.openid.appauth.AuthState](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthState.java) class, and communicates with an authorization server through the use of the [net.openid.appauth.AuthorizationService](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationService.java) class. AuthState is designed to be easily persistable as a JSON string, using the storage mechanism of your choice (e.g. [SharedPreferences](https://developer.android.com/training/basics/data-storage/shared-preferences.html), [sqlite](https://developer.android.com/training/basics/data-storage/databases.html), or even just [in a file](https://developer.android.com/training/basics/data-storage/files.html)). AppAuth provides data classes which are intended to model the OAuth2 specification as closely as possible; this provides the greatest flexibility in interacting with a wide variety of OAuth2 and OpenID Connect implementations. Authorizing the user occurs via the user's web browser, and the request is described using instances of [AuthorizationRequest](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationRequest.java). The request is dispatched using [performAuthorizationRequest()](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationService.java#L159) on an AuthorizationService instance, and the response (an [AuthorizationResponse](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationResponse.java) instance) will be dispatched to the activity of your choice, expressed via an Intent. Token requests, such as obtaining a new access token using a refresh token, follow a similar pattern: [TokenRequest](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/TokenRequest.java) instances are dispatched using [performTokenRequest()](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationService.java#L252) on an AuthorizationService instance, and a [TokenResponse](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/TokenResponse.java) instance is returned via a callback. Responses can be provided to the [update()](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthState.java#L367) methods on AuthState in order to track and persist changes to the authorization state. Once in an authorized state, the [performActionWithFreshTokens()](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthState.java#L449) method on AuthState can be used to automatically refresh access tokens as necessary before performing actions that require valid tokens. ## Implementing the authorization code flow It is recommended that native apps use the [authorization code](https://tools.ietf.org/html/rfc6749#section-1.3.1) flow with a public client to gain authorization to access user data. This has the primary advantage for native clients that the authorization flow, which must occur in a browser, only needs to be performed once. This flow is effectively composed of four stages: 1. Discovering or specifying the endpoints to interact with the provider. 2. Authorizing the user, via a browser, in order to obtain an authorization code. 3. Exchanging the authorization code with the authorization server, to obtain a refresh token and/or ID token. 4. Using access tokens derived from the refresh token to interact with a resource server for further access to user data. At each step of the process, an AuthState instance can (optionally) be updated with the result to help with tracking the state of the flow. ### Authorization service configuration First, AppAuth must be instructed how to interact with the authorization service. This can be done either by directly creating an [AuthorizationServiceConfiguration](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationServiceConfiguration.java#L102) instance, or by retrieving an OpenID Connect discovery document. Directly specifying an AuthorizationServiceConfiguration involves providing the URIs of the authorization endpoint and token endpoint, and optionally a dynamic client registration endpoint (see "Dynamic client registration" for more info): ```java AuthorizationServiceConfiguration serviceConfig = new AuthorizationServiceConfiguration( Uri.parse("https://idp.example.com/auth"), // authorization endpoint Uri.parse("https://idp.example.com/token")); // token endpoint ``` Where available, using an OpenID Connect discovery document is preferable: ```java AuthorizationServiceConfiguration.fetchFromIssuer( Uri.parse("https://idp.example.com"), new AuthorizationServiceConfiguration.RetrieveConfigurationCallback() { public void onFetchConfigurationCompleted( @Nullable AuthorizationServiceConfiguration serviceConfiguration, @Nullable AuthorizationException ex) { if (ex != null) { Log.e(TAG, "failed to fetch configuration"); return; } // use serviceConfiguration as needed } }); ``` This will attempt to download a discovery document from the standard location under this base URI, `https://idp.example.com/.well-known/openid-configuration`. If the discovery document for your IDP is in some other non-standard location, you can instead provide the full URI as follows: ```java AuthorizationServiceConfiguration.fetchFromUrl( Uri.parse("https://idp.example.com/exampletenant/openid-config"), new AuthorizationServiceConfiguration.RetrieveConfigurationCallback() { ... } }); ``` If desired, this configuration can be used to seed an AuthState instance, to persist the configuration easily: ```java AuthState authState = new AuthState(serviceConfig); ``` ### Obtaining an authorization code An authorization code can now be acquired by constructing an AuthorizationRequest, using its Builder. In AppAuth, the builders for each data class accept the mandatory parameters via the builder constructor: ```java AuthorizationRequest.Builder authRequestBuilder = new AuthorizationRequest.Builder( serviceConfig, // the authorization service configuration MY_CLIENT_ID, // the client ID, typically pre-registered and static ResponseTypeValues.CODE, // the response_type value: we want a code MY_REDIRECT_URI); // the redirect URI to which the auth response is sent ``` Other optional parameters, such as the OAuth2 [scope string](https://tools.ietf.org/html/rfc6749#section-3.3) or OpenID Connect [login hint](http://openid.net/specs/openid-connect-core-1_0.html#rfc.section.3.1.2.1) are specified through set methods on the builder: ```java AuthorizationRequest authRequest = authRequestBuilder .setScope("openid email profile https://idp.example.com/custom-scope") .setLoginHint("jdoe@user.example.com") .build(); ``` This request can then be dispatched using one of two approaches. a `startActivityForResult` call using an Intent returned from the `AuthorizationService`, or by calling `performAuthorizationRequest` and providing pending intent for completion and cancelation handling activities. The `startActivityForResult` approach is simpler to use but may require more processing of the result: ```java private void doAuthorization() { AuthorizationService authService = new AuthorizationService(this); Intent authIntent = authService.getAuthorizationRequestIntent(authRequest); startActivityForResult(authIntent, RC_AUTH); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RC_AUTH) { AuthorizationResponse resp = AuthorizationResponse.fromIntent(data); AuthorizationException ex = AuthorizationException.fromIntent(data); // ... process the response or exception ... } else { // ... } } ``` If instead you wish to directly transition to another activity on completion or cancelation, you can use `performAuthorizationRequest`: ```java AuthorizationService authService = new AuthorizationService(this); authService.performAuthorizationRequest( authRequest, PendingIntent.getActivity(this, 0, new Intent(this, MyAuthCompleteActivity.class), 0), PendingIntent.getActivity(this, 0, new Intent(this, MyAuthCanceledActivity.class), 0)); ``` The intents may be customized to carry any additional data or flags required for the correct handling of the authorization response. #### Capturing the authorization redirect Once the authorization flow is completed in the browser, the authorization service will redirect to a URI specified as part of the authorization request, providing the response via query parameters. In order for your app to capture this response, it must register with the Android OS as a handler for this redirect URI. We recommend using a custom scheme based redirect URI (i.e. those of form `my.scheme:/path`), as this is the most widely supported across all versions of Android. To avoid conflicts with other apps, it is recommended to configure a distinct scheme using "reverse domain name notation". This can either match your service web domain (in reverse) e.g. `com.example.service` or your package name `com.example.app` or be something completely new as long as it's distinct enough. Using the package name of your app is quite common but it's not always possible if it contains illegal characters for URI schemes (like underscores) or if you already have another handler for that scheme - so just use something else. When a custom scheme is used, AppAuth can be easily configured to capture all redirects using this custom scheme through a manifest placeholder: ```groovy android.defaultConfig.manifestPlaceholders = [ 'appAuthRedirectScheme': 'com.example.app' ] ``` Alternatively, the redirect URI can be directly configured by adding an intent-filter for AppAuth's RedirectUriReceiverActivity to your AndroidManifest.xml: ```xml <activity android:name="net.openid.appauth.RedirectUriReceiverActivity" tools:node="replace"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="com.example.app"/> </intent-filter> </activity> ``` If an HTTPS redirect URI is required instead of a custom scheme, the same approach (modifying your AndroidManifest.xml) is used: ```xml <activity android:name="net.openid.appauth.RedirectUriReceiverActivity" tools:node="replace"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="https" android:host="app.example.com" android:path="/oauth2redirect"/> </intent-filter> </activity> ``` HTTPS redirects can be secured by configuring the redirect URI as an [app link](https://developer.android.com/training/app-links/index.html) in Android M and above. We recommend that a fallback page be configured at the same address to forward authorization responses to your app via a custom scheme, for older Android devices. #### Handling the authorization response Upon completion of the authorization flow, the completion Intent provided to performAuthorizationRequest will be triggered. The authorization response is provided to this activity via Intent extra data, which can be extracted using the `fromIntent()` methods on AuthorizationResponse and AuthorizationException respectively: ```java public void onCreate(Bundle b) { AuthorizationResponse resp = AuthorizationResponse.fromIntent(getIntent()); AuthorizationException ex = AuthorizationException.fromIntent(getIntent()); if (resp != null) { // authorization completed } else { // authorization failed, check ex for more details } // ... } ``` The response can be provided to the AuthState instance for easy persistence and further processing: ``` authState.update(resp, ex); ``` If the full redirect URI is required in order to extract additional information that AppAuth does not provide, this is also provided to your activity: ```java public void onCreate(Bundle b) { // ... Uri redirectUri = getIntent().getData(); // ... } ``` ### Exchanging the authorization code Given a successful authorization response carrying an authorization code, a token request can be made to exchange the code for a refresh token: ```java authService.performTokenRequest( resp.createTokenExchangeRequest(), new AuthorizationService.TokenResponseCallback() { @Override public void onTokenRequestCompleted( TokenResponse resp, AuthorizationException ex) { if (resp != null) { // exchange succeeded } else { // authorization failed, check ex for more details } } }); ``` The token response can also be used to update an AuthState instance: ```java authState.update(resp, ex); ``` ### Using access tokens Finally, the retrieved access token can be used to interact with a resource server. This can be done directly, by extracting the access token from a token response. However, in most cases, it is simpler to use the `performActionWithFreshTokens` utility method provided by AuthState: ```java authState.performActionWithFreshTokens(service, new AuthStateAction() { @Override public void execute( String accessToken, String idToken, AuthorizationException ex) { if (ex != null) { // negotiation for fresh tokens failed, check ex for more details return; } // use the access token to do something ... } }); ``` This also updates the AuthState object with current access, id, and refresh tokens. If you are storing your AuthState in persistent storage, you should write the updated copy in the callback to this method. ### Ending current session Given you have a logged in session and you want to end it. In that case you need to get: - `AuthorizationServiceConfiguration` - valid Open Id Token that you should get after authentication - End of session URI that should be provided within you OpenId service config First you have to build EndSessionRequest ```java EndSessionRequest endSessionRequest = new EndSessionRequest.Builder(authorizationServiceConfiguration) .setIdTokenHint(idToken) .setPostLogoutRedirectUri(endSessionRedirectUri) .build(); ``` This request can then be dispatched using one of two approaches. a `startActivityForResult` call using an Intent returned from the `AuthorizationService`, or by calling `performEndSessionRequest` and providing pending intent for completion and cancelation handling activities. The startActivityForResult approach is simpler to use but may require more processing of the result: ```java private void endSession() { AuthorizationService authService = new AuthorizationService(this); Intent endSessionItent = authService.getEndSessionRequestIntent(endSessionRequest); startActivityForResult(endSessionItent, RC_END_SESSION); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RC_END_SESSION) { EndSessionResonse resp = EndSessionResonse.fromIntent(data); AuthorizationException ex = AuthorizationException.fromIntent(data); // ... process the response or exception ... } else { // ... } } ``` If instead you wish to directly transition to another activity on completion or cancelation, you can use `performEndSessionRequest`: ```java AuthorizationService authService = new AuthorizationService(this); authService.performEndSessionRequest( endSessionRequest, PendingIntent.getActivity(this, 0, new Intent(this, MyAuthCompleteActivity.class), 0), PendingIntent.getActivity(this, 0, new Intent(this, MyAuthCanceledActivity.class), 0)); ``` End session flow will also work involving browser mechanism that is described in authorization mechanism session. Handling response mechanism with transition to another activity should be as follows: ```java public void onCreate(Bundle b) { EndSessionResponse resp = EndSessionResponse.fromIntent(getIntent()); AuthorizationException ex = AuthorizationException.fromIntent(getIntent()); if (resp != null) { // authorization completed } else { // authorization failed, check ex for more details } // ... } ``` ### AuthState persistence Instances of `AuthState` keep track of the authorization and token requests and responses. This is the only object that you need to persist to retain the authorization state of the session. Typically, one would do this by storing the authorization state in SharedPreferences or some other persistent store private to the app: ```java @NonNull public AuthState readAuthState() { SharedPreferences authPrefs = getSharedPreferences("auth", MODE_PRIVATE); String stateJson = authPrefs.getString("stateJson", null); if (stateJson != null) { return AuthState.jsonDeserialize(stateJson); } else { return new AuthState(); } } public void writeAuthState(@NonNull AuthState state) { SharedPreferences authPrefs = getSharedPreferences("auth", MODE_PRIVATE); authPrefs.edit() .putString("stateJson", state.jsonSerializeString()) .apply(); } ``` The demo app has an [AuthStateManager](https://github.com/openid/AppAuth-Android/blob/master/app/java/net/openid/appauthdemo/AuthStateManager.java) type which demonstrates this in more detail. ## Advanced configuration AppAuth provides some advanced configuration options via [AppAuthConfiguration](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AppAuthConfiguration.java) instances, which can be provided to [AuthorizationService](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationService.java) during construction. ### Controlling which browser is used for authorization Some applications require explicit control over which browsers can be used for authorization - for example, to require that Chrome be used for second factor authentication to work, or require that some custom browser is used for authentication in an enterprise environment. Control over which browsers can be used can be achieved by defining a [BrowserMatcher](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/BrowserMatcher.java), and supplying this to the builder of AppAuthConfiguration. A BrowserMatcher is suppled with a [BrowserDescriptor](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/BrowserDescriptor.java) instance, and must decide whether this browser is permitted for the authorization flow. By default, [AnyBrowserMatcher](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/AnyBrowserMatcher.java) is used. For your convenience, utility classes to help define a browser matcher are provided, such as: - [Browsers](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/Browsers.java): contains a set of constants for the official package names and signatures of Chrome, Firefox and Samsung SBrowser. - [VersionedBrowserMatcher](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/VersionedBrowserMatcher.java): will match a browser if it has a matching package name and signature, and a version number within a defined [VersionRange](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/VersionRange.java). This class also provides some static instances for matching Chrome, Firefox and Samsung SBrowser. - [BrowserAllowList](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/BrowserAllowList.java): takes a list of BrowserMatcher instances, and will match a browser if any of these child BrowserMatcher instances signals a match. - [BrowserDenyList](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/browser/BrowserDenyList.java): the inverse of BrowserAllowList - takes a list of browser matcher instances, and will match a browser if it _does not_ match any of these child BrowserMatcher instances. For instance, in order to restrict the authorization flow to using Chrome or SBrowser as a custom tab: ```java AppAuthConfiguration appAuthConfig = new AppAuthConfiguration.Builder() .setBrowserMatcher(new BrowserAllowList( VersionedBrowserMatcher.CHROME_CUSTOM_TAB, VersionedBrowserMatcher.SAMSUNG_CUSTOM_TAB)) .build(); AuthorizationService authService = new AuthorizationService(context, appAuthConfig); ``` Or, to prevent the use of a buggy version of the custom tabs in Samsung SBrowser: ```java AppAuthConfiguration appAuthConfig = new AppAuthConfiguration.Builder() .setBrowserMatcher(new BrowserDenyList( new VersionedBrowserMatcher( Browsers.SBrowser.PACKAGE_NAME, Browsers.SBrowser.SIGNATURE_SET, true, // when this browser is used via a custom tab VersionRange.atMost("5.3") ))) .build(); AuthorizationService authService = new AuthorizationService(context, appAuthConfig); ``` ### Customizing the connection builder for HTTP requests It can be desirable to customize how HTTP connections are made when performing token requests, for instance to use [certificate pinning](https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning) or to add additional trusted certificate authorities for an enterprise environment. This can be achieved in AppAuth by providing a custom [ConnectionBuilder](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/connectivity/ConnectionBuilder.java) instance. For example, to custom the SSL socket factory used, one could do the following: ```java AppAuthConfiguration appAuthConfig = new AppAuthConfiguration.Builder() .setConnectionBuilder(new ConnectionBuilder() { public HttpURLConnection openConnect(Uri uri) throws IOException { URL url = new URL(uri.toString()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); if (connection instanceof HttpsUrlConnection) { HttpsURLConnection connection = (HttpsURLConnection) connection; connection.setSSLSocketFactory(MySocketFactory.getInstance()); } } }) .build(); ``` ### Issues with [ID Token](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/IdToken.java#L118) validation ID Token validation was introduced in `0.8.0` but not all authorization servers or configurations support it correctly. - For testing environments [setSkipIssuerHttpsCheck](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AppAuthConfiguration.java#L129) can be used to bypass the fact the issuer needs to be HTTPS. ```java AppAuthConfiguration appAuthConfig = new AppAuthConfiguration.Builder() .setSkipIssuerHttpsCheck(true) .build() ``` - For services that don't support nonce[s] resulting in **IdTokenException** `Nonce mismatch` just set nonce to `null` on the `AuthorizationRequest`. Please consider **raising an issue** with your Identity Provider and removing this once it is fixed. ```java AuthorizationRequest authRequest = authRequestBuilder .setNonce(null) .build(); ``` ## Dynamic client registration AppAuth supports the [OAuth2 dynamic client registration protocol](https://tools.ietf.org/html/rfc7591). In order to dynamically register a client, create a [RegistrationRequest](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/RegistrationRequest.java) and dispatch it using [performRegistrationRequest](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationService.java#L278) on your AuthorizationService instance. The registration endpoint can either be defined directly as part of your [AuthorizationServiceConfiguration](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/AuthorizationServiceConfiguration.java), or discovered from an OpenID Connect discovery document. ```java RegistrationRequest registrationRequest = new RegistrationRequest.Builder( serviceConfig, Arrays.asList(redirectUri)) .build(); ``` Requests are dispatched with the help of `AuthorizationService`. As this request is asynchronous the response is passed to a callback: ```java service.performRegistrationRequest( registrationRequest, new AuthorizationService.RegistrationResponseCallback() { @Override public void onRegistrationRequestCompleted( @Nullable RegistrationResponse resp, @Nullable AuthorizationException ex) { if (resp != null) { // registration succeeded, store the registration response AuthState state = new AuthState(resp); //proceed to authorization... } else { // registration failed, check ex for more details } } }); ``` ## Utilizing client secrets (DANGEROUS) We _strongly recommend_ you avoid using static client secrets in your native applications whenever possible. Client secrets derived via a dynamic client registration are safe to use, but static client secrets can be easily extracted from your apps and allow others to impersonate your app and steal user data. If client secrets must be used by the OAuth2 provider you are integrating with, we strongly recommend performing the code exchange step on your backend, where the client secret can be kept hidden. Having said this, in some cases using client secrets is unavoidable. In these cases, a [ClientAuthentication](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/ClientAuthentication.java) instance can be provided to AppAuth when performing a token request. This allows additional parameters (both HTTP headers and request body parameters) to be added to token requests. Two standard implementations of ClientAuthentication are provided: - [ClientSecretBasic](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/ClientSecretBasic.java): includes a client ID and client secret as an HTTP Basic Authorization header. - [ClientSecretPost](https://github.com/openid/AppAuth-Android/blob/master/library/java/net/openid/appauth/ClientSecretPost.java): includes a client ID and client secret as additional request parameters. So, in order to send a token request using HTTP basic authorization, one would write: ```java ClientAuthentication clientAuth = new ClientSecretBasic(MY_CLIENT_SECRET); TokenRequest req = ...; authService.performTokenRequest(req, clientAuth, callback); ``` This can also be done when using `performActionWithFreshTokens` on AuthState: ```java ClientAuthentication clientAuth = new ClientSecretPost(MY_CLIENT_SECRET); authState.performActionWithFreshTokens( authService, clientAuth, action); ``` ## Modifying or contributing to AppAuth This project requires the Android SDK for API level 25 (Nougat) to build, though the produced binaries only require API level 16 (Jellybean) to be used. We recommend that you fork and/or clone this repository to make modifications; downloading the source has been known to cause some developers problems. For contributors, see the additional instructions in [CONTRIBUTING.md](https://github.com/openid/AppAuth-Android/blob/master/CONTRIBUTING.md). ### Building from the Command line AppAuth for Android uses Gradle as its build system. In order to build the library and app binaries, run `./gradlew assemble`. The library AAR files are output to `library/build/outputs/aar`, while the demo app is output to `app/build/outputs/apk`. In order to run the tests and code analysis, run `./gradlew check`. ### Building from Android Studio In AndroidStudio, File -> New -> Import project. Select the root folder (the one with the `build.gradle` file).
wangyuyunmu
项亮等《推荐系统实践》算法代码
chenxi1103
Developed a full-stack movie recommendation system with RESTful API to provide clients with 20 recommended movies. Determine the hit rate by collecting clients’ watching data to see if they watch the recommended movies afterwards. Continuous Integration for pipeline code. Automated daily model quality evaluation and system supervision with Jinkens. Designed and built the infrastructure that can incrementally deploy new versions of recommendation service triggered by canary release and A/B testing. Integrated with feedback loops mechanism to detect potential positive or negative feedback loops to further identify potential adversarial attacks. Implemented the monitoring and detection by applying lambda architecture to combine the stream and batch processing results to detect problematic behaviors. Comprehensive data quality control on raw data received from Kafka stream, especially focus on data schema issues, missing data, and duplicated data. Monitoring Dashboard UI with D3.js. Developed the whole web server by Flask. Containerized the whole service by Docker.
sameerkhalid007
The project clinic management system is a web application developed to simplify the communication process between the doctor and the receptionist. The application would be operated by two admins one is doctor and the other is receptionist. Receptionist would be responsible for assigning token numbers to the patient visiting the clinic and save it in the database along with their details. These token numbers along with respective patient details are sent to doctor. The doctor can thus view patient details and after checking up the patient, the recommended medicines for the particular patient are fed into the database by the doctor and are sent to receptionist. The receptionist can then generate bill and feed into the database. The system also maintains patient’s history so that doctor or receptionist can view them anytime. The system can thus reduce complexity in maintaining patient’s records. The project is developed on web platform and is supported by a Sql database to store user specific details.
MateusNobreSilva
PHPMailer PHPMailer – A full-featured email creation and transfer class for PHP Test status codecov.io Latest Stable Version Total Downloads License API Docs Features Probably the world's most popular code for sending email from PHP! Used by many open-source projects: WordPress, Drupal, 1CRM, SugarCRM, Yii, Joomla! and many more Integrated SMTP support – send without a local mail server Send emails with multiple To, CC, BCC and Reply-to addresses Multipart/alternative emails for mail clients that do not read HTML email Add attachments, including inline Support for UTF-8 content and 8bit, base64, binary, and quoted-printable encodings SMTP authentication with LOGIN, PLAIN, CRAM-MD5, and XOAUTH2 mechanisms over SMTPS and SMTP+STARTTLS transports Validates email addresses automatically Protects against header injection attacks Error messages in over 50 languages! DKIM and S/MIME signing support Compatible with PHP 5.5 and later, including PHP 8.1 Namespaced to prevent name clashes Much more! Why you might need it Many PHP developers need to send email from their code. The only PHP function that supports this directly is mail(). However, it does not provide any assistance for making use of popular features such as encryption, authentication, HTML messages, and attachments. Formatting email correctly is surprisingly difficult. There are myriad overlapping (and conflicting) standards, requiring tight adherence to horribly complicated formatting and encoding rules – the vast majority of code that you'll find online that uses the mail() function directly is just plain wrong, if not unsafe! The PHP mail() function usually sends via a local mail server, typically fronted by a sendmail binary on Linux, BSD, and macOS platforms, however, Windows usually doesn't include a local mail server; PHPMailer's integrated SMTP client allows email sending on all platforms without needing a local mail server. Be aware though, that the mail() function should be avoided when possible; it's both faster and safer to use SMTP to localhost. Please don't be tempted to do it yourself – if you don't use PHPMailer, there are many other excellent libraries that you should look at before rolling your own. Try SwiftMailer , Laminas/Mail, ZetaComponents etc. License This software is distributed under the LGPL 2.1 license, along with the GPL Cooperation Commitment. Please read LICENSE for information on the software availability and distribution. Installation & loading PHPMailer is available on Packagist (using semantic versioning), and installation via Composer is the recommended way to install PHPMailer. Just add this line to your composer.json file: "phpmailer/phpmailer": "^6.5" or run composer require phpmailer/phpmailer Note that the vendor folder and the vendor/autoload.php script are generated by Composer; they are not part of PHPMailer. If you want to use the Gmail XOAUTH2 authentication class, you will also need to add a dependency on the league/oauth2-client package in your composer.json. Alternatively, if you're not using Composer, you can download PHPMailer as a zip file, (note that docs and examples are not included in the zip file), then copy the contents of the PHPMailer folder into one of the include_path directories specified in your PHP configuration and load each class file manually: <?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require 'path/to/PHPMailer/src/Exception.php'; require 'path/to/PHPMailer/src/PHPMailer.php'; require 'path/to/PHPMailer/src/SMTP.php'; If you're not using the SMTP class explicitly (you're probably not), you don't need a use line for the SMTP class. Even if you're not using exceptions, you do still need to load the Exception class as it is used internally. Legacy versions PHPMailer 5.2 (which is compatible with PHP 5.0 — 7.0) is no longer supported, even for security updates. You will find the latest version of 5.2 in the 5.2-stable branch. If you're using PHP 5.5 or later (which you should be), switch to the 6.x releases. Upgrading from 5.2 The biggest changes are that source files are now in the src/ folder, and PHPMailer now declares the namespace PHPMailer\PHPMailer. This has several important effects – read the upgrade guide for more details. Minimal installation While installing the entire package manually or with Composer is simple, convenient, and reliable, you may want to include only vital files in your project. At the very least you will need src/PHPMailer.php. If you're using SMTP, you'll need src/SMTP.php, and if you're using POP-before SMTP (very unlikely!), you'll need src/POP3.php. You can skip the language folder if you're not showing errors to users and can make do with English-only errors. If you're using XOAUTH2 you will need src/OAuth.php as well as the Composer dependencies for the services you wish to authenticate with. Really, it's much easier to use Composer! A Simple Example <?php //Import PHPMailer classes into the global namespace //These must be at the top of your script, not inside a function use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; //Load Composer's autoloader require 'vendor/autoload.php'; //Create an instance; passing `true` enables exceptions $mail = new PHPMailer(true); try { //Server settings $mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output $mail->isSMTP(); //Send using SMTP $mail->Host = 'smtp.example.com'; //Set the SMTP server to send through $mail->SMTPAuth = true; //Enable SMTP authentication $mail->Username = 'user@example.com'; //SMTP username $mail->Password = 'secret'; //SMTP password $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption $mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS` //Recipients $mail->setFrom('from@example.com', 'Mailer'); $mail->addAddress('joe@example.net', 'Joe User'); //Add a recipient $mail->addAddress('ellen@example.com'); //Name is optional $mail->addReplyTo('info@example.com', 'Information'); $mail->addCC('cc@example.com'); $mail->addBCC('bcc@example.com'); //Attachments $mail->addAttachment('/var/tmp/file.tar.gz'); //Add attachments $mail->addAttachment('/tmp/image.jpg', 'new.jpg'); //Optional name //Content $mail->isHTML(true); //Set email format to HTML $mail->Subject = 'Here is the subject'; $mail->Body = 'This is the HTML message body <b>in bold!</b>'; $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; $mail->send(); echo 'Message has been sent'; } catch (Exception $e) { echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}"; } You'll find plenty to play with in the examples folder, which covers many common scenarios including sending through gmail, building contact forms, sending to mailing lists, and more. If you are re-using the instance (e.g. when sending to a mailing list), you may need to clear the recipient list to avoid sending duplicate messages. See the mailing list example for further guidance. That's it. You should now be ready to use PHPMailer! Localization PHPMailer defaults to English, but in the language folder you'll find many translations for PHPMailer error messages that you may encounter. Their filenames contain ISO 639-1 language code for the translations, for example fr for French. To specify a language, you need to tell PHPMailer which one to use, like this: //To load the French version $mail->setLanguage('fr', '/optional/path/to/language/directory/'); We welcome corrections and new languages – if you're looking for corrections, run the PHPMailerLangTest.php script in the tests folder and it will show any missing translations. Documentation Start reading at the GitHub wiki. If you're having trouble, head for the troubleshooting guide as it's frequently updated. Examples of how to use PHPMailer for common scenarios can be found in the examples folder. If you're looking for a good starting point, we recommend you start with the Gmail example. To reduce PHPMailer's deployed code footprint, examples are not included if you load PHPMailer via Composer or via GitHub's zip file download, so you'll need to either clone the git repository or use the above links to get to the examples directly. Complete generated API documentation is available online. You can generate complete API-level documentation by running phpdoc in the top-level folder, and documentation will appear in the docs folder, though you'll need to have PHPDocumentor installed. You may find the unit tests a good reference for how to do various operations such as encryption. If the documentation doesn't cover what you need, search the many questions on Stack Overflow, and before you ask a question about "SMTP Error: Could not connect to SMTP host.", read the troubleshooting guide. Tests PHPMailer tests use PHPUnit 9, with a polyfill to let 9-style tests run on older PHPUnit and PHP versions. Test status If this isn't passing, is there something you can do to help? Security Please disclose any vulnerabilities found responsibly – report security issues to the maintainers privately. See SECURITY and PHPMailer's security advisories on GitHub. Contributing Please submit bug reports, suggestions and pull requests to the GitHub issue tracker. We're particularly interested in fixing edge-cases, expanding test coverage and updating translations. If you found a mistake in the docs, or want to add something, go ahead and amend the wiki – anyone can edit it. If you have git clones from prior to the move to the PHPMailer GitHub organisation, you'll need to update any remote URLs referencing the old GitHub location with a command like this from within your clone: git remote set-url upstream https://github.com/PHPMailer/PHPMailer.git Please don't use the SourceForge or Google Code projects any more; they are obsolete and no longer maintained. Sponsorship Development time and resources for PHPMailer are provided by Smartmessages.net, the world's only privacy-first email marketing system. Smartmessages.net privacy-first email marketing logo Donations are very welcome, whether in beer 🍺, T-shirts 👕, or cold, hard cash 💰. Sponsorship through GitHub is a simple and convenient way to say "thank you" to PHPMailer's maintainers and contributors – just click the "Sponsor" button on the project page. If your company uses PHPMailer, consider taking part in Tidelift's enterprise support programme. PHPMailer For Enterprise Available as part of the Tidelift Subscription. The maintainers of PHPMailer and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. Learn more. Changelog See changelog. History PHPMailer was originally written in 2001 by Brent R. Matzelle as a SourceForge project. Marcus Bointon (coolbru on SF) and Andy Prevost (codeworxtech) took over the project in 2004. Became an Apache incubator project on Google Code in 2010, managed by Jim Jagielski. Marcus created his fork on GitHub in 2008. Jim and Marcus decide to join forces and use GitHub as the canonical and official repo for PHPMailer in 2013. PHPMailer moves to the PHPMailer organisation on GitHub in 2013. What's changed since moving from SourceForge? Official successor to the SourceForge and Google Code projects. Test suite. Continuous integration with Github Actions. Composer support. Public development. Additional languages and language strings. CRAM-MD5 authentication support. Preserves full repo history of authors, commits and branches from the original SourceForge project.
SnehaSirnam
Artificial Intelligence project where I developed an expert system to detect cardiovascular diseases and provide a recommended treatment to the user using forward-backward chaining techniques.
yqmark
Privacy Policy introduction We understand the importance of personal information to you and will do our utmost to protect your personal information. We are committed to maintaining your trust in us and to abide by the following principles to protect your personal information: the principle of consistency of rights and responsibilities, the principle of purpose , choose the principle of consent, at least the principle of sufficient use, ensure the principle of security, the principle of subject participation, the principle of openness and transparency, and so on. At the same time, we promise that we will take appropriate security measures to protect your personal information according to the industry's mature security solutions. In view of this, we have formulated this "Private Privacy Policy" (hereinafter referred to as "this policy" /This Privacy Policy") and remind you: This policy applies to products or services on this platform. If the products or services provided by the platform are used in the products or services of our affiliates (for example, using the platform account directly) but there is no independent privacy policy, this policy also applies to the products or services. It is important to note that this policy does not apply to other third-party services provided by you, nor to products or services on this platform that have been independently set up with a privacy policy. Before using the products or services on this platform, please read and understand this policy carefully, and use the related products or services after confirming that you fully understand and agree. By using the products or services on this platform, you understand and agree to this policy. If you have any questions, comments or suggestions about the content of this policy, you can contact us through various contact methods provided by this platform. This privacy policy section will help you understand the following: How we collect and use your personal information How do we use cookies and similar technologies? How do we share, transfer, and publicly disclose your personal information? How we protect your personal information How do you manage your personal information? How do we deal with the personal information of minors? How your personal information is transferred globally How to update this privacy policy How to contact us 一、How we collect and use your personal information Personal information refers to various information recorded electronically or otherwise that can identify a specific natural person or reflect the activities of a particular natural person, either alone or in combination with other information. We collect and use your information for the purposes described in this policy. Personal information: (一)Help you become our user To create an account so that we can serve you, you will need to provide the following information: your nickname, avatar, gender, date of birth, mobile number/signal/QQ number, and create a username and password. During the registration process, if you provide the following additional information to supplement your personal information, it will help us to provide you with better service and experience: your real name, real ID information, hometown, emotional status, constellation, occupation, school Your real avatar. However, if you do not provide this information, it will not affect the basic functions of using the platform products or services. The above information provided by you will continue to authorize us during your use of the Service. When you voluntarily cancel your account, we will make it anonymous or delete your personal information as soon as possible in accordance with applicable laws and regulations. (二)Show and push goods or services for you In order to improve our products or services and provide you with personalized information search and transaction services, we will extract your browsing, search preferences, behavioral habits based on your browsing and search history, device information, location information, and transaction information. Features such as location information, indirect crowd portraits based on feature tags, and display and push information. If you do not want to accept commercials that we send to you, you can cancel them at any time through the product unsubscribe feature. (三)Provide goods or services to you 1、Information you provide to us Relevant personal information that you provide to us when registering for an account or using our services, such as phone numbers, emails, bank card numbers or Alipay accounts; The shared information that you provide to other parties through our services and the information that you store when you use our services. Before providing the platform with the aforementioned personal information of the other party, you need to ensure that you have obtained your authorization. 2、Information we collect during your use of the service In order to provide you with page display and search results that better suit your needs, understand product suitability, and identify account anomalies, we collect and correlate information about the services you use and how they are used, including: Device Information: We will receive and record information about the device you are using (such as device model, operating system version, device settings, unique device identifier, etc.) based on the specific permissions you have granted during software installation and use. Information about the location of the device (such as Idiv address, GdivS location, and Wi-Fi that can provide relevant information) Sensor information such as access points, Bluetooth and base stations. Since the services we provide are based on the mobile social services provided by the geographic location, you confirm that the successful registration of the "this platform" account is deemed to confirm the authorization to extract, disclose and use your geographic location information. . If you need to terminate your location information to other users, you can set it to be invisible at any time. Log information: When you use our website or the products or services provided by the client, we will automatically collect your detailed usage of our services as a related web log. For example, your search query content, Idiv address, browser type, telecom carrier, language used, date and time of access, and web page history you visit. Please note that separate device information, log information, etc. are information that does not identify a particular natural person. If we combine such non-personal information with other information to identify a particular natural person or use it in conjunction with personal information, such non-personal information will be treated as personal information during the combined use, except for your authorization. Or as otherwise provided by laws and regulations, we will anonymize and de-identify such personal information. When you contact us, we may save information such as your communication/call history and content or the contact information you left in order to contact you or help you solve the problem or to document the resolution and results of the problem. 3、Your personal information collected through indirect access You can use the products or services provided by our affiliates through the link of the platform provided by our platform account. In order to facilitate our one-stop service based on the linked accounts and facilitate your unified management, we will show you on this platform. Information or recommendations for information you are interested in, including information from live broadcasts and games. You can discover and use the above services through the homepage of the platform, "More" and other functions. When you use the above services through our products or services, you authorize us to receive, aggregate, and analyze from our affiliates based on actual business and cooperation needs, we confirm that their source is legal or that you authorize to consent to your personal information provided to us or Trading Information. If you refuse to provide the above information or refuse to authorize, you may not be able to use the corresponding products or services of our affiliates, or can not display relevant information, but does not affect the use of the platform to browse, chat, release dynamics and other core services. (四)Provide you with security Please note that in order to ensure the authenticity of the user's identity and provide you with better security, you can provide us with identification information such as identity card, military officer's card, passport, driver's license, social security card, residence permit, facial identification, and other biometric information. Personally sensitive information such as Sesame Credit and other real-name certifications. If you refuse to provide the above information, you may not be able to use services such as account management, live broadcast, and continuing risky transactions, but it will not affect your use of browsing, chat and other services. To improve the security of your services provided by us and our affiliates and partners, protect the personal and property of you or other users or the public from being compromised, and better prevent phishing websites, fraud, network vulnerabilities, computer viruses, cyber attacks , security risks such as network intrusion, more accurately identify violations of laws and regulations or the relevant rules of the platform, we may use or integrate your user information, transaction information, equipment information, related web logs and our affiliates, partners to obtain You authorize or rely on the information shared by law to comprehensively judge your account and transaction risks, conduct identity verification, detect and prevent security incidents, and take necessary records, audits, analysis, and disposal measures in accordance with the law. (五)Other uses When we use the information for other purposes not covered by this policy, or if the information collected for a specific purpose is used for other purposes, you will be asked for your prior consent. (六)Exception for authorization of consent According to relevant laws and regulations, collecting your personal information in the following situations does not require your authorized consent: 1、Related to national security and national defense security; 2、Related to public safety, public health, and major public interests; 3、Related to criminal investigation, prosecution, trial and execution of judgments, etc.; 4、It is difficult to obtain your own consent for the maintenance of the important legal rights of the personal information or other individuals’ lives and property; 5、The personal information collected is disclosed to the public by yourself; 二、How do we use cookies and similar technologies? (一)Cookies To ensure that your site is up and running, to give you an easier access experience, and to recommend content that may be of interest to you, we store a small data file called a cookie on your computer or mobile device. Cookies usually contain an identifier, a site name, and some numbers and characters. With cookies, websites can store data such as your preferences. (二)Website Beacons and Pixel Labels In addition to cookies, we use other technologies like web beacons and pixel tags on our website. For example, the email we send to you may contain an address link to the content of our website. If you click on the link, we will track the click to help us understand your product or service preferences so that we can proactively improve customer service. Experience. A web beacon is usually a transparent image that is embedded in a website or email. With the pixel tags in the email, we can tell if the email is open. If you don't want your event to be tracked this way, you can unsubscribe from our mailing list at any time. 三、How do we share, transfer, and publicly disclose your personal information? (一)shared We do not share your personal information with companies, organizations, and individuals other than the platform's service providers, with the following exceptions: 1、Sharing with explicit consent: We will share your personal information with others after obtaining your explicit consent. 2、Sharing under statutory circumstances: We may share your personal information in accordance with laws and regulations, litigation dispute resolution needs, or in accordance with the requirements of the administrative and judicial authorities. 3. Sharing with affiliates: In order to facilitate our services to you based on linked accounts, we recommend information that may be of interest to you or protect the personal property of affiliates or other users or the public of this platform from being infringed. Personal information may be shared with our affiliates. We will only share the necessary personal information (for example, to facilitate the use of our affiliated company products or services, we will share your necessary account information with affiliates) if we share your personal sensitive information or affiliate changes The use of personal information and the purpose of processing will be re-examined for your authorization. 4. Sharing with Authorized Partners: For the purposes stated in this Privacy Policy, some of our services will be provided by us and our authorized partners. We may share some of your personal information with our partners to provide better customer service and user experience. For example, arrange a partner to provide services. We will only share your personal information for legitimate, legitimate, necessary, specific, and specific purposes, and will only share the personal information necessary to provide the service. Our partners are not authorized to use shared personal information for other purposes unrelated to the product or service. Currently, our authorized partners include the following types: (2) Suppliers, service providers and other partners. We send information to suppliers, service providers and other partners who support our business, including providing technical infrastructure services, analyzing how our services are used, measuring the effectiveness of advertising and services, providing customer service, and facilitating payments. Or conduct academic research and investigations. (1) Authorized partners in advertising and analytics services. We will not use your personally identifiable information (information that identifies you, such as your name or email address, which can be used to contact you or identify you) and provide advertising and analytics services, unless you have your permission. Shared by partners. We will provide these partners with information about their advertising coverage and effectiveness, without providing your personally identifiable information, or we may aggregate this information so that it does not identify you personally. For example, we’ll only tell advertisers how effective their ads are when they agree to comply with our advertising guidelines, or how many people see their ads or install apps after seeing ads, or work with them. Partners provide statistical information that does not identify individuals (eg “male, 25-29 years old, in Beijing”) to help them understand their audience or customers. For companies, organizations and individuals with whom we share personal information, we will enter into strict data protection agreements with them to process individuals in accordance with our instructions, this Privacy Policy and any other relevant confidentiality and security measures. information. (2) Transfer We do not transfer your personal information to any company, organization or individual, except: Transfer with the express consent: After obtaining your explicit consent, we will transfer your personal information to other parties; 2, in the case of mergers, acquisitions or bankruptcy liquidation, or other circumstances involving mergers, acquisitions or bankruptcy liquidation, if it involves the transfer of personal information, we will require new companies and organizations that hold your personal information to continue to receive This policy is bound, otherwise we will ask the company, organization and individual to re-seek your consent. (3) Public disclosure We will only publicly disclose your personal information in the following circumstances: We may publicly disclose your personal information by obtaining your explicit consent or based on your active choice; 2, if we determine that you have violated laws and regulations or serious violations of the relevant rules of the platform, or to protect the personal safety of the platform and its affiliates users or the public from infringement, we may be based on laws and regulations or The relevant agreement rules of this platform disclose your personal information, including related violations, and the measures that the platform has taken against you, with your consent. (4) Exceptions for prior authorization of consent when sharing, transferring, and publicly disclosing personal information In the following situations, sharing, transferring, and publicly disclosing your personal information does not require prior authorization from you: Related to national security and national defense security; Related to public safety, public health, and major public interests; 3, related to criminal investigation, prosecution, trial and judgment execution; 4, in order to protect your or other individuals' life, property and other important legal rights but it is difficult to get my consent; Personal information that you disclose to the public on your own; Collect personal information from legally publicly disclosed information, such as legal news reports and government information disclosure. According to the law, sharing, transferring and de-identifying personal information, and ensuring that the data recipient cannot recover and re-identify the personal information subject, does not belong to the external sharing, transfer and public disclosure of personal information. The preservation and processing of the class data will not require additional notice and your consent. How do we protect your personal information? (1) We have taken reasonable and feasible security measures in accordance with the industry's general solutions to protect the security of personal information provided by you, and to prevent unauthorized access, public disclosure, use, modification, damage or loss of personal information. For example, SSL (Secure Socket) when exchanging data (such as credit card information) between your browser and the server Layer) protocol encryption protection; we use encryption technology to improve the security of personal information; we use a trusted protection mechanism to prevent personal information from being maliciously attacked; we will deploy access control mechanisms to ensure that only authorized personnel can access individuals Information; and we will conduct security and privacy protection training courses to enhance employees' awareness of the importance of protecting personal information. (2) We have advanced data security management system around the data life cycle, which enhances the security of the whole system from organizational construction, system design, personnel management, product technology and other aspects. (3) We will take reasonable and feasible measures and try our best to avoid collecting irrelevant personal information. We will only retain your personal information for the period of time required to achieve the purposes stated in this policy, unless the retention period is extended or permitted by law. (4) The Internet is not an absolutely secure environment. We strongly recommend that you do not use personal communication methods that are not recommended by this platform. You can connect and share with each other through our services. When you create communications, transactions, or sharing through our services, you can choose who you want to communicate, trade, or share as a third party who can see your trading content, contact information, exchange information, or share content. If you find that your personal information, especially your account or password, has been leaked, please contact our customer service immediately so that we can take appropriate measures according to your application. Please note that the information you voluntarily share or even share publicly when using our services may involve personal information of you or others or even sensitive personal information, such as when you post a news or choose to upload in public in group chats, circles, etc. A picture containing personal information. Please consider more carefully whether you share or even share information publicly when using our services. Please use complex passwords to help us keep your account secure. We will do our best to protect the security of any information you send us. At the same time, we will report the handling of personal information security incidents in accordance with the requirements of the regulatory authorities. V. How your personal information is transferred globally Personal information collected and generated by us during our operations in the People's Republic of China is stored in China, with the following exceptions: Laws and regulations have clear provisions; 2, get your explicit authorization; 3, you through the Internet for cross-border live broadcast / release dynamics and other personal initiatives. In response to the above, we will ensure that your personal information is adequately protected in accordance with this Privacy Policy.
Mario-Kart-Felix
2020 was a roller coaster of major, world-shaking events. We all couldn't wait for the year to end. But just as 2020 was about to close, it pulled another fast one on us: the SolarWinds hack, one of the biggest cybersecurity breaches of the 21st century. The SolarWinds hack was a major event not because a single company was breached, but because it triggered a much larger supply chain incident that affected thousands of organizations, including the U.S. government. What is SolarWinds? SolarWinds is a major software company based in Tulsa, Okla., which provides system management tools for network and infrastructure monitoring, and other technical services to hundreds of thousands of organizations around the world. Among the company's products is an IT performance monitoring system called Orion. As an IT monitoring system, SolarWinds Orion has privileged access to IT systems to obtain log and system performance data. It is that privileged position and its wide deployment that made SolarWinds a lucrative and attractive target. What is the SolarWinds hack? The SolarWinds hack is the commonly used term to refer to the supply chain breach that involved the SolarWinds Orion system. In this hack, suspected nation-state hackers that have been identified as a group known as Nobelium by Microsoft -- and often simply referred to as the SolarWinds Hackers by other researchers -- gained access to the networks, systems and data of thousands of SolarWinds customers. The breadth of the hack is unprecedented and one of the largest, if not the largest, of its kind ever recorded. More than 30,000 public and private organizations -- including local, state and federal agencies -- use the Orion network management system to manage their IT resources. As a result, the hack compromised the data, networks and systems of thousands when SolarWinds inadvertently delivered the backdoor malware as an update to the Orion software. SolarWinds customers weren't the only ones affected. Because the hack exposed the inner workings of Orion users, the hackers could potentially gain access to the data and networks of their customers and partners as well -- enabling affected victims to grow exponentially from there. Orion Platform hack compromised networks of thousands of SolarWinds customers Hackers compromised a digitally signed SolarWinds Orion network monitoring component, opening a backdoor into the networks of thousands of SolarWinds government and enterprise customers. How did the SolarWinds hack happen? The hackers used a method known as a supply chain attack to insert malicious code into the Orion system. A supply chain attack works by targeting a third party with access to an organization's systems rather than trying to hack the networks directly. The third-party software, in this case the SolarWinds Orion Platform, creates a backdoor through which hackers can access and impersonate users and accounts of victim organizations. The malware could also access system files and blend in with legitimate SolarWinds activity without detection, even by antivirus software. SolarWinds was a perfect target for this kind of supply chain attack. Because their Orion software is used by many multinational companies and government agencies, all the hackers had to do was install the malicious code into a new batch of software distributed by SolarWinds as an update or patch. The SolarWinds hack timeline Here is a timeline of the SolarWinds hack: September 2019. Threat actors gain unauthorized access to SolarWinds network October 2019. Threat actors test initial code injection into Orion Feb. 20, 2020. Malicious code known as Sunburst injected into Orion March 26, 2020. SolarWinds unknowingly starts sending out Orion software updates with hacked code According to a U.S. Department of Homeland Security advisory, the affected versions of SolarWinds Orion are versions are 2019.4 through 2020.2.1 HF1. More than 18,000 SolarWinds customers installed the malicious updates, with the malware spreading undetected. Through this code, hackers accessed SolarWinds's customer information technology systems, which they could then use to install even more malware to spy on other companies and organizations. Who was affected? According to reports, the malware affected many companies and organizations. Even government departments such as Homeland Security, State, Commerce and Treasury were affected, as there was evidence that emails were missing from their systems. Private companies such as FireEye, Microsoft, Intel, Cisco and Deloitte also suffered from this attack. The breach was first detected by cybersecurity company FireEye. The company confirmed they had been infected with the malware when they saw the infection in customer systems. FireEye labeled the SolarWinds hack "UNC2452" and identified the backdoor used to gain access to its systems through SolarWinds as "Sunburst." Microsoft also confirmed that it found signs of the malware in its systems, as the breach was affecting its customers as well. Reports indicated Microsoft's own systems were being used to further the hacking attack, but Microsoft denied this claim to news agencies. Later, the company worked with FireEye and GoDaddy to block and isolate versions of Orion known to contain the malware to cut off hackers from customers' systems. They did so by turning the domain used by the backdoor malware used in Orion as part of the SolarWinds hack into a kill switch. The kill switch here served as a mechanism to prevent Sunburst from operating further. Nonetheless, even with the kill switch in place, the hack is still ongoing. Investigators have a lot of data to look through, as many companies using the Orion software aren't yet sure if they are free from the backdoor malware. It will take a long time before the full impact of the hack is known. Why did it take so long to detect the SolarWinds attack? With attackers having first gained access to the SolarWinds systems in September 2019 and the attack not being publicly discovered or reported until December 2020, attackers may well have had 14 or more months of unfettered access. The time it takes between when an attacker is able to gain access and the time an attack is actually discovered is often referred to as dwell time. According to a report released in January 2020 by security firm CrowdStrike, the average dwell time in 2019 was 95 days. Given that it took well over a year from the time the attackers first entered the SolarWinds network until the breach was discovered, the dwell time in the attack exceeded the average. The question of why it took so long to detect the SolarWinds attack has a lot to do with the sophistication of the Sunburst code and the hackers that executed the attack. "Analysis suggests that by managing the intrusion through multiple servers based in the United States and mimicking legitimate network traffic, the attackers were able to circumvent threat detection techniques employed by both SolarWinds, other private companies, and the federal government," SolarWinds said in its analysis of the attack. FireEye, which was the first firm to publicly report the attack, conducted its own analysis of the SolarWinds attack. In its report, FireEye described in detail the complex series of action that the attackers took to mask their tracks. Even before Sunburst attempts to connect out to its command-and-control server, the malware executes a number of checks to make sure no antimalware or forensic analysis tools are running. What was the purpose of the hack? The purpose of the hack remains largely unknown. Still, there are many reasons hackers would want to get into an organization's system, including having access to future product plans or employee and customer information held for ransom. It is also not yet clear what information, if any, hackers stole from government agencies. But the level of access appears to be deep and broad. There are speculations that many enterprises might be collateral damage, as the main focus of the attack was government agencies that make use of the SolarWinds IT management systems. Who was responsible for the hack? Federal investigators and cybersecurity agents believe a Russian espionage operation -- mostly likely Russia's Foreign Intelligence Service -- is behind the SolarWinds attack. The Russian government has denied any involvement in the attack, releasing a statement that said, "Malicious activities in the information space contradicts the principles of the Russian foreign policy, national interests and understanding of interstate relations." They also added that "Russia does not conduct offensive operations in the cyber domain." Contrary to experts in his administration, then-President Donald Trump hinted at around the time of the discovery of the SolarWinds hack that Chinese hackers might be behind the cybersecurity attack. However, he did not present any evidence to back up his claim. Shortly after his inauguration, President Joe Biden vowed that his administration intended to hold Russia accountable, through the launch of a full-scale intelligence assessment and review of the SolarWinds attack and those behind it. The president also created the position of deputy national security adviser for cybersecurity as part of the National Security Council. The role, held by veteran intelligence operative Anne Neuberger, is part of an overall bid by the Biden administration to refresh the federal government's approach to cybersecurity and better respond to nation-state actors. Naming the attack: What is Solorigate, Sunburst and Nobelium? The SolarWinds attack has a number of different names associated with it. While the attack is often referred to simply as the SolarWinds attack, that isn't the only name to know. Sunburst. This is the name of the actual malicious code injection that was planted by hackers into the SolarWinds Orion IT monitoring system code. Both SolarWinds and CrowdStrike generally refer to the attack as Sunburst. Solorigate. Microsoft initially dubbed the actual threat actor group behind the SolarWinds attack as Solorigate. It's a name that stuck and was adopted by other researchers as well as media. Nobelium. In March 2021, Microsoft decided that the primary designation for the threat actor behind the SolarWinds attack should actually be Nobelium -- the idea being that the group is active against multiple victims -- not just SolarWinds -- and uses more malware than just Sunburst. The China connection to the SolarWinds attack While it is suspected that the initial Sunburst code and the attack against SolarWinds and its users came from a threat actor based in Russia, other nation-state threat actors have also used SolarWinds in attacks. According to a Reuters report, suspected nation-state hackers based in China exploited SolarWinds during the same period of time the Sunburst attack occurred. The suspected China-based threat actors targeted the National Finance Center, which is a payroll agency within the U.S. Department of Agriculture. It is suspected that the China-based attackers did not use Sunburst, but rather a different malware that SolarWinds identifies as Supernova. Why is the SolarWinds hack important? The SolarWinds supply chain attack is a global hack, as threat actors turned the Orion software into a weapon gaining access to several government systems and thousands of private systems around the world. Due to the nature of the software -- and by extension the Sunburst malware -- having access to entire networks, many government and enterprise networks and systems face the risk of significant breaches. The hack could also be the catalyst for rapid, broad change in the cybersecurity industry. Many companies and government agencies are now in the process of devising new methods to react to these types of attacks before they happen. Governments and organizations are learning that it is not enough to build a firewall and hope it protects them. They have to actively seek out vulnerabilities in their systems, and either shore them up or turn them into traps against these types of attacks. Since the hack was discovered, SolarWinds has recommended customers update their existing Orion platform. The company has released patches for the malware and other potential vulnerabilities discovered since the initial Orion attack. SolarWinds also recommended customers not able to update Orion isolate SolarWinds servers and/or change passwords for accounts that have access to those servers. The greater White House cybersecurity focus will be crucial, some industry experts have said. But organizations should consider adopting modern software-as-a-service tools for monitoring and collaboration. While the cybersecurity industry has significantly advanced in the last decade, these kinds of attacks show that there is still a long way to go to get really secure systems. The Nobelium group continues to attack targets The suspected threat actor group behind the SolarWinds attack has remained active in 2021 and hasn't stopped at just targeting SolarWinds. On May 27, 2021, Microsoft reported that Nobelium, the group allegedly behind the SolarWinds attack, infiltrated software from email marketing service Constant Contact. According to Microsoft, Nobelium targeted approximately 3,000 email accounts at more than 150 different organizations. The initial attack vector appears to be an account used by USAID. From that initial foothold, Nobelium was able to send out phishing emails in an attempt to get victims to click on a link that would deploy a backdoor Trojan designed to steal user information.
Ch-Jad
# Cmder [](https://gitter.im/cmderdev/cmder?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://ci.appveyor.com/project/MartiUK/cmder) Cmder is a **software package** created out of pure frustration over absence of usable console emulator on Windows. It is based on [ConEmu](https://conemu.github.io/) with *major* config overhaul, comes with a Monokai color scheme, amazing [clink](https://chrisant996.github.io/clink/) (further enhanced by [clink-completions](https://github.com/vladimir-kotikov/clink-completions)) and a custom prompt layout.  ## Why use it The main advantage of Cmder is portability. It is designed to be totally self-contained with no external dependencies, which makes it great for **USB Sticks** or **cloud storage**. So you can carry your console, aliases and binaries (like wget, curl and git) with you anywhere. The Cmder's user interface is also designed to be more eye pleasing, and you can compare the main differences between Cmder and ConEmu [here](https://conemu.github.io/en/cmder.html). ## Installation ### Single User Portable Config 1. Download the [latest release](https://github.com/cmderdev/cmder/releases/) 2. Extract the archive. *Note: This path should not be `C:\Program Files` or anywhere else that would require Administrator access for modifying configuration files* 3. (optional) Place your own executable files into the `%cmder_root%\bin` folder to be injected into your PATH. 4. Run `Cmder.exe` ### Shared Cmder install with Non-Portable Individual User Config 1. Download the [latest release](https://github.com/cmderdev/cmder/releases/) 2. Extract the archive to a shared location. 3. (optional) Place your own executable files and custom app folders into the `%cmder_root%\bin`. See: [bin/README.md](./bin/Readme.md) - This folder to be injected into your PATH by default. - See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively. 4. (optional) Place your own custom app folders into the `%cmder_root%\opt`. See: [opt/README.md](./opt/Readme.md) - This folder will NOT be injected into your PATH so you have total control of what gets added. 5. Run `Cmder.exe` with `/C` command line argument. Example: `cmder.exe /C %userprofile%\cmder_config` * This will create the following directory structure if it is missing. ``` c:\users\[CH JaDi Rajput]\cmder_config ├───bin ├───config │ └───profile.d └───opt ``` - (optional) Place your own executable files and custom app folders into `%userprofile%\cmder_config\bin`. - This folder to be injected into your PATH by default. - See `/max_depth [1-5]` in 'Command Line Arguments for `init.bat`' table to add subdirectories recursively. - (optional) Place your own custom app folders into the `%user_profile%\cmder_config\opt`. - This folder will NOT be injected into your PATH so you have total control of what gets added. * Both the shared install and the individual user config locations can contain a full set of init and profile.d scripts enabling shared config with user overrides. See below. ## Cmder.exe Command Line Arguments | Argument | Description | | ------------------- | ----------------------------------------------------------------------- | | `/C [user_root_path]` | Individual user Cmder root folder. Example: `%userprofile%\cmder_config` | | `/M` | Use `conemu-%computername%.xml` for ConEmu settings storage instead of `user_conemu.xml` | | `/REGISTER [ALL, USER]` | Register a Windows Shell Menu shortcut. | | `/UNREGISTER [ALL, USER]` | Un-register a Windows Shell Menu shortcut. | | `/SINGLE` | Start Cmder in single mode. | | `/START [start_path]` | Folder path to start in. | | `/TASK [task_name]` | Task to start after launch. | | `/X [ConEmu extras pars]` | Forwards parameters to ConEmu | ## Context Menu Integration So you've experimented with Cmder a little and want to give it a shot in a more permanent home; ### Shortcut to open Cmder in a chosen folder 1. Open a terminal as an Administrator 2. Navigate to the directory you have placed Cmder 3. Execute `.\cmder.exe /REGISTER ALL` _If you get a message "Access Denied" ensure you are executing the command in an **Administrator** prompt._ In a file explorer window right click in or on a directory to see "Cmder Here" in the context menu. ## Keyboard shortcuts ### Tab manipulation * <kbd>Ctrl</kbd> + <kbd>T</kbd> : New tab dialog (maybe you want to open cmd as admin?) * <kbd>Ctrl</kbd> + <kbd>W</kbd> : Close tab * <kbd>Ctrl</kbd> + <kbd>D</kbd> : Close tab (if pressed on empty command) * <kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>#Number</kbd> : Fast new tab: <kbd>1</kbd> - CMD, <kbd>2</kbd> - PowerShell * <kbd>Ctrl</kbd> + <kbd>Tab</kbd> : Switch to next tab * <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Tab</kbd> : Switch to previous tab * <kbd>Ctrl</kbd> + <kbd>#Number</kbd> : Switch to tab #Number * <kbd>Alt</kbd> + <kbd>Enter</kbd>: Fullscreen ### Shell * <kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>U</kbd> : Traverse up in directory structure (lovely feature!) * <kbd>End</kbd>, <kbd>Home</kbd>, <kbd>Ctrl</kbd> : Traversing text with as usual on Windows * <kbd>Ctrl</kbd> + <kbd>R</kbd> : History search * <kbd>Shift</kbd> + Mouse : Select and copy text from buffer _(Some shortcuts are not yet documented, though they exist - please document them here)_ ## Features ### Access to multiple shells in one window using tabs You can open multiple tabs each containing one of the following shells: | Task | Shell | Description | | ---- | ----- | ----------- | | Cmder | `cmd.exe` | Windows `cmd.exe` shell enhanced with Git, Git aware prompt, Clink (GNU Readline), and Aliases. | | Cmder as Admin | `cmd.exe` | Administrative Windows `cmd.exe` Cmder shell. | | PowerShell | `powershell.exe` | Windows PowerShell enhanced with Git and Git aware prompt . | | PowerShell as Admin | `powershell.exe` | Administrative Windows `powershell.exe` Cmder shell. | | Bash | `bash.exe` | Unix/Linux like bash shell running on Windows. | | Bash as Admin | `bash.exe` | Administrative Unix/Linux like bash shell running on Windows. | | Mintty | `bash.exe` | Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences | | Mintty as Admin | `bash.exe` | Administrative Unix/Linux like bash shell running on Windows. See below for Mintty configuration differences | Cmder, PowerShell, and Bash tabs all run on top of the Windows Console API and work as you might expect in Cmder with access to use ConEmu's color schemes, key bindings and other settings defined in the ConEmu Settings dialog. ⚠ *NOTE:* Only the full edition of Cmder comes with a pre-installed bash, using a vendored [git-for-windows](https://gitforwindows.org/) installation. The pre-configured Bash tabs may not work on Cmder mini edition without additional configuration. You may however, choose to use an external installation of bash, such as Microsoft's [Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/install-win10) (called WSL) or the [Cygwin](https://cygwin.com/) project which provides POSIX support on windows. ⚠ *NOTE:* Mintty tabs use a program called 'mintty' as the terminal emulator that is not based on the Windows Console API, rather it's rendered graphically by ConEmu. Mintty differs from the other tabs in that it supports xterm/xterm-256color TERM types, and does not work with ConEmu settings like color schemes and key bindings. As such, some differences in functionality are to be expected, such as Cmder not being able to apply a system-wide configuration to it. As a result mintty specific config is done via the `[%USERPROFILE%|$HOME]/.minttyrc` file. You may read more about Mintty and its config file [here](https://github.com/mintty/mintty). An example of setting Cmder portable terminal colors for mintty: From a bash/mintty shell: ``` cd $CMDER_ROOT/vendor git clone https://github.com/karlin/mintty-colors-solarized.git cd mintty-colors-solarized/ echo source \$CMDER_ROOT/vendor/mintty-colors-solarized/mintty-solarized-dark.sh>>$CMDER_ROOT/config/user_profile.sh ``` You may find some Monokai color schemes for mintty to match Cmder [here](https://github.com/oumu/mintty-color-schemes/blob/master/base16-monokai-mod.minttyrc). ### Changing Cmder Default `cmd.exe` Prompt Config File The default Cmder shell `cmd::Cmder` prompt is customized using `Clink` and is configured by editing a config file that exists in one of two locations: - Single User Portable Config `%CMDER_ROOT%\config\cmder_prompt_config.lua` - Shared Cmder install with Non-Portable Individual User Config `%CMDER_USER_CONFIG%\cmder_prompt_config.lua` If your Cmder setup does not have this file create it from `%CMDER_ROOT%\vendor\cmder_prompt_config.lua.default` Customizations include: - Colors. - Single/Multi-line. - Full path/Folder only. - `[user]@[host]` to the beginning of the prompt. - `~` for home directory. - `λ` symbol Documentation is in the file for each setting. ### Changing Cmder Default `cmd.exe` Shell Startup Behaviour Using Task Arguments 1. Press <kbd>Win</kbd> + <kbd>Alt</kbd> + <kbd>T</kbd> 1. Click either: * `1. {cmd::Cmder as Admin}` * `2. {cmd::Cmder}` 1. Add command line arguments where specified below: *Note: Pay attention to the quotes!* ``` cmd /s /k ""%ConEmuDir%\..\init.bat" [ADD ARGS HERE]" ``` ##### Command Line Arguments for `init.bat` | Argument | Description | Default | | ----------------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------- | | `/c [user cmder root]` | Enables user bin and config folders for 'Cmder as admin' sessions due to non-shared environment. | not set | | `/d` | Enables debug output. | not set | | `/f` | Enables Cmder Fast Init Mode. This disables some features, see pull request [#1492](https://github.com/cmderdev/cmder/pull/1942) for more details. | not set | | `/t` | Enables Cmder Timed Init Mode. This displays the time taken run init scripts | not set | | `/git_install_root [file path]` | User specified Git installation root path. | `%CMDER_ROOT%\vendor\Git-for-Windows` | | `/home [home folder]` | User specified folder path to set `%HOME%` environment variable. | `%userprofile%` | | `/max_depth [1-5]` | Define max recurse depth when adding to the path for `%cmder_root%\bin` and `%cmder_user_bin%` | 1 | | `/nix_tools [0-2]` | Define how `*nix` tools are added to the path. Prefer Windows Tools: 1, Prefer *nix Tools: 2, No `/usr/bin` in `%PATH%`: 0 | 1 | | `/svn_ssh [path to ssh.exe]` | Define `%SVN_SSH%` so we can use git svn with ssh svn repositories. | `%GIT_INSTALL_ROOT%\bin\ssh.exe` | | `/user_aliases [file path]` | File path pointing to user aliases. | `%CMDER_ROOT%\config\user_aliases.cmd` | | `/v` | Enables verbose output. | not set | | (custom arguments) | User defined arguments processed by `cexec`. Type `cexec /?` for more usage. | not set | ### Cmder Shell User Config Single user portable configuration is possible using the cmder specific shell config files. Edit the below files to add your own configuration: | Shell | Cmder Portable User Config | | ------------- | ----------------------------------------- | | Cmder | `%CMDER_ROOT%\config\user_profile.cmd` | | PowerShell | `$ENV:CMDER_ROOT\config\user_profile.ps1` | | Bash/Mintty | `$CMDER_ROOT/config/user_profile.sh` | Note: Bash and Mintty sessions will also source the `$HOME/.bashrc` file if it exists after it sources `$CMDER_ROOT/config/user_profile.sh`. You can write `*.cmd|*.bat`, `*.ps1`, and `*.sh` scripts and just drop them in the `%CMDER_ROOT%\config\profile.d` folder to add startup config to Cmder. | Shell | Cmder `Profile.d` Scripts | | ------------- | -------------------------------------------------- | | Cmder | `%CMDER_ROOT%\config\profile.d\*.bat and *.cmd` | | PowerShell | `$ENV:CMDER_ROOT\config\profile.d\*.ps1` | | Bash/Mintty | `$CMDER_ROOT/config/profile.d/*.sh` | #### Git Status Opt-Out To disable Cmder prompt git status globally add the following to `~/.gitconfig` or locally for a single repo `[repo]/.git/config` and start a new session. *Note: This configuration is not portable* ``` [cmder] status = false # Opt out of Git status for 'ALL' Cmder supported shells. cmdstatus = false # Opt out of Git status for 'Cmd.exe' shells. psstatus = false # Opt out of Git status for 'Powershell.exe and 'Pwsh.exe' shells. shstatus = false # Opt out of Git status for 'bash.exe' shells. ``` ### Aliases #### Cmder(`Cmd.exe`) Aliases You can define simple aliases for `cmd.exe` sessions with a command like `alias name=command`. Cmd.exe aliases support optional parameters through the `$1-9` or the `$*` special characters so the alias `vi=vim.exe $*` typed as `vi [filename]` will open `[filename]` in `vim.exe`. Cmd.exe aliases can also be more complex. See: [DOSKEY.EXE documentation](https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/doskey) for additional details on complex aliases/macros for `cmd.exe` Aliases defined using the `alias.bat` command will automatically be saved in the `%CMDER_ROOT%\config\user_aliases.cmd` file To make an alias and/or any other profile settings permanent add it to one of the following: Note: These are loaded in this order by `$CMDER_ROOT/vendor/init.bat`. Anything stored in `%CMDER_ROOT%` will be a portable setting and will follow cmder to another machine. * `%CMDER_ROOT%\config\profile.d\*.cmd` and `\*.bat` * `%CMDER_ROOT%\config\user_aliases.cmd` * `%CMDER_ROOT%\config\user_profile.cmd` #### Bash.exe|Mintty.exe Aliases Bash shells support simple and complex aliases with optional parameters natively so they work a little different. Typing `alias name=command` will create an alias only for the current running session. To make an alias and/or any other profile settings permanent add it to one of the following: Note: These are loaded in this order by `$CMDER_ROOT/vendor/git-for-windows/etc/profile.d/cmder.sh`. Anything stored in `$CMDER_ROOT` will be a portable setting and will follow cmder to another machine. * `$CMDER_ROOT/config/profile.d/*.sh` * `$CMDER_ROOT/config/user_profile.sh` * `$HOME/.bashrc` If you add bash aliases to `$CMDER_ROOT/config/user_profile.sh` they will be portable and follow your Cmder folder if you copy it to another machine. `$HOME/.bashrc` defined aliases are not portable. #### PowerShell.exe Aliases PowerShell has native simple alias support, for example `[new-alias | set-alias] alias command`, so complex aliases with optional parameters are not supported in PowerShell sessions. Type `get-help [new-alias|set-alias] -full` for help on PowerShell aliases. To make an alias and/or any other profile settings permanent add it to one of the following: Note: These are loaded in this order by `$ENV:CMDER_ROOT\vendor\user_profile.ps1`. Anything stored in `$ENV:CMDER_ROOT` will be a portable setting and will follow cmder to another machine. * `$ENV:CMDER_ROOT\config\profile.d\*.ps1` * `$ENV:CMDER_ROOT\config\user_profile.ps1` ### SSH Agent To start the vendored SSH agent simply call `start-ssh-agent`, which is in the `vendor/git-for-windows/cmd` folder. If you want to run SSH agent on startup, include the line `@call "%GIT_INSTALL_ROOT%/cmd/start-ssh-agent.cmd"` in `%CMDER_ROOT%/config/user_profile.cmd` (usually just uncomment it). ### Vendored Git Cmder is by default shipped with a vendored Git installation. On each instance of launching Cmder, an attempt is made to locate any other user provided Git binaries. Upon finding a `git.exe` binary, Cmder further compares its version against the vendored one _by executing_ it. The vendored `git.exe` binary is _only_ used when it is more recent than the user-installed one. You may use your favorite version of Git by including its path in the `%PATH%` environment variable. Moreover, the **Mini** edition of Cmder (found on the [downloads page](https://github.com/cmderdev/cmder/releases)) excludes any vendored Git binaries. ### Using external Cygwin/Babun, MSys2, WSL, or Git for Windows SDK with Cmder. You may run bash (the default shell used on Linux, macOS and GNU/Hurd) externally on Cmder, using the following instructions: 1. Setup a new task by pressing <kbd>Win</kbd> +<kbd>Alt</kbd> + <kbd>T</kbd>. 1. Click the `+` button to add a task. 1. Name the new task in the top text box. 1. Provide task parameters, this is optional. 1. Add `cmd /c "[path_to_external_env]\bin\bash --login -i" -new_console` to the `Commands` text box. **Recommended Optional Steps:** Copy the `vendor/cmder_exinit` file to the Cygwin/Babun, MSys2, or Git for Windows SDK environments `/etc/profile.d/` folder to use portable settings in the `$CMDER_ROOT/config` folder. Note: MinGW could work if the init scripts include `profile.d` but this has not been tested. The destination file extension depends on the shell you use in that environment. For example: * bash - Copy to `/etc/profile.d/cmder_exinit.sh` * zsh - Copy to `/etc/profile.d/cmder_exinit.zsh` Uncomment and edit the below line in the script to use Cmder config even when launched from outside Cmder. ``` # CMDER_ROOT=${USERPROFILE}/cmder # This is not required if launched from Cmder. ``` ### Customizing user sessions using `init.bat` custom arguments. You can pass custom arguments to `init.bat` and use `cexec.cmd` in your `user_profile.cmd` to evaluate these arguments then execute commands based on a particular flag being detected or not. `init.bat` creates two shortcuts for using `cexec.cmd` in your profile scripts. #### `%ccall%` - Evaluates flags, runs commands if found, and returns to the calling script and continues. ``` ccall=call C:\Users\user\cmderdev\vendor\bin\cexec.cmd ``` Example: `%ccall% /startnotepad start notepad.exe` #### `%cexec%` - Evaluates flags, runs commands if found, and does not return to the calling script. ``` cexec=C:\Users\user\cmderdev\vendor\bin\cexec.cmd ``` Example: `%cexec% /startnotepad start notepad.exe` It is useful when you have multiple tasks to execute `cmder` and need it to initialize the session differently depending on the task chosen. To conditionally start `notepad.exe` when you start a specific `cmder` task: * Press <kbd>win</kbd>+<kbd>alt</kbd>+<kbd>t</kbd> * Click `+` to add a new task. * Add the below to the `Commands` block: ```batch cmd.exe /k ""%ConEmuDir%\..\init.bat" /startnotepad" ``` * Add the below to your `%cmder_root%\config\user_profile.cmd` ```batch %ccall% "/startNotepad" "start" "notepad.exe"` ``` To see detailed usage of `cexec`, type `cexec /?` in cmder. ### Integrating Cmder with [Hyper](https://github.com/zeit/hyper), [Microsoft VS Code](https://code.visualstudio.com/), and your favorite IDEs Cmder by default comes with a vendored ConEmu installation as the underlying terminal emulator, as stated [here](https://conemu.github.io/en/cmder.html). However, Cmder can in fact run in a variety of other terminal emulators, and even integrated IDEs. Assuming you have the latest version of Cmder, follow the following instructions to get Cmder working with your own terminal emulator. For instructions on how to integrate Cmder with your IDE, please read our [Wiki section](https://github.com/cmderdev/cmder/wiki#cmder-integration). ## Upgrading The process of upgrading Cmder depends on the version/build you are currently running. If you have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running a newer version of Cmder, follow the below process: 1. Exit all Cmder sessions and relaunch `[cmder_root]/cmder.exe`, this backs up your existing `[cmder_root]/vendor/conemu-maximus5/conemu.xml` to `[cmder_root]/config/user[-|_]conemu.xml`. * The `[cmder_root]/config/user[-|_]conemu.xml` contains any custom settings you have made using the 'Setup Tasks' settings dialog. 2. Exit all Cmder sessions and backup any files you have manually edited under `[cmder_root]/vendor`. * Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in `[cmder_root]/config` folder. 3. Delete the `[cmder_root]/vendor` folder. 4. Extract the new `cmder.zip` or `cmder_mini.zip` into `[cmder_root]/` overwriting all files when prompted. If you do not have a `[cmder_root]/config/user[-|_]conemu.xml`, you are running an older version of cmder, follow the below process: 1. Exit all Cmder sessions and backup `[cmder_root]/vendor/conemu-maximus5/conemu.xml` to `[cmder_root]/config/user[-|_]conemu.xml`. 2. Backup any files you have manually edited under `[cmder_root]/vendor`. * Editing files under `[cmder_root]/vendor` is not recommended since you will need to re-apply these changes after any upgrade. All user customizations should go in `[cmder_root]/config` folder. 3. Delete the `[cmder_root]/vendor` folder. 4. Extract the new `cmder.zip` or `cmder_mini.zip` into `[cmder_root]/` overwriting all files when prompted. ## Current development builds You can download builds of the current development branch by going to AppVeyor via the following link: [](https://ci.appveyor.com/project/MartiUK/cmder/branch/master/artifacts) ## License All software included is bundled with own license The MIT License (MIT) Copyright (c) 2016 Samuel Vasko Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
lhai36366
WPF Partial Trust Security Article 10 minutes to read In general, Internet applications should be restricted from having direct access to critical system resources, to prevent malicious damage. By default, HTML and client-side scripting languages are not able to access critical system resources. Because Windows Presentation Foundation (WPF) browser-hosted applications can be launched from the browser, they should conform to a similar set of restrictions. To enforce these restrictions, WPF relies on both Code Access Security (CAS) and ClickOnce (see WPF Security Strategy - Platform Security). By default, browser-hosted applications request the Internet zone CAS set of permissions, irrespective of whether they are launched from the Internet, the local intranet, or the local computer. Applications that run with anything less than the full set of permissions are said to be running with partial trust. WPF provides a wide variety of support to ensure that as much functionality as possible can be used safely in partial trust, and along with CAS, provides additional support for partial trust programming. This topic contains the following sections: WPF Feature Partial Trust Support Partial Trust Programming Managing Permissions WPF Feature Partial Trust Support The following table lists the high-level features of Windows Presentation Foundation (WPF) that are safe to use within the limits of the Internet zone permission set. Table 1: WPF Features that are Safe in Partial Trust Feature Area Feature General Browser Window Site of Origin Access IsolatedStorage (512KB Limit) UIAutomation Providers Commanding Input Method Editors (IMEs) Tablet Stylus and Ink Simulated Drag/Drop using Mouse Capture and Move Events OpenFileDialog XAML Deserialization (via XamlReader.Load) Web Integration Browser Download Dialog Top-Level User-Initiated Navigation mailto:links Uniform Resource Identifier Parameters HTTPWebRequest WPF Content Hosted in an IFRAME Hosting of Same-Site HTML Pages using Frame Hosting of Same Site HTML Pages using WebBrowser Web Services (ASMX) Web Services (using Windows Communication Foundation) Scripting Document Object Model Visuals 2D and 3D Animation Media (Site Of Origin and Cross-Domain) Imaging/Audio/Video Reading FlowDocuments XPS Documents Embedded & System Fonts CFF & TrueType Fonts Editing Spell Checking RichTextBox Plaintext and Ink Clipboard Support User-Initiated Paste Copying Selected Content Controls General Controls This table covers the WPF features at a high level. For more detailed information, the Windows Software Development Kit (SDK) documents the permissions that are required by each member in WPF. Additionally, the following features have more detailed information regarding partial trust execution, including special considerations. XAML (see XAML Overview (WPF)). Popups (see System.Windows.Controls.Primitives.Popup). Drag and Drop (see Drag and Drop Overview). Clipboard (see System.Windows.Clipboard). Imaging (see System.Windows.Controls.Image). Serialization (see XamlReader.Load, XamlWriter.Save). Open File Dialog Box (see Microsoft.Win32.OpenFileDialog). The following table outlines the WPF features that are not safe to run within the limits of the Internet zone permission set. Table 2: WPF Features that are Not Safe in Partial Trust Feature Area Feature General Window (Application Defined Windows and Dialog Boxes) SaveFileDialog File System Registry Access Drag and Drop XAML Serialization (via XamlWriter.Save) UIAutomation Clients Source Window Access (HwndHost) Full Speech Support Windows Forms Interoperability Visuals Bitmap Effects Image Encoding Editing Rich Text Format Clipboard Full XAML support Partial Trust Programming For XBAP applications, code that exceeds the default permission set will have different behavior depending on the security zone. In some cases, the user will receive a warning when they attempt to install it. The user can choose to continue or cancel the installation. The following table describes the behavior of the application for each security zone and what you have to do for the application to receive full trust. Security Zone Behavior Getting Full Trust Local computer Automatic full trust No action is needed. Intranet and trusted sites Prompt for full trust Sign the XBAP with a certificate so that the user sees the source in the prompt. Internet Fails with "Trust Not Granted" Sign the XBAP with a certificate. Note The behavior described in the previous table is for full trust XBAPs that do not follow the ClickOnce Trusted Deployment model. In general, code that may exceed the allowed permissions is likely to be common code that is shared between both standalone and browser-hosted applications. CAS and WPF offer several techniques for managing this scenario. Detecting Permissions Using CAS In some situations, it is possible for shared code in library assemblies to be used by both standalone applications and XBAPs. In these cases, code may execute functionality that could require more permissions than the application's awarded permission set allows. Your application can detect whether or not it has a certain permission by using Microsoft .NET Framework security. Specifically, it can test whether it has a specific permission by calling the Demand method on the instance of the desired permission. This is shown in the following example, which has code that queries for whether it has the ability to save a file to the local disk: Imports System.IO ' File, FileStream, StreamWriter Imports System.IO.IsolatedStorage ' IsolatedStorageFile Imports System.Security ' CodeAccesPermission, IsolatedStorageFileStream Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess Imports System.Windows ' MessageBox Namespace SDKSample Public Class FileHandling Public Sub Save() If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then ' Write to local disk Using stream As FileStream = File.Create("c:\newfile.txt") Using writer As New StreamWriter(stream) writer.WriteLine("I can write to local disk.") End Using End Using Else MessageBox.Show("I can't write to local disk.") End If End Sub ' Detect whether or not this application has the requested permission Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean Try ' Try and get this permission requestedPermission.Demand() Return True Catch Return False End Try End Function ... End Class End Namespace using System.IO; // File, FileStream, StreamWriter using System.IO.IsolatedStorage; // IsolatedStorageFile using System.Security; // CodeAccesPermission, IsolatedStorageFileStream using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess using System.Windows; // MessageBox namespace SDKSample { public class FileHandling { public void Save() { if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt"))) { // Write to local disk using (FileStream stream = File.Create(@"c:\newfile.txt")) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("I can write to local disk."); } } else { MessageBox.Show("I can't write to local disk."); } } // Detect whether or not this application has the requested permission bool IsPermissionGranted(CodeAccessPermission requestedPermission) { try { // Try and get this permission requestedPermission.Demand(); return true; } catch { return false; } } ... } } If an application does not have the desired permission, the call to Demand will throw a security exception. Otherwise, the permission has been granted. IsPermissionGranted encapsulates this behavior and returns true or false as appropriate. Graceful Degradation of Functionality Being able to detect whether code has the permission to do what it needs to do is interesting for code that can be executed from different zones. While detecting the zone is one thing, it is far better to provide an alternative for the user, if possible. For example, a full trust application typically enables users to create files anywhere they want, while a partial trust application can only create files in isolated storage. If the code to create a file exists in an assembly that is shared by both full trust (standalone) applications and partial trust (browser-hosted) applications, and both applications want users to be able to create files, the shared code should detect whether it is running in partial or full trust before creating a file in the appropriate location. The following code demonstrates both. Imports System.IO ' File, FileStream, StreamWriter Imports System.IO.IsolatedStorage ' IsolatedStorageFile Imports System.Security ' CodeAccesPermission Imports System.Security.Permissions ' FileIOPermission, FileIOPermissionAccess Imports System.Windows ' MessageBox Namespace SDKSample Public Class FileHandlingGraceful Public Sub Save() If IsPermissionGranted(New FileIOPermission(FileIOPermissionAccess.Write, "c:\newfile.txt")) Then ' Write to local disk Using stream As FileStream =tênthietbi:<hailuu(GT-19195)>phienban.android<4.4.2>capdovaloibaomat<2016-05-01>phienban.baseband<19195xxscQA3> File.Create("c:\newfile.txt") Using writer As New StreamWriter(stream) writer.WriteLine("I can write to local disk.") End Using End Using Else ' Persist application-scope property to ' isolated storage Dim storage As IsolatedStorageFile =phien.kernel<3.4.0-8086469>#¿¿¿¿¿#(#DPI@SWHC3707#1)¿¿¿¿¿WE¿JAN<4 20:32:33 KST2017¿¿¿¿¿>#sohieubantao#¿<kot49h.19195xxscQA3¿¿¿¿>#<trangthai.SE.cho"ANDROID"ENFORCING¿¿¿¿¿#<Sepf-9T-19195-4.4.2-0054>#¿¿¿¿¿-web¿an#<04 20:31:30 2017>¿¿¿¿¿#secureboo¿¿¿atus<¿#"type:SAMSUNG"¿¿¿¿¿#>| <?xml version="1.0" encoding="UTF-8"?> <feed xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xml:lang="en-US"> <id>tag:github.com,2008:/Hailuu3333</id> <link type="text/html" rel="alternate" href="https://github.com/Hailuu3333"/> <link type="application/atom+xml" rel="self" href="https://github.com/Hailuu3333.private.atom?token=AWURDBH7ASDDKL3TWM5OQS57363BS"/> <title>Private Feed for Hailuu3333</title> <updated>2022-01-03T17:58:47Z</updated> <entry> <id>tag:github.com,2008:PushEvent/19562318704</id> <published>2022-01-03T17:58:47Z</published> <updated>2022-01-03T17:58:47Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/e746e8910e...5e157d1ff0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:58:47Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/5e157d1ff014dcb8f80f421cdd001bdec6fba990" rel="noreferrer">5e157d1</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for PerformanceResourceTiming API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090544464" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14304" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14304/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14304" rel="noreferrer">#14304</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562301951</id> <published>2022-01-03T17:57:13Z</published> <updated>2022-01-03T17:57:13Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/ba5bbe1657...e746e8910e"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:57:13Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/e746e8910e7defdbf34cc9ef0e05965debe30f4f" rel="noreferrer">e746e89</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for PerformanceObserverEntryList API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090457391" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14301" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14301/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14301" rel="noreferrer">#14301</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562295899</id> <published>2022-01-03T17:56:39Z</published> <updated>2022-01-03T17:56:39Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/f52107082e...ba5bbe1657"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:56:39Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/ba5bbe16577941c22b7e69856f1dcfacbb5a3328" rel="noreferrer">ba5bbe1</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for PerformanceMeasure API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090448000" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14299" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14299/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14299" rel="noreferrer">#14299</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562286119</id> <published>2022-01-03T17:55:43Z</published> <updated>2022-01-03T17:55:43Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/04b6bd0c15...f52107082e"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:55:43Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/f52107082e4f9ef8ac6e98b3f7dfd2795309d824" rel="noreferrer">f521070</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for PerformanceMark API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090446499" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14298" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14298/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14298" rel="noreferrer">#14298</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562263337</id> <published>2022-01-03T17:53:34Z</published> <updated>2022-01-03T17:53:34Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/75674de739...04b6bd0c15"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:53:34Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/04b6bd0c157e737639b1ae7f94f30fa2168effa3" rel="noreferrer">04b6bd0</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for PerformanceEventTiming API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090443593" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14296" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14296/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14296" rel="noreferrer">#14296</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562241843</id> <published>2022-01-03T17:51:36Z</published> <updated>2022-01-03T17:51:36Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/29a6974a75...75674de739"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:51:36Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/75674de739775f3dd4cddef82d09b98c9a058cf9" rel="noreferrer">75674de</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for api.PerformanceEventTiming.toJSON (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090445235" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14297" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14297/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14297" rel="noreferrer">#14297</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562237548</id> <published>2022-01-03T17:51:13Z</published> <updated>2022-01-03T17:51:13Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/bf39eba737...29a6974a75"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:51:13Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/29a6974a75547ca3bac6b24878bb0967c864f41a" rel="noreferrer">29a6974</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for api.OffscreenCanvasRenderingContext2D.can… </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562232818</id> <published>2022-01-03T17:50:48Z</published> <updated>2022-01-03T17:50:48Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/3eeeac9f61...bf39eba737"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:50:48Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/bf39eba7371b943fbe862dff0af4d0406729f94f" rel="noreferrer">bf39eba</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for OTPCredential API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090403975" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14290" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14290/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14290" rel="noreferrer">#14290</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19562188285</id> <published>2022-01-03T17:46:40Z</published> <updated>2022-01-03T17:46:40Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/4bff6425fa...3eeeac9f61"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:46:40Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/3eeeac9f61d756098fe70aeb24f502e6017750f4" rel="noreferrer">3eeeac9</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for CanvasPattern API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089195844" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14202" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14202/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14202" rel="noreferrer">#14202</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561882855</id> <published>2022-01-03T17:19:44Z</published> <updated>2022-01-03T17:19:44Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/a74e1ff439...4bff6425fa"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:19:44Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/4bff6425faac6cbb58b15fc609993d960edd6827" rel="noreferrer">4bff642</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for NDEF APIs (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090332102" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14283" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14283/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14283" rel="noreferrer">#14283</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561829380</id> <published>2022-01-03T17:15:22Z</published> <updated>2022-01-03T17:15:22Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/edf64e0c97...a74e1ff439"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:15:22Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/a74e1ff4395fb92a0844164f5463d64632e7c2ca" rel="noreferrer">a74e1ff</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for MessageChannel API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090079194" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14272" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14272/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14272" rel="noreferrer">#14272</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561819576</id> <published>2022-01-03T17:14:35Z</published> <updated>2022-01-03T17:14:35Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/ebbed37e94...edf64e0c97"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:14:35Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/edf64e0c97fdfae1dc818946f8227ab94724d056" rel="noreferrer">edf64e0</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for api.MediaStreamAudioSourceNode.me… </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561801160</id> <published>2022-01-03T17:13:04Z</published> <updated>2022-01-03T17:13:04Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/20fa4010c1...ebbed37e94"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:13:04Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/ebbed37e948956bcbc9022f49ef6f33abca74e46" rel="noreferrer">ebbed37</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for MediaKeyMessageEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090075095" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14268" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14268/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14268" rel="noreferrer">#14268</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561788980</id> <published>2022-01-03T17:12:05Z</published> <updated>2022-01-03T17:12:05Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/d9a8229dc0...20fa4010c1"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:12:05Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/20fa4010c12cd5a0e74b1eb8cbea4d3afd89f264" rel="noreferrer">20fa401</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for api.MediaElementAudioSourceNode.m… </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561782081</id> <published>2022-01-03T17:11:33Z</published> <updated>2022-01-03T17:11:33Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/219bae08f0...d9a8229dc0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:11:33Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/d9a8229dc08bed161e100d25ca154375f0333fb3" rel="noreferrer">d9a8229</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for MediaDeviceInfo API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090073619" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14266" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14266/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14266" rel="noreferrer">#14266</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561757800</id> <published>2022-01-03T17:09:36Z</published> <updated>2022-01-03T17:09:36Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/77f4c09ac6...219bae08f0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:09:36Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/219bae08f0ff3917c23d60cfa18d4701d8153d26" rel="noreferrer">219bae0</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Edge versions for KeyframeEffect API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1090071498" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14265" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14265/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14265" rel="noreferrer">#14265</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561683563</id> <published>2022-01-03T17:03:51Z</published> <updated>2022-01-03T17:03:51Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/8d3ddcf273...77f4c09ac6"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:03:51Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/77f4c09ac6f380764dc5af24fb460e2d8d2303e4" rel="noreferrer">77f4c09</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for IdleDetector API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089631424" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14258" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14258/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14258" rel="noreferrer">#14258</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561641770</id> <published>2022-01-03T17:00:42Z</published> <updated>2022-01-03T17:00:42Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/43b1c984e3...8d3ddcf273"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T17:00:42Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/8d3ddcf273becc09f9b9b36139326ca26eee4589" rel="noreferrer">8d3ddcf</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for HTMLQuoteElement API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089623277" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14256" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14256/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14256" rel="noreferrer">#14256</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561618310</id> <published>2022-01-03T16:58:55Z</published> <updated>2022-01-03T16:58:55Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/e0b6775007...43b1c984e3"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:58:55Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/43b1c984e3a15c611b0abc314cc8b0046664d3b5" rel="noreferrer">43b1c98</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for HTMLFormControlsCollection API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089618163" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14253" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14253/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14253" rel="noreferrer">#14253</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561587537</id> <published>2022-01-03T16:56:25Z</published> <updated>2022-01-03T16:56:25Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/69f98959d0...e0b6775007"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:56:25Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/e0b67750076ad0d93393ccb085d1dc54d773253e" rel="noreferrer">e0b6775</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for api.HTMLElement.outerText (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089616978" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14252" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14252/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14252" rel="noreferrer">#14252</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561489898</id> <published>2022-01-03T16:48:36Z</published> <updated>2022-01-03T16:48:36Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/528d168175...69f98959d0"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:48:36Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/69f98959d01049d80574d185e8e74b11bacad813" rel="noreferrer">69f9895</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for HTMLCanvasElement API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089594658" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14251" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14251/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14251" rel="noreferrer">#14251</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561478464</id> <published>2022-01-03T16:47:42Z</published> <updated>2022-01-03T16:47:42Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/1c83c46f3b...528d168175"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:47:42Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/528d168175ca12effcb92663441b0bb5dba86c36" rel="noreferrer">528d168</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for GamepadHapticActuator API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089591518" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14250" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14250/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14250" rel="noreferrer">#14250</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561470552</id> <published>2022-01-03T16:47:04Z</published> <updated>2022-01-03T16:47:04Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/8988fadf71...1c83c46f3b"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:47:04Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/1c83c46f3b35669320196ee8ed4c058e6e27f81b" rel="noreferrer">1c83c46</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for FormDataEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089591110" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14249" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14249/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14249" rel="noreferrer">#14249</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561432212</id> <published>2022-01-03T16:44:01Z</published> <updated>2022-01-03T16:44:01Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/aee84e62b4...8988fadf71"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:44:01Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/8988fadf71141dc430fee7270277952475021227" rel="noreferrer">8988fad</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for FormData API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089590697" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14248" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14248/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14248" rel="noreferrer">#14248</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561367603</id> <published>2022-01-03T16:38:51Z</published> <updated>2022-01-03T16:38:51Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/ac60c669b9...aee84e62b4"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:38:51Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/aee84e62b43d1ef88fa59b157870bd2489d6586d" rel="noreferrer">aee84e6</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox Android versions for api.FetchEvent.handled (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089588080" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14245" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14245/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14245" rel="noreferrer">#14245</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561363029</id> <published>2022-01-03T16:38:29Z</published> <updated>2022-01-03T16:38:29Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/6e0eb31096...ac60c669b9"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:38:29Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/ac60c669b9fd4329e9d466de32b45535970748de" rel="noreferrer">ac60c66</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Chromium versions for FederatedCredential API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089587721" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14244" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14244/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14244" rel="noreferrer">#14244</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561354449</id> <published>2022-01-03T16:37:48Z</published> <updated>2022-01-03T16:37:48Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/625928c8b1...6e0eb31096"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:37:48Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/6e0eb31096b675addd01f2a4c7086881cf77b19e" rel="noreferrer">6e0eb31</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for ExtendableMessageEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089586405" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14243" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14243/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14243" rel="noreferrer">#14243</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561344598</id> <published>2022-01-03T16:37:00Z</published> <updated>2022-01-03T16:37:00Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/5f702b8587...625928c8b1"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:37:00Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/625928c8b125e9d7d4a86fa8c4e87ec3ff3cb69b" rel="noreferrer">625928c</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update WebView versions for ExtendableCookieChangeEvent API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089583771" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14242" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14242/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14242" rel="noreferrer">#14242</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561318915</id> <published>2022-01-03T16:35:01Z</published> <updated>2022-01-03T16:35:01Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/e68f72ae70...5f702b8587"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:35:01Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/5f702b8587e131920441b60a96e28b6b7324efe7" rel="noreferrer">5f702b8</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update Firefox versions for api.EventSource.EventSource (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089583044" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14241" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14241/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14241" rel="noreferrer">#14241</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> <entry> <id>tag:github.com,2008:PushEvent/19561277837</id> <published>2022-01-03T16:31:50Z</published> <updated>2022-01-03T16:31:50Z</updated> <link type="text/html" rel="alternate" href="https://github.com/mdn/browser-compat-data/compare/31a42b62de...e68f72ae70"/> <title type="html">foolip pushed to main in mdn/browser-compat-data</title> <author> <name>foolip</name> <uri>https://github.com/foolip</uri> </author> <media:thumbnail height="30" width="30" url="https://avatars.githubusercontent.com/u/498917?s=30&v=4"/> <content type="html"><div class="push"><div class="body"> <!-- push --> <div class="d-flex flex-items-baseline border-bottom color-border-muted py-3"> <span class="mr-2"><a class="d-inline-block" href="/foolip" rel="noreferrer"><img class="avatar avatar-user" src="https://avatars.githubusercontent.com/u/498917?s=64&amp;v=4" width="32" height="32" alt="@foolip"></a></span> <div class="d-flex flex-column width-full"> <div class=""> <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/foolip" rel="noreferrer">foolip</a> pushed to <a class="Link--primary no-underline wb-break-all text-bold d-inline-block" href="/mdn/browser-compat-data" rel="noreferrer">mdn/browser-compat-data</a> <span class="color-fg-muted no-wrap f6 ml-1"> <relative-time datetime="2022-01-03T16:31:50Z" class="no-wrap">Jan 3, 2022</relative-time> </span> <div class="Box p-3 mt-2 "> <span>1 commit to</span> <a class="branch-name" href="/mdn/browser-compat-data/tree/main" rel="noreferrer">main</a> <div class="commits "> <ul class="list-style-none"> <li class="d-flex flex-items-baseline"> <span title="queengooborg"> <a class="d-inline-block" href="/queengooborg" rel="noreferrer"><img class="mr-1 avatar-user" src="https://avatars.githubusercontent.com/u/5179191?s=32&amp;v=4" width="16" height="16" alt="@queengooborg"></a> </span> <code><a class="mr-1" href="/mdn/browser-compat-data/commit/e68f72ae70c99bb9c5be7489cce03c6e4d44c8f7" rel="noreferrer">e68f72a</a></code> <div class="dashboard-break-word lh-condensed"> <blockquote> Update all browsers versions for Event API (<a class="issue-link js-issue-link" data-error-text="Failed to load title" data-id="1089581729" data-permission-text="Title is private" data-url="https://github.com/mdn/browser-compat-data/issues/14239" data-hovercard-type="pull_request" data-hovercard-url="/mdn/browser-compat-data/pull/14239/hovercard" href="https://github.com/mdn/browser-compat-data/pull/14239" rel="noreferrer">#14239</a>) </blockquote> </div> </li> </ul> </div> </div> </div> </div> </div> </div></div></content> </entry> </feed> IsolatedStorageFile.GetUserStoreForApplication() Using stream As New IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage) Using writer As New StreamWriter(stream) writer.WriteLine("I can write to Isolated Storage") End Using End Using End If End Sub ' Detect whether or not this application has the requested permission Private Function IsPermissionGranted(ByVal requestedPermission As CodeAccessPermission) As Boolean Try ' Try and get this permission requestedPermission.Demand() Return True Catch Return False End Try End Function ... End Class End Namespace using System.IO; // File, FileStream, StreamWriter using System.IO.IsolatedStorage; // IsolatedStorageFile using System.Security; // CodeAccesPermission using System.Security.Permissions; // FileIOPermission, FileIOPermissionAccess using System.Windows; // MessageBox namespace SDKSample { public class FileHandlingGraceful { public void Save() { if (IsPermissionGranted(new FileIOPermission(FileIOPermissionAccess.Write, @"c:\newfile.txt"))) { // Write to local disk using (FileStream stream = File.Create(@"c:\newfile.txt")) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("I can write to local disk."); } } else { // Persist application-scope property to // isolated storage IsolatedStorageFile storage = IsolatedStorageFile.GetUserStoreForApplication(); using (IsolatedStorageFileStream stream = new IsolatedStorageFileStream("newfile.txt", FileMode.Create, storage)) using (StreamWriter writer = new StreamWriter(stream)) { writer.WriteLine("I can write to Isolated Storage"); } } } // Detect whether or not this application has the requested permission bool IsPermissionGranted(CodeAccessPermission requestedPermission) { try { // Try and get this permission requestedPermission.Demand(); return true; } catch { return false; } } ... } } In many cases, you should be able to find a partial trust alternative. In a controlled environment, such as an intranet, custom managed frameworks can be installed across the client base into the global assembly cache (GAC). These libraries can execute code that requires full trust, and be referenced from applications that are only allowed partial trust by using AllowPartiallyTrustedCallersAttribute (for more information, see Security (WPF) and WPF Security Strategy - Platform Security). Browser Host Detection Using CAS to check for permissions is a suitable technique when you need to check on a per-permission basis. Although, this technique depends on catching exceptions as a part of normal processing, which is not recommended in general and can have performance issues. Instead, if your XAML browser application (XBAP) only runs within the Internet zone sandbox, you can use the BrowserInteropHelper.IsBrowserHosted property, which returns true for XAML browser applications (XBAPs). Note IsBrowserHosted only distinguishes whether an application is running in a browser, not which set of permissions an application is running with. Managing Permissions By default, XBAPs run with partial trust (default Internet zone permission set). However, depending on the requirements of the application, it is possible to change the set of permissions from the default. For example, if an XBAPs is launched from a local intranet, it can take advantage of an increased permission set, which is shown in the following table. Table 3: LocalIntranet and Internet Permissions Permission Attribute LocalIntranet Internet DNS Access DNS servers Yes No Environment Variables Read Yes No File Dialogs Open Yes Yes File Dialogs Unrestricted Yes No Isolated Storage Assembly isolation by user Yes No Isolated Storage Unknown isolation Yes Yes Isolated Storage Unlimited user quota Yes No Media Safe audio, video, and images Yes Yes Printing Default printing Yes No Printing Safe printing Yes Yes Reflection Emit Yes No Security Managed code execution Yes Yes Security Assert granted permissions Yes No User Interface Unrestricted Yes No User Interface Safe top level windows Yes Yes User Interface Own Clipboard Yes Yes Web Browser Safe frame navigation to HTML Yes Yes Note Cut and Paste is only allowed in partial trust when user initiated. If you need to increase permissions, you need to change the project settings and the ClickOnce application manifest. For more information, see WPF XAML Browser Applications Overview. The following documents may also be helpful. Mage.exe (Manifest Generation and Editing Tool). MageUI.exe (Manifest Generation and Editing Tool, Graphical Client). Securing ClickOnce Applications. If your XBAP requires full trust, you can use the same tools to increase the requested permissions. Although an XBAP will only receive full trust if it is installed on and launched from the local computer, the intranet, or from a URL that is listed in the browser's trusted or allowed sites. If the application is installed from the intranet or a trusted site, the user will receive the standard ClickOnce prompt notifying them of the elevated permissions. The user can choose to continue or cancel the installation. Alternatively, you can use the ClickOnce Trusted Deployment model for full trust deployment from any security zone. For more information, see Trusted Application Deployment Overview and Security (WPF). See Also Concepts Security (WPF) WPF Security Strategy - Platform Security WPF Security Strategy - Security Engineering Theme Previous Version Docs Blog Contribute Privacy & Cookies Terms of Use Trademarks © Microsoft 2021
Content Based Recommendation system uses attributes of the content to recommend similar content. It doesn't have a cold-start problem because it works through attributes or tags of the content, such as actors, genres or directors, so that new movies can be recommended right away.
The Paging library helps you load and display pages of data from a larger dataset from local storage or over network. This approach allows your app to use both network bandwidth and system resources more efficiently. The components of the Paging library are designed to fit into the recommended Android app architecture, integrate cleanly with other Jetpack components, and provide first-class Kotlin support.
wellingtoncabral
EasyPermissionsKt is a lightweight Android library that abstracts all runtime permission boilerplate code to simplify the system permissions management. The lib is lifecycle aware and uses the new recommended way to get results from activities (https://developer.android.com/training/basics/intents/result?hl=pt-br)
EntireNewsProject
A news application in Android that offers the recommended, summarized news articles in as short and crisp format from multiple news sources per user’s choice. Key Features: Recommendation System Engine (gives recommended news articles), NLP Summarization (gives a 5 sentence summarized for each articles), Popularity-based Trending System (to stay up-to date with the most popular news) and Multiple news sources to choose (Over 15 News Sources). Download the app at http://www.entirenews.tk and please share your feedback with us
82goober82
Fluxion is the future of MITM WPA attacks Fluxion is a security auditing and social-engineering research tool. It is a remake of linset by vk496 with (hopefully) less bugs and more functionality. The script attempts to retrieve the WPA/WPA2 key from a target access point by means of a social engineering (phishing) attack. It's compatible with the latest release of Kali (rolling). Fluxion's attacks' setup is mostly manual, but experimental auto-mode handles some of the attacks' setup parameters. Read the FAQ before requesting issues. If you need quick help, fluxion is also avaible on gitter. You can talk with us on Gitter or on Discord. Installation Read here before you do the following steps. Download the latest revision git clone --recursive git@github.com:FluxionNetwork/fluxion.git Switch to tool's directory cd fluxion Run fluxion (missing dependencies will be auto-installed) ./fluxion.sh Fluxion is also available in arch cd bin/arch makepkg or using the blackarch repo pacman -S fluxion scroll Changelog Fluxion gets weekly updates with new features, improvements, and bugfixes. Be sure to check out the changelog here. :octocat: How to contribute All contributions are welcome! Code, documentation, graphics, or even design suggestions are welcome; use GitHub to its fullest. Submit pull requests, contribute tutorials or other wiki content -- whatever you have to offer, it'll be appreciated but please follow the style guide. book How it works Scan for a target wireless network. Launch the Handshake Snooper attack. Capture a handshake (necessary for password verification). Launch Captive Portal attack. Spawns a rogue (fake) AP, imitating the original access point. Spawns a DNS server, redirecting all requests to the attacker's host running the captive portal. Spawns a web server, serving the captive portal which prompts users for their WPA/WPA2 key. Spawns a jammer, deauthenticating all clients from original AP and lureing them to the rogue AP. All authentication attempts at the captive portal are checked against the handshake file captured earlier. The attack will automatically terminate once a correct key has been submitted. The key will be logged and clients will be allowed to reconnect to the target access point. For a guide to the Captive Portal attack, read the Captive Portal attack guide exclamation Requirements A Linux-based operating system. We recommend Kali Linux 2 or Kali rolling. Kali 2 & rolling support the latest aircrack-ng versions. An external wifi card is recommended. Related work For development I use vim and tmux. Here are my dotfiles :octocat: Credits l3op - contributor dlinkproto - contributor vk496 - developer of linset Derv82 - @Wifite/2 Princeofguilty - @webpages and @buteforce Photos for wiki @http://www.kalitutorials.net Ons Ali @wallpaper PappleTec @sites MPX4132 - Fluxion V3 Disclaimer Authors do not own the logos under the /attacks/Captive Portal/sites/ directory. Copyright Disclaimer Under Section 107 of the Copyright Act 1976, allowance is made for "fair use" for purposes such as criticism, comment, news reporting, teaching, scholarship, and research. The usage of Fluxion for attacking infrastructures without prior mutual consent could be considered an illegal activity, and is highly discouraged by its authors/developers. It is the end user's responsibility to obey all applicable local, state and federal laws. Authors assume no liability and are not responsible for any misuse or damage caused by this program. Note Beware of sites pretending to be related with the Fluxion Project. These may be delivering malware. Fluxion DOES NOT WORK on Linux Subsystem For Windows 10, because the subsystem doesn't allow access to network interfaces. Any Issue regarding the same would be Closed Immediately Links Fluxion website: https://fluxionnetwork.github.io/fluxion/ Discord: https://discordapp.com/invite/G43gptk Gitter: https://gitter.im/FluxionNetwork/Lobby
Shivansh-juyal
This Recommend you the movies of your interset
PritamAich
This is a Recommedation System based project where Top 5 books will be recommended to a user.
yumei86
A chat robot on LINE, with a recommended system of ramen in Taiwan.
A system that analyses patient symptoms and provides preliminary diagnoses along with recommended treatments⚕️
AlchemyTweaks
Here you will find experimental system tweaks that remain optional, non-validated, and not recommended for general use. These configurations lack empirical verification, may introduce instability under certain workloads, and are provided solely for exploratory or research-oriented evaluation.
mitulmanish
You are required to implement a basic Java program using Java (SE 5.0 or later). This assignment is designed to help you: 1. Practise your knowledge of class design in Java; 2. Practise the implementation of different kinds of OO constructs in Java; 3. Practise the use of polymorphism; 4. Practise error handling in Java; 5. Develop a reasonable sized application in Java. General Implementation Details All input data should be read from the standard input and all output data should be printed to the standard output. Do not use files at all. If the input is formatted incorrectly, that input should be ignored and an appropriate error message should be displayed. Marks will be allocated to your class design. You are required to modularise classes properly---i.e., to use multiple methods as appropriate. No method should be longer than 50 lines. Marks will be allocated to proper documentation and coding layout and style. Your coding style should be consistent with standard coding conventions . Overall Specification You will build out the system from Assignment 1 to manage multiple users purchasing different types of items, including discounts for multiple items. Items to be Purchased The TechStore has been extended to sell Software as well as Books. Like Books, Software can be sold as a (physical) CD or as an online item (i.e., download). As in Assignment 1, a Book can also be sold as a physical copy or as an ebook. You need to keep track of the physical copies of Books and CDs, and whether or not a title is available as an online item. Books have a title and an author; Software items have a title and a publisher. Each item is individually priced---i.e., the price depends on the title and whether it is a physical copy or ebook/software-download. Purchasing Items A User can buy any number of items (books, software, or a mix), adding one item at a time to their Shopping Cart. However, a User can only purchase up to a total of $100, unless they are a Member—if a non-Member User tries to add an item to their Shopping Cart that takes the total over their maximum then this is blocked. A Member has no limit. Items can be added and removed from a Shopping Cart until Checkout. When an Item is added to the Shopping Cart, the system checks that there are enough copies of it available; if an Item is added or removed from the Shopping Cart, the number of copies available must be updated. Checkout clears the Shopping Cart. Users Users can add Items to their Cart, up to their allowed limit (i.e., their Shopping Cart cannot store a total greater than the limit). A User has an id (must be unique) and password (you do NOT need to make these encrypted or secure), as well as a name and email address. A Member is a special kind of user: a Member has no limit on value they can store in their Cart. Once a User has spent a total of 10% more than their limit in total (this obviously must be over multiple Checkouts), then they are offered to become a Member—this offer is made straight after they Checkout with the items that takes them to 10% over their limit. An Administrator is a User that can perform special functions: add to the number of copies of a (physical) Book or Software CD; change the price of an item; print sales statistics: i.e., number of sales (physical and electronic) of each Item; add a new user—the system must checked that the new id is unique. Other Users do not have these options on their menu. A user must keep track of their previous purchases, grouped by Transaction—a Transaction is the set of items purchased at Checkout time. Users can log in and out—they do not need to Checkout before logging out. However, only one user can be logged in at a time—the system must allow something like “change user”. If a User logs back in, their Shopping Cart holds the same contents as before they logged out. Recommended Items and Discounts Each item can store a list of “if you liked this” recommendations. If a User adds an Item to their Shopping Cart, then the system suggests other titles they may like. Only similar types of things are recommended—i.e., when a Book is added, other Books (not Software) are suggested. At the time when a list of Recommended titles is given, the user has the option to add one of the recommended titles to their Shopping Cart. If a user adds the title, then they receive a discount of 15% off that second title (the first one is still full price); the User can add multiple recommended titles for 15% off each of them. If a Member adds the recommended title, then they get 25% discount off all the recommendations added. Note: when a recommended title is added, its recommendations are also shown, and are discounted if purchased at that time. You are NOT required to handle the special case of updating discounts when a User removes recommendations from their Cart. However, there is a Bonus Mark for this. Sample menus The menu for a standard User (i.e., a Shopper) should include the following options: 1. Add item to shopping cart 2. View shopping cart 3. Remove item from shopping cart 4. Checkout 5. List all items 6. Print previous purchases 7. Logout (change user) 0. Quit The menu for an Administrator should include the following options: 1. List all items (this option can include purchase statistics for each title) 2. Add copies to item 3. Change price of item 4. Add new user 5. Logout (change user) 0. Quit * SAMPLE RUNS and TEST DATA will be posted to Blackboard * Program Development When implementing large programs, especially using object-oriented style, it is highly recommended that you build your program incrementally. This assignment proposes a specific incremental implementation process: this is designed to both help you think about building large programs, and to help ensure good progress! You are not strictly required to follow the structure below, but it will help you manage complexity. Part A (2 marks): Extend Assignment 1 Start by extending your Assignment 1 solution (a sample solution will be made available): 1. Rename your main class to TechStore if necessary; 2. Extend your Book class (if necessary) to contain all data and operations it needs for Assignment 2, and appropriate classes for other types of Items to be sold; 3. Define Exceptions to handle problems/errors; in particular, you must handle invalid menu options or inputs. Part B (1 marks): Class Design Define all the classes and any interfaces needed for the described system. In particular, you should try to encapsulate all the appropriate data and operations that a class needs. This may mean some classes refer to each other (e.g., the way Account refers to Customer). At this point, you may just want to think about the data and operations and just write the definitions, not all the code. Part C (3 marks): Main Program Your main program should be in the TechStore class. (Of course, any class can contain a main(); this is useful for testing that class.) The main program will contain a menu that offers all the required options (these can be different for different Users!). The system will allow a User to login by typing their id and password and will check that these match: if it does not then the menu prints an error; if they do match, then the system prints a welcome message with the user’s name and shows them the appropriate menu. The system must keep a list of all its Users: this list must be efficient to look-up by User id. Week 7 Demo (2 marks): You will be required to demonstrate your main program and design (with only bare functionality) by Week 7 at the latest. You must also submit to the associated WebLearn project by the Week 7 lecture. Part D (4 marks): Implement Core Functionality Implement the core functionality of the TechStore system described above, except for the recommendations, members, and discounts. You should be able to implement the rest of the TechStore functionality described above, and run and test your system. Part E (4 marks): Implement Recommendations , Members, Discounts Implement the functionality of providing recommendations, users becoming and being members, and discounts. Other (4 marks) As always, marks will be awarded for coding style, documentation/comments, code layout and clarity, meaningful error and other messages, proper error handling, choice of data structures and other design decisions. You are encouraged to discuss such issues with your tutors and lab assistants, or with the coding mentors. Bonus (2 marks) Note: There will be no hints or help offered on Bonus tasks. 1 bonus mark for early demonstration of Parts A,B,C in Week 6 1 bonus mark for correctly handling removal of recommended books from Cart—e.g., if a Member removes the first item then the 15/25% should be added back to the price of the recommended title, unless there are multiple recommendations linked to that title. Submission Instructions Full assignment submission will be via Weblearn, by 9AM, Tues April 28, 2015. You can submit your assignment as many times as you want before the due date. Each submission will overwrite any previous submissions. 1. You need to submit a class diagram (in pdf, gif or jpeg format). 2. You are required to submit your .java files weekly via Weblearn. Your progress will be taken into consideration if you need an extension. 3. There will be a separate WebLearn submission for Part A,B,C—you must submit to this before the Week 7 lecture to qualify for the 2 marks for Week 7 demo. 4. You must include a README file. This should describe how to run your program, what extra functionality you implemented, any standard functionality you know does not work, and any problems or assumptions. If the tutors have any problem running your program and the README does not help then you will lose marks. 5. For the code submission, you must include only the source files in your submission (do not submit any *.class files!). As always, your code must run on CSIT machines. 6. You must submit a single ZIP file—use zip/WinZIP to zip your files before submitting---do NOT submit rar or zipx files!! 7. If you use packages, it is your responsibility that these unpack properly into the correct folders and that your program compiles correctly.