instead of redefining macros (Issue #19, PR #20) Add functions to free memory allocated by objects (PR #15) Remove hardcoded paths and follow XDG base dir specs (PR #14) Documentation Added comment headers for auto-generation of documentation with javadoc to the function declarations (PR #21) README.md Added the dependency on libdbus COPYING: Added Priydarshi Singh Distribution tarballs in different formats: We generate them with gz, bz2, and xz compression now, as the other OpenPrinting packages. CUPS Backend Assure complete and up-to-date list of available printers (PR #20): Return printer list synchronously upon activation Subscribe to CUPS notifications for printer updates Automatically update frontends about new printers found, old printers lost, or printer state changed Translations: Added the support of cpdb-libs for translations Using general message string catalogs from CUPS and also message string catalogs from individual print queues/IPP printers. Message catalog management done by libcupsfilters 2.x, via the cfCatalog...() API functions (catalog.h). Added billing-info option (PR #19) The new versions of the CPDB components: cpdb-libs: More Details and Download, Discussion cpdb-backend-cups: More Details and Download, Discussion cpdb-backend-file: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:Common-Print-Dialog-Backends-Second-Generation-Seventh-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "Common Print Dialog Backends Second Generation - Seventh Beta Release!",
+ "url": "/Common-Print-Dialog-Backends-Second-Generation-Seventh-Beta-Release",
+ "headings": [],
+ "tags": [],
+ "snippet": "Seventh beta with many fixes for bugs found during GSoC 2024, API improvements, support for CUPS instances, and explanation how CPDB works.",
+ "content": "During the Google Summer of Code 2024 Biswadeep Purkayastha has added CPDB support to the print dialog of LibreOffice, mentored by Michael Weghorn, one of the LibreOffice developers. In addition to working on the print dialog of LibreOffice, they both have made a lot of contributions, mainly bug fixes, but also some improvements. Thanks, Biswadeep and Michael, for all these valuable contributions. Lots of API improvements Most of the API improvements are addition of new functions or turning formerly internal or static functions into public API functions, so they do not break any existing code. The only change which requires changes on existing code is the removal of the instance_name parameter from the API functions cpdbGetNewFrontendObj() and cpdbStartListingPrinters() (Pull request #41). An instance name turned out to not being needed to manage several frontends accessing one backend. One of the code pieces which needed attention due to that was GTK4, which stopped building in Ubuntu when I had uploaded this release of cpdb-libs. Asking my GSoC contributors for fixing this in the CPDB group chat on Telegram, Michael Weghorn came up with a merge request for GTK4 which got accepted the next day. The fix was trivial, but needed. It even simplified the code somewhat as there was no need to create a unique instance name any more. Thanks a lot, Michael, for the quick fix. Note: At other places (Qt, Chromium, Mozilla dialogs) similar fixes are most proably needed. Now let us get to the new API functions: cpdbGetVersion(): Returns the CPDB version for client applications to be able to check at runtime (Pull request #49). cpdbGetOptionTranslationFromTable(), cpdbGetChoiceTranslationFromTable(): Allow to extract translations from a table pre-loaded via cpdbGetAllTranslations(), saves a lot of D-Bus calls (Pull request #58). cpdbRefreshPrinterList(): Refreshes the printer list of a given backend (Pull request #35). cpdbGetDbusConnection(): Aquire D-Bus connection to the session bus (Pull request #35). cpdbPrinterCallback(): Default callback function for changes on a printer (Pull request #36) cpdbOnPrinterAdded(), cpdbOnPrinterRemoved(), cpdbOnPrinterStateChanged(): Functions to handle changes on printers (Pull request #36). cpdbFillBasicOptions(): Fills in basic data into the data structure for a printer (Pull request #37). Bug fixes Many bugs got fixed, especially tons of memory leaks and several crashers, and also unused varaiables, data types, and functions got removed. The more \"visible\" bugs are here: cpdb-text-frontend: Get locale via GLib. Instead of only supporting the LANGUAGE environment variable that's not necessarily set, use GLib's g_get_language_names() to detect the locale to use in the text frontend which takes other environment variables into account as well (Pull request #51). cpdb-text-frontend: Quit the text frontend when scanf() returns EOF, which e.g. happens when the user presses Ctrl + D. Previously, pressing Ctrl + D would result in the loop running indefinitely, printing \">\" without end (Pull request #38). cpdbConcatPath(): Instead of using CPDB_SYSCONFDIR again as it was already done earlier, and doing so in a loop, use the actual path extracted from the XDG_CONFIG_DIRS environment variable (Pull request #48). cpdbPrintFileWithJobTitle(): Already try to open the file to be printed at the given file path before creating a print job using cpdbPrintFD(), to avoid creation of a \"dead\" job which needs to get manually canceled (Pull request #78). cpdbConnectToDBus(): Correct D-Bus subscriptions to backend signals for new printer appearing, printer disappearing, and printer state change, supplying a pointer to the frontend data structure (Pull request #44). cpdbRefreshPrinterList(): Pass backend name as const char* and not as char* as this is the standard way to pass C strings. That also simplifies using the function (Pull request #40). Documentation README.md: Explained inner workings of CPDB and gave containerization hints in a new section \"How does it all work internally?\". Especially done because snapd developers asked for it for making snapping CPDB work. Documentation for newly added API functions: Added header comments for auto-generating developer documentation (Pull request #43). CUPS Backend changes Also the CUPS backend received some love: Add support for CUPS printer instances: Don't just always use the cups_dest_t's name for the printer name, but also take it's instance member into account and if present, append that to the name used for the CPDB printer name, separated by a slash character (Pull request #34). Always query current CUPS default printer: When asked for the default printer, always query and return the current CUPS default printer instead of whatever was the default last time this was done (Pull request #33). cupsStartDestDocument(): Pass correct job title and job attributes (options) (Pull request #36). Use NULL Instead of \"NA\" if there's no default printer: NULL makes clear that there's no default printer, while \"NA\" could even be the name of an actual printer (Pull request #35). The new versions of the CPDB components cpdb-libs: More Details and Download, Discussion cpdb-backend-cups: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:Common-Print-Dialog-Backends-Second-Generation-Sixth-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "Common Print Dialog Backends Second Generation - Sixth Beta Release!",
+ "url": "/Common-Print-Dialog-Backends-Second-Generation-Sixth-Beta-Release",
+ "headings": [],
+ "tags": [],
+ "snippet": "Sixth beta to improve more for sandboxed packaging, especially streaming print data and simplifying D-Bus interface",
+ "content": "After 10 months, and working currently on snapping the CPDB backend for CUPS, we are now releasing the sixth beta of the second generation of the Common Print Dialog Backends (CPDB). Streaming print job content Main change is that the data to be printed is not dropped into a temporary file any more for the backend to pick it up from there, but streamed to the backend, into a per-job domain socket created by the backend. This makes sandboxed packaging (Snap, OCI containers, ...) where frontend and backend are in different isolated packages much easier. Simplifying list filter control CPDB has also a facility to filter the list of displayed available print destination. Here once remote printers (network printers, shared remote CUPS queues) and second, temporary printers (IPP print destinations for which no permanent print queue is set up by CUPS) can get suppressed. To apply these filters to the list the frontemd has to send control commands to the backends. Before, in addition to the fact that each backend is a D-Bus service and the frontends are clients for them, also the frontends were D-Bus services, only to be able to send the control commands to the backends as signals. Now we have simplified by introducing methods for controlling the filters to the backend D-Bus interfaces and done away with the frontends being D-Bus services. Also this helps to make sandboxed packaging easier. Allow permanently running backends To give more flexibility on how backends are handled in sandboxed packages we allow now also to just run a backend continuously from login to logout without needing to have it registered as D-Bus service using a *.service file. Now the frontend checks for both registered D-Bus services and already running D-Bus services, regardless of whether they are registered. Print dialog update on addition or removal of backends Another nice new feature, but this time not to improve sandboxability, is that we spawn a background thread now which checks every few seconds whether backends have come or gone while the print dialog is open. So the printer list gets updated right when a fresh backend gets installed. Also great for apps which keep a list of available printers all time, independent of a print dialog being open or not. Removed/Discontinued We have also removed some functionality which turned out to not be used in typical print dialogs and to be awkward for sandboxed packaging. First we dropped the job control functionality, listing jobs, number of jobs, and canceling a job. Second, we discontinue the FILE backend, as the existing print dialogs do much better in printing into a PDF file by themselves. The code of the backend will be merged into cpdb-libs to have a backend for development, debugging, and testing, especially for having a useful build test (make check). API changes Only the frontend API has changed, the backend API is unchanged. See the file cpdb/cpdb-frontend.h of cpdb-libs for details, especially on how the new functions get called. We have some slight changes in the API this time, which could require changes in the print dialogs. On existing print dialogs most probably only one little change is needed. For the removal of support for the FILE backend we have removed the cpdbPrintFilePath() function. Use cpdbPrintFileWithTitle() instead. Explicit support for the FILE backend as opening a \"Save as ...\" dialog for the destination file path should be removed. It is recommended to send jobs with title now. Replace the use of cpdbPrintFile() by cpdbPrintFileWithTitle() for that. The other removals in the API will most probably not affect existing print dialogs, but you should be aware of them: For the frontend not being a D-Bus service any more, removed the related fields of cpdb_frontend_obj_s: skeleton, name_done, and bus_name (own_id was forgotten and will also get removed, also the constant CPDB_DIALOG_BUS_NAME). Also any function generated from the now removed frontend D-Bus service definition cpdb/interface/org.openprinting.Frontend.xml is not available any more. Those had names starting with print_frontend_.... Dropping job control support we have removed the API functions cpdbGetAllJobs(), cpdbGetActiveJobsCount(), and cpdbCancelJob(). We have also added new items, especially new API functions for sending the job content to the printer, as we are streaming it now. Now one cannot only specify a file to get printed (which actually gets streamed out to the backend) but also obtain a file descriptor or a domain socket to feed the job content into. File descriptors and sockets are per-job. It is required to properly terminate the job submission, usually by closing the file after writing it, so that the job ends and everything gets actually printing. And for a new job always a new file descriptor or socket has to get acquired. New is also that the functions to start the job submission accept job titles now, so that the print system can properly list the jobs and also send the title to the printer for the front panel display. The new functions are cpdbPrintFileWithJobTitle(), cpdbPrintFD(), and cpdbPrintSocket(). The functions make it much easier to output print data as no temporary files are needed. This especially helps for very long jobs, not taking storage space and starting to come out of the printer while still being created. For general convenience we have added some more API functions. cpdbGetAllPrinters() logs a list of all available printers, for development and debugging. cpdbPrintBasicOptions() logs basic properties of a given printer. cpdbActivateBackends() finds the currently available backends, starts the ones which are not already running, and updates the list of available printers. To be called when the frontend starts and also at any time to get updates on the come and go of backends. Does not need to be called to update the printer list of a running backendm as each backend sends push notifications on printer changes. cpdbStartBackendListRefreshing() Starts a background thread to observe the come and go of backends (thread calls cpdbActivateBackends() every few seconds) cpdbStopBackendListRefreshing() Stops the background thread to observe the come and go of backends cpdbStartListingPrinters() Convenience function to be called when starting the frontend (usually when opening the print dialog) cpdbStopListingPrinters() Convenience function to be called when stopping the frontend (usually when closing the print dialog) cpdb_frontend_obj_s also got some extra fields, for the new filter control by backend D-Bus methods two boolean fields hide_remote and hide_temporary got added and for managing the background thread to observe come and go of backends stop_flag and background_thread. D-Bus communication protocol changes The D-Bus communication protocol between frontends and backends has also changed, once all job content being streamed and second, printer list filter control being implemented as methods of the backend D-Bus service interface. Therefore backends must be based on cpdb-libs 2.0b6 or newer. Currently, we have only the CUPS backend as the only maintained backend and its 2.0b6 version, released together with cpdb-libs 2.0b6 is appropriately updated. CUPS Backend changes Generally we have updated the CUPS backend to work with the changes on cpdb-libs described above. Backend-specific changes are the following: Updated names of some CUPS constants to CUPS 2.5.x and newer Removed tryPPD(), a useless, PPD-related function. This function logs the options in the PPD file of the CUPS queue but does nothing else. As PPDs will go away in CUPS 3.x we want the CUPS backend not depend on PPDs or PPD-supporting functions or libraries. Unified logging. We always use the log...() functions now. In the build test ( make check) we give more time (3 instead of 1 sec) for the print job submission before closing the backend, to get note of the confirmation of successful submission more reliably and we let the frontend and backend log in debug mode. Bug fixes Naturally, many bug fixes have made it into CPDB in the many months after the last release. most of the bugs caused crashes and so one can expect that CPDB is much more stable now. The new versions of the CPDB components cpdb-libs: More Details and Download, Discussion cpdb-backend-cups: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:Common-Print-Dialog-Backends-Second-Generation-Third-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "Common Print Dialog Backends Second Generation - Third Beta Release!",
+ "url": "/Common-Print-Dialog-Backends-Second-Generation-Third-Beta-Release",
+ "headings": [],
+ "tags": [],
+ "snippet": "Third beta to improve translation support",
+ "content": "We are now releasing the third beta of the second generation of the Common Print Dialog Backends (CPDB). This time we have added functions for synchronous and asynchronous loading of all group/option/choice string translations from the backends. Also the needed counterparts on the backends got added. The release is done to get this functionality into the Ubuntu packages before Lunar's (23.04) Feature Freeze on Feb 23, 2023. The components we are currently maintaining got all updated and released as version 2.0b2. The following changes have been done: CPDB Libraries Added functions to fetch all printer strings translations (PR #23) Added cpdbGetAllTranslations() to synchronously fetch all printer string translations Added cpdbAcquireTranslations() to asychronously fetch them. Removed get-human-readable-option/choice-name methods Removed cpdb_async_obj_t from cpdb-frontend.h as that is meant for internal use. Backends Add handler for GetAllTranslations method and Bug fixes (PR #22 and PR #7) Add handler for GetAllTranslations method get_printer_translations() fetches translations for all printer strings. Removed get_human_readable_option_name() and get_human_readable_choice_name() functions. Fixed bug when CUPS backend finds zero printers and further fixes The new versions of the CPDB components: cpdb-libs: More Details and Download, Discussion cpdb-backend-cups: More Details and Download, Discussion cpdb-backend-file: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:How-did-this-all-begin",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting - How did this all begin?",
+ "url": "/How-did-this-all-begin",
+ "headings": [
+ "System Administrator in the Physics Department",
+ "MandrakeSoft in Paris",
+ "The Linux Foundation and Canonical"
+ ],
+ "tags": [],
+ "snippet": "A brief history of OpenPrinting",
+ "content": "This is a short write-up about how I got into printing with free software, right from the top of my head. probably I will improve this later, with links, pictures, more info, and also on a more adequate location on this site. I have studied Physics at the university, not computer science, but always had a computer and liked programming. I had my first (Commodore VC20, 3.5K of RAM) with 16 years of age. In the time from 1996-2000 I did my PhD in Theoretical Physics and from 1997 on I was also system administrator for the department. The machines were all UNIX workstations (SGI and DEC) and to get workplace computers for everyone my first task was to set up Linux PCs (SUSE in that time). This way I got in contact with the wonderful world of free software. Programming work for the system administration (not the Fortran work for the PhD itself) was mainly to make things working in our department, especially also for the less IT-savvy professors. A first task which I contributed upstream were modifications on X-CD-Roast (an early GUI for recording CDs) to make it working in multi-user environments. We had also printers, PostScript lasers with 2 trays and duplex. The LPD printing system did not support passing printer-specific options along with jobs, so the admins before me created a wild hack to control these resources. Then we also got a color laser with many more options and these options were only accessible via proprietary GUIs on the commercial UNIXes (SGI and DEC) in our LPD environment. In spring 2000 I read an article about CUPS in the German \"Linux Magazin\" written by Kurt Pfeifle. CUPS was supporting PostScript printers perfectly with its PPD concept. I tried it and one could print on all our printers with all pipes and whistles, from all machines, also the Linux ones, and on all printers, including the color laser. And clients see the server's print queues automatically. So I adopted it in the department's network. Only disadvantage was that one could control everything only via the command line. GUI print dialogs were available from Michael Sweet, the author of CUPS, but only as proprietary, paid software. So I wrote a print dialog by myself, called it the \"X Printing Panel\", XPP (so I got the father of Linux print dialogs). This way everyone could easily fully control the printers, also the not so IT-savvy people in the department. It took me only around 10 days to get this together, but in the end I wanted to make it available for everyone. So I announced it on Freshmeat, and shortly after I got feedback, an invitation from Kurt Pfeifle, the author of the CUPS article in the \"Linux Magazin\", to the LinuxTag, the biggest Linux show in Europe that time, to present my little project on the booth of his employer, the printer service company Danka (later on overtaken by Ricoh). Most distributions did not show much interest but MandrakeSoft from Paris (later Mandriva) did. They showed me already on the booth how their development workflow works, and on the social event the told me everything of the daily life in their office. And some days after the show I got an e-mail with the invitation to work for them. By the way, on that LinuxTag I also met Richard Stallman, who invented the free software concept, and he also suffered a printing problem, and that led him to that step, as I also had a problem with printing, and got what I am today. So in the beginning of July 2000 I was on the LinuxTag and on August 1 2000 I lived in Paris, not knowing any word of French. Inside MandrakeSoft we were speaking English as they hired many people from other countries and they sent us all to French classes. My first task was to switch Mandrake Linux to the CUPS printing system and I succeeded already with the first release after my employment, which came out in fall 2000. To get PPD files for all, especially non-Postscript, printers I used linuxprinting.org (the site which provided Foomatic in that time) and asked its author, Grant Taylor, for a lot of improvements on it. In 2001 I had overtaken maintainership of the project, as Grant did not have time for it any more. The server was running in his house though, till 2006. In 2001 I got invited to the HP- and IBM-hosted OSDN Printing Summit in San Jose (Report from Grant Taylor), where I met several people of the printer manufacturers and of the PWG (Printer Working Group) and with them (Tom Hastings, Michael Sweet, Ira McDonald, Claudia Alimpich, Glen Petrie and, Norm Jacobs) I founded OpenPrinting as part of the Free Standards Group (FSG). In the following years I did not only do coding and packaging to improve printing, but also a lot of community work, CUPS evangelism, especially I organized a community booth about printing on the LinuxTag every year from 2001 to 2006, gave talks on several conferences, mainly in Germany and Brazil, ran developer meetings on conferences in France, and participated in the work of creating printing APIs via phone meetings of the OpenPrinting people. Also all distributions switched to CUPS (with Foomatic) as their standard printing environment. The other printing systems disappeared and did not get maintained any more, probably due to lack of user interest. From 2001 on MandrakeSoft was not going well, was a sinking ship which (fortunately) actually sunk only in 2015. In Fall 2005 I was running a community booth on the Linux Expo in San Francisco and there I discussed with the folks that we need a meeting to plan how to improve printing and develop it further and we concluded to organize a Printing Summit in 2006, which I started to organize. End of 2005 I was invited on a Desktop Architects Meeting of the OSDL where I also advertised my plans of a Printing Summit and also got inspired to post on the GNOME mailing list that they should improve their print dialog to properly support CUPS as this was the standard. The first answer then came from Linus Torvalds, calling the GNOME guys \"interface nazis\" and that triggered a sh*tstorm, which was also mentioned in the end-of-year news reviews of 2005. But the GNOMies created the better dialog actually some time in 2006! The Printing Summit in 2006 was a great success. It was hosted by Lanier in Atlanta and I succeeded to get nearly everyone important for printing with free software to there, people of several manufacturers, distributions, drivers, Ghostscript, GUI environments, user interface experts, Mike Sweet (author of CUPS), ... There was also IAN Murdock, one of the founders of DebIAN. He was working for the FSG and I asked him whether the FSG could host linuxprinting.org (Foomatic) as manufacturers have already uploaded PPDs there but it was still running in Grant's house and an official download place deserves the security and reliability of a data center. But shortly after the Summit it came even better: The FSG did not only want to host Foomatic but also me. They invited me to work full-time on OpenPrinting and expand OpenPrinting to cover everything about printing with free software, especially also merge in linuxprinting.org. In 2006 I also had my last booth on the LinuxTag and there I met Mark Shuttleworth, founder of Canonical and Ubuntu. He also invited me for working as printing guru of Ubuntu. So from mid-2006 on I worked mainly for OpenPrinting but also for packaging the printing stack in Ubuntu. This is my work still today, but currently fully paid by Canonical. In 2007 the FSG and the OSDL joined to be the Linux Foundation and so I was their employee. I also got fellow member of the Linux Foundation which I am till today. From then on I did everything to make printing \"just work\" in non-Mac Unix/Posix-style operating systems. I held OpenPrinting Summits every year, later in collaboration with the Printer Working Group (PWG), work with manufacturers on doing printer drivers correctly, implement PWG standards in free software, ... From 2008 on I started organizing the participation of the Linux Foundation in the Google Summer of Code and got accepted for all but one year until now. Many students worked this way for OpenPrinting and recently we got together a student community to work on development tasks, like our new web site and also on mentoring further GSoC contributors."
+ },
+ {
+ "id": "post:OpenPrinting-Live-in-the-Ubuntu-Office-Hours",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting Live in the Ubuntu Office Hours",
+ "url": "/OpenPrinting-Live-in-the-Ubuntu-Office-Hours",
+ "headings": [
+ "The Summer of Printers in the Ubuntu Office Hours"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/diB3wm4HB1Y/hqdefault.jpg",
+ "snippet": "Our success in the Google Summer of Code in the Ubuntu Community Live Event",
+ "content": "Once a week, every Thursday in the US morning and the European afternoon on the \"Ubuntu OnAir\" YouTube channel of the Ubuntu community, the live event \"Ubuntu Office Hours\" is taking place. In each episode a free software community member is invited to tell about his project and what is happening in its community. In the October 7 episode (in 2 days) it is all about OpenPrinting. Organizer and host Monica Ayhens-Madon has invited me to talk about GSoC and the students I have mentored. There will not only Monica and me be on the (virtual) stage but also OpenPrinting program manager Aveek Basu and some of this year's (and perhaps also former year's) GSoC students. We will tell about our GSoC work and its achievements, not only of code but also the community growth, and what students have done after the summer, like mentoring the next students or creating our current web site. We will also call for volunteers to join OpenPrinting and to contribute, and also answer the spectator's question which they post on the YouTube Live Chat of the session. Please mark in your calendars: (CORRECTION) Thursday, October 7, 2021, 15:00 - 16:00 UTC Update: Recording on YouTube It will take place on YouTube and everyone can participate, without registration and free of charge. Everyone can post questions on the YouTube Live Chat. For everyone who wants to get some technical background, Michael Sweet and me have talked about the ongoing changes in the architecture of printing with free software six weeks ago in the Ubuntu Indaba (recording on YouTube). See you there!"
+ },
+ {
+ "id": "post:OpenPrinting-Microconference-on-Linux-Plumbers-Conference-2019",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting Microconference on Linux Plumbers Conference 2019",
+ "url": "/OpenPrinting-Microconference-on-Linux-Plumbers-Conference-2019",
+ "headings": [],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/0c_JaX4G7Zc/hqdefault.jpg",
+ "snippet": "In September we held a Microconference on the Linux Plumbers Conference in Lisbon, now the summary and videos are uploaded to the Linux Plumbers web site",
+ "content": "In September 2019, I have been on the Linux Plumbers Conference 2019 in Lisbon and held the first OpenPrinting Microconference together with Aveek Basu and Rithvik Patibandia. We presented our future plans in OpenPrinting work and discussed them with the audience. The whole event got filmed by a professional video company and now finally all the recordings got edited and links to them posted on the Linux Plumbers web site. Go to the page of our Microconference to find all the video links and also a summary of the event there. If you prefer to lean back and watch the whole thing as a two-and-a-half-hour movie, go here. And to make it complete, here is the article on LWN."
+ },
+ {
+ "id": "post:OpenPrinting-Microconference-on-Linux-Plumbers-Conference-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting Microconference on Linux Plumbers Conference 2020",
+ "url": "/OpenPrinting-Microconference-on-Linux-Plumbers-Conference-2020",
+ "headings": [],
+ "tags": [],
+ "snippet": "We are on the Plumbers again! And this time with live stream on YouTube!",
+ "content": "Update: Recording on YouTube As already back in 2019 we are holding a Microconference on the Linux Plumbers 2020, this year in ... ... the wider Internet!! Yes, due to COVID-19 it is all virtual this time, no travelling, no 12 hours with a mask in an airplane full of people. But also no nice sights and delicious restaurants, not tourist-guiding my co-workers with the help of my knowledge of the Portuguese language through a nice city. But it has also one big advantage: It is much easier to get the desired speakers, as one does not need to get their travel funded. So we will have Michael Sweet, Ira McDonald, Aveek Basu, Alexander Pevzner, and Rithvik Patibandla on our virtual stage, and me naturally, too. We will talk about the following subjects: Printer Applications - A new way to print in Linux IPP scan (or virtual MF device) server (Scanner Application) 3D Printing IPP Fax Out - A new reality Designing and Packaging Printer and Scanner Drivers The conference takes place from Monday, August 24 to Friday, August 28, every day from 2pm - 6pm UTC. Our day will be the Friday, August 28, with our microconference to span all the 4 hours. Everyone is invited to visit us. If you are actually attending the Linux Plumbers Conference, please visit the OpenPrinting MC on Friday and participate in the discussion of the future of printing and scanning. If you are not registered, please listen in via YouTube Live Stream for free. The links to the YouTube streams will appear on this page shortly before the sessions start."
+ },
+ {
+ "id": "post:OpenPrinting-Mini-Summit-at-IIT-Mandi",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting Mini Summit at IIT Mandi, India",
+ "url": "/OpenPrinting-Mini-Summit-at-IIT-Mandi",
+ "headings": [],
+ "tags": [],
+ "teaserImage": "/assets/images/IMG_20191109_205439.jpg",
+ "snippet": "On November 9 we had a meeting in India presenting the work of OpenPrinting at one of the universities where our Google Summer of Code students came from",
+ "content": "On November 9, 2019 we had a mini OpenPrinting Summit at the Indian Institute of Technology - Mandi (Himachal Pradesh India). Aveek was also invited to be a speaker at one of the Hackathon events which was getting conducted at the university campus during that time. Over the last few years OpenPrinting has seen some excellent contributions from the students of the institute. Sahil Arora was the first student to get selected as a GSoC student from the institute to work on OpenPrinting. Sahil started his journey as a GSoC student for OpenPrinting and currently working as a GSoC mentor also for OpenPrinting. There are some notable contributions from other students like Akash, Dheeraj, and Sharad. It was a great time to meet them at their campus and talk about printing and the future of the technology. There were other students as well who showed their interest in contributing for Open Printing. Aveek conducted sessions on driverless printing and the other related topics. We are looking forward to see more contributions from the students and also see them grow as the future leaders of the print industry. Some pictures: Photo 1 Dheeraj, Aveek, and Sahil Photo 2 Many students intersted in the work of OpenPrinting Photo 3 Presenting the work of OpenPrinting"
+ },
+ {
+ "id": "post:OpenPrinting-News-25-years-of-working-full-time-for-printing-with-free-open-source-software",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - 25 years of working full-time for printing with free/open-source-software",
+ "url": "/OpenPrinting-News-25-years-of-working-full-time-for-printing-with-free-open-source-software",
+ "headings": [
+ "Working full-time for printing with FOSS",
+ "Achieved a lot of things ...",
+ "... and a lot of things to do",
+ "CUPS 3.x - The New Architecture",
+ "Integration of the New Architecture, CUPS 3.x",
+ "GUI modernization",
+ "Sandboxed, distribution-independent packaging and immutable distributions",
+ "Testing, reliability, and security",
+ "Going beyond the usual PC and server architecture",
+ "Our team and our community",
+ "The show must go on ...",
+ "Videos/Podcasts"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/S0IyScIRzb8/hqdefault.jpg",
+ "snippet": "Dedicated to make printing just work ... And the show must go on!",
+ "content": "Exactly 25 years ago, on Tuesday, August 1, 2000, I started my job at MandrakeSoft in Paris, to which I got invited when showing off my print dialog X Printing Panel (XPP) on the LinuxTag 2000 in Stuttgart, Germany, in the beginning of July 2000. Since then I am working full-time for printing with free and open-source software, principally Linux and other POSIX-style operating systems. My first task at MandrakeSoft (later Mandriva) was to switch Mandrake Linux from the LPD (Line Printer Daemon) printing environment to CUPS. I succeeded the switchover just in a few month so that the next available edition of Mandrake Linux had CUPS working and printer setup and printing much easier and much more functional as before. This, and my numerous presentations of CUPS on conferences, in talks, workshops, and booths, made all the other distributions follow, including Debian, and as being derived from Debian, Ubuntu just started off with CUPS back in 2004. In 2006, I organized the first OpenPrinting Summit, at Lanier (now part of Ricoh), in Atlanta, Georgia, with the help of Ulrich Wehner who is working there. There I got invited to work full-time at the Free Standards Group (now the Linux Foundation) by Ian Murdock, one of the founders of DebIAN Linux, to lead OpenPrinting. I also bumped into Mark Shuttleworth, founder of Ubuntu and Canonical on the LinuxTag 2006 (I was organizing a community booth every year there, from 2001-2006), and he invited me to work at Canonical, also full-time. Not being able to take both full-time and leading OpenPrinting be the central part of my work I took the full-time job at the Linux Foundation and added a part time contract at Canonical for maintaining Ubuntu's printing-related packages. Later on, when the Linux Foundation dropped my contract to 1/2 and Canonical offered me a full-time employment I got full-time there, until this year. See also: How did this all begin? Principally I have done the same work all the time, and independently, who my actual employer was, to make printing with FOSS \"just work\". In the beginning I have taken care that all the printer drivers from the pre-CUPS era work with CUPS, that distributions have all the drivers readily available to the user, for example with the help of the Grand Unified Ghostscript, and that printer setup is as easy and automatic as possible by adding algorithms for printer identification and driver assignment to system-config-printer to provide the Plug'n'Print experience (not Plug'n'Play as in Windows, you plug in the printer and play for hours with the drivers and if you win this game, you can print). I also need to assure that the good user experience stays conserved all the time, even if changes in CUPS drop features which make user's life easy and users get used to them. One was CUPS' simple but fully automatic broadcasting/browsing system, where when in a local network the CUPS on one machine shared a printer, automatically all the other machines created a (virtual) print queue and the users could immediately print, and thanks to server-side drivers without needing to download and install a driver. This mechanism got replaced by the DNS-SD protocol, which is once a general standard in networking, and also matches the standard of driverless IPP printing. Only here the automatic creation of virtual print queues on the client side was not done, which made me create cups-browsed, an auxiliary daemon which creates local print queues for discovered IPP printers, both shared remote CUPS queues and network printers. When Apple removed the filters and backends from CUPS (they had hired Michael full-time for macOS printing from 2007 to 2019) as they have their own proprietary ones (2011) I had overtaken their maintainership calling it the cups-filters project and the first thing I did was switching them over to the PDF-centric printing workflow which we already had agreed on on the OpenPrinting Summit back in 2006, making all distros finally getting switched to PDF. I also created the idea of the Common Print Dialog Backends to separate the communication with the actual print technology (like CUPS) from the print dialog GUI. This is once to overcome the inertia of big GUI toolkit and app projects of keeping pace with changes in the print system (CUPS), as motivation of printing support maintenance work in these GUI/desktop project is very low. So the maintainer of the print dialog maintains the backend to keep up with the changes in CUPS. Also backends for cloud printing services could easily get added (and so the support for them be added to all print dialogs by installing a single Snap). Next step was integration of driverless printing. Some years ago new printers started all to be driverless IPP printers, with the main motivation that one can print on them from a smartphone (AirPrint for iPhone, Mopria for Android). The principle of driverless printing always follows the principles of the common IPP Everywhere standard from the Printer Working Group (PWG, I work closely together with them) here. CUPS supports it and I did the integration with cups-filters, also on some extra points, like AirPrint as a server (so that iPhone prints on shared Linux printers). And to make driverless printing complete, meaning that it does not only work with network-connected printers but also via USB (there can be settings without LAN or people prefer USB for privacy) I have taken care of the IPP-over-USB standard being implemented on Linux, first by a GSoC contributor doing an implementation in C, but this one was not very reliable, and later on, when I tested Alexander Pevzner's sane-airscan also on IPP-over-USB and ran into problems, he quickly created ipp-usb in Go, and he used Go as Go's HTTP library is much more sophisticated and the one of C is not sufficient for this task. See also: Our principal achievements Currently Michael Sweet is working on CUPS 3.x. First, the CUPS daemon will be split in 2, the local server for just allowing printing from the local machine, running as unprivileged user, and the sharing server, a system daemon running as root for sharing print queues on the network. And as these daemons, providing IPP print destinations, are nothing else than Printer Applications, software emulations of IPP printers, and so they are developed on the base of PAPPL (Printer APPLication framework, also developed by Michael Sweet). Second, CUPS is going all-IPP and doing away with PPD (POSTSCRIPT Printer Description) files and classic printer drivers. Most modern printers are driverless IPP printers and so continue working, while for non-driverless legacy printers classic drivers get replaced by Printer Applications. And the CUPS library will have a lot of convenient new APIs, for OAuth2, X.509, DNS-SD, TLS, zlib, threading, JSON, HTML forms, ... And part of these is also backported into libcuos of CUPS 2.5.x And currently I am working on preparing the smooth transition from CUPS 2.x to 3.x in the operating systems. First, I had to turn all the printer drivers currently available in Linux distributions into Printer Applications to conserve the non-driverless legacy printers (with the side effect that the Printer Applications also work under WSL under Windows, saving these printers there, too). The other very important point is also the desktop integration, so that print dialogs and printer setup tools correctly list all print destinations and offer the correct functionality for configuring the destinations and printing on them. In addition to classic CUPS print queues we have to display IPP print destinations as one can print on them without creating an explicit CUPS queue. We have to group them if they come from the same hardware unit or the same Printer Application, let users access their web admin interfaces by clicking a single button. The \"Add printer\" part has to find only non-driverless legacy printers and now find installed Printer Applications and prefer their use instead of PPD files. Printer setup tools commonly in use are the GNOME Control Center, KDE Print Manager, and system-config-printer. For print dialogs we have implemented the IPP print destination support and PPD-less operation in the CPDB (Common Print Dialog Backends) backend for CUPS, so we have to switch all print dialogs to CPDB support. This affects all dialogs currently in use, which are the GTK (GNOME), Qt (KDE), Mozilla (Firefox, Thunderbird), Chromium Browser, and LibreOffice print dialogs. Here one sees that we need changes on code which is not provided by OpenPrinting. But we cannot just report issues or feature requests to the mentioned GUI toolkit, desktop environment, and desktop application projects. Their developers, in good part also ones doing their part in their spare time, are doing a lot of valuable work to bring their projects forward, but, unfortunately, as printing is not such an attractive subject matter for developers, motivation to implement the requested features is low and so the projects do not keep pace with the development of CUPS. Here it is best if we from OpenPrinting contribute code, and due to lack of people/volunteers we do it mainly by the Google Summer of Code, as I will tell later. But GUI programming is complex, and to get contributions merged upstream, one has to fulfill strict requirements from the upstream projects, and this requires a lot of enthusiasm and patience ... As I mentioned earlier, in typical Linux desktop systems there are principally 5 different print dialogs in use: GTK (GNOME), Qt (KDE), Mozilla (Firefox, Thunderbird), Chromium Browser, and LibreOffice. The ones of Mozilla and Chromium have a nice modern look and feel, with its embedded preview and the easy to access option settings on the right, while the dialogs from GTK and Qt are aging with their UI designs still coming from the time when CUPS support was originally introduced to these toolkits. As we are already done with the CPDB support via GSoC projects in the previous years, I have posted project ideas for modernizing them following the designs from Mozilla and Chromium, for both GTK and Qt. For both we got good proposals but Google has not given us enough contributor slots for both proposals having been accepted. The principal designs of the dialogs still are mainly the original designs from the 2000s when I asked the developers from Qt and GTK to create print dialogs supporting CUPS, replacing the old dialogs from LPD times where one often had just a text input field for entering the lp command line to print stdin. Now the GTK dialog is worked on in a GSoC project, and we are lucky that for the Qt dialog one of our GSoC candidates, who did not get accepted, stepped in voluntarily. With classic packaging of applications for Linux distribution, in most cases RPM or DEB packages, packages are usually specific to the distribution for which they are made and there even for a certain version of that distribution. This makes difficult, near impossible, for a third party to create ready-to install Linux packages of their application without having to create and test packages separately for 10+ distributions and 5+ versions of each. Also, the distros by themselves only make packages for their current releases and do not update them any more to new upstream versions, once the distro is released. So you need to wait for the next release of your operating system to get new versions of your applications. This is especially a problem for printer drivers, and therefore probably many manufacturers are hesitating to provide Linux drivers. So we need distribution-independent packages, which do not rely on anything specific to each operating system distribution. Usually, these dependencies are shared libraries, but it can also be the locations and file names of certain resource, like device files or translations. So the packages bring all these files and components from the operating system under which the app was built. Main formats are Flatpak, Snap, and OCI containers here. As OpenPrinting's software, CUPS, ipp-usb, and the Printer Applications (new format of printer drivers), are all system daemons, Flatpak is not suitable, it only supports packaging desktop applications. There are efforts to also package daemons, started by Christian Hergert, discussed in a BoF on the GUADEC 2024 in Denver, Colorado, and Adrian Vovk wants to continue on it ... Therefore and also as I was working at Canonical I used Canonical's Snap format for getting distro-independent packages right from OpenPrinting, also because they wanted create an all-Snap desktop distribution, Ubuntu Core Desktop, based on the immutable IoT distro Ubuntu Core, which was for what they originally designed Snap for. And there were also plans to switch the printing system of the standard Ubuntu distributions to Snap. But even with Ubuntu Core Desktop not materializing it is good to have everything, especially the drivers for ~10000 legacy printer models available as distro-independent package in the Snap Store. With my work on snapping the printing stack I also have learned a lot about Snap, and shared this knowledge in a series of workshops on several conferences. Unfortunately, many distros do not support Snap well, most immutable distributions not at all. They are designed for adding desktop applications via Flatpak. But some of them also allow to install applications in OCI containers via podman or Docker, and so I also introduced the idea of creating such containers and ran a GSoC project for doing this. As essential system components, CUPS and the printing stack in general needs to be running stably, reliably, and securely, and for that thorough testing of the code is needed. For automated testing one thinks about the CI tests first which are executed whenever a change is committed to the GIT repository of the code base. These catch many glitches but as they are static code which is created by the developers of the code base itself they can easily overlook scenarios about which we never thought about. Therefore we are also doing Fuzz testing using Google's OSS-Fuzz service. Here the code is exercised with randomized input and each input which leads to unexpected behavior (usually crashes, errors, memory leaks, getting stuck, ...) is taken note of and automatically reported as a bug, with the actual input data of the run and everything need to reproduce the problem. This testing technique requires that huge amounts of tests with new random input are done, and this happens on Google's OSS-Fuzz high-performance cluster. The work is done by our OSS-Fuzz team, started by George-Andrei Iosif, former member of Canonical's security engineering team, and in the GSoC 2024 he mentored Jiongchi Yu (\"TTfish\") for OSS-Fuzz deployment on CUPS and cups-filters, and now, in the GSoC 2025 Jiongchi is mentoring 2 further contributors, on LLM use for creating fuzzers and fuzzing our Go- and Python-based components. We have also produced an excellent workshop about fuzzing free software apps on the Ubuntu Summit 2024. Now you could think, why do we apply such a high computational effort to hunt after crashes when there is the memory-safe Rust programming language? Should we not just oxidize (convert into Rust) the whole OpenPrinting code base? Theoretically, this would be a solution, but it requires a lot of people to do the work in a timely manner (how should we get them, and this for the even more boring conversion of code into another programming language?) and in this work easily many new bugs, not crashes or memory violations, but annoying bugs are introduced ... At least we now support people who write apps in Rust, by creating appropriate bindings in 2 GSoC projects (libcups, CPDB libraries). Another approach for testing is done by Alexander Pevzner, volunteer contributor of the IPP-over-USB support implementation ipp-usb and the SANE scanning backend for driverless scanning, sane-airscan. He is creating a behavior-accurate simulator for a driverless IPP printing and scanning multi-function device. This will not only use a database of get-printer-attributes IPP responses of the devices but also reproduce device-specific behavior, like bugs for example and so we can test OpenPrinting's software against known hardware device behavior without having the hardware at hand. And for not only discovering crashes and errors but also test for correct output, we are doing, inspired by GNOME's openQA about which I have learned on another BoF on the GUADEC 2024 in Denver, Colorado visual analysis of print output, so that problems in the printouts, like decentered pages, cut borders, ... get discovered. To implement this we are mentoring a GSoC project. This can enhance all types of automated tests, to advance to testing actual functionality, CI tests, fuzzing, and also the multi-function printer simulation. Printing does not only happen on PCs and servers with the usual Intel or AMD processors, but there are also other systems where we want to print from or which we want to use as print servers, or even as the controller inside a printer. First, there is the RISC-V architecture, this is a completely open hardware architecture, meaning that everybody can make RISC-V processors without acquiring a license from the creators of RISC-V. This makes it interesting as a new architecture for a lot of use cases, including desktop PCs/laptops, the category of computers for which printing support is essential. On the Ubuntu Summit 2024 and the FOSDEM 2025 I have met Yuning Liang, founder and CEO of DeepComputing, manufacturer of RISC-V-based motherboards for Framework laptops and on the FOSDEM I got a sample of the motherboard for OpenPrinting. I tested it with the Ubuntu desktop and after sorting out some problems with Yuning and the developers at DeepComputing and also with Heinrich Schuchardt, Ubuntu RISC-V expert at Canonical, everything was up and running, including the full printing stack both from DEB packages and from Snaps. For the latter I have activated RISC-V support for the builds of the OpenPrinting Snaps in the Snap Store. I have written a blog article on OpenPrinting about this and Yuning has linked it also from DeepComputing's blog. Zephyr RTOS is an operating system for microcontrollers, tiny single-chip computers for embedded/IoT applications. To allow such devices to print, to use them as a cheap solution to make a non-driverless legacy printer driverless, or even to use them as controller in a printer, we are porting CUPS and PAPPL (Printer APPLications framework, developed by Michael Sweet) to the Zephyr platform via a GSoC project. This all I cannot do alone, also our little core team, of Michael Sweet, me, Zdenek Dohnal, Alexander Pevzner, Thorsten Alteholz, Aveek Basu, and Ira McDonald cannot do it. Also, from these it is only me actually working full-time on OpenPrinting. We need a developer/contributor community. And printing is not a very attractive subject matter to have tons of volunteers overrunning to our organization ... Therefore I make massive use of the Google Summer of Code, since 2008 every year, in the beginning we had 1-3 contributors every year, and when Aveek Basu from India (he worked at Lexmark that time) joined OpenPrinting and he asked around at several universities and colleges in India, we got around 5-6 every year, and when we started organizing the annual Opportunity Open Source conferences since 2023, 11 contributors for 2024 and also for 2025. They do most of the coding work, especially in the GUI part where I do not have very much experience with. Generally, coding got all the time a smaller and smaller part of my work, I did more and more creating solutions and project ideas, mentoring and managing (GSoC) student teams, presenting in blogs and on conferences, organizing conferences, communicating with OS distribution developers, GUI developers, other involved free software projects, potential OpenPrinting team members, ... And I love this work and want to continue it, and by doing it, I want to keep printing just working and continue making people tell that with Linux printing works better than under Windows and Mac. There are two ways to support my (and OpenPrinting's) work: Either by sponsoring OpenPrinting. We will soon be a full sub-organization of the Linux Foundation and accept sponsorships. Or, you hire me for continuing my work at OpenPrinting, as MandrakeSoft/Mandriva and Canonical did it in the past. See my profile on LinkedIn and also contact me by e-mail. Any form of help is highly welcome! And, do you know that Ken VanDine (also a great FOSS enthusiast, as me) from Canonical has written a book? Near 400 pages of all what you need to know about Ubuntu. Today I watched a video interview, where Alan Pope (Popey) has interviewed Ken. I found the video by Popey's announcements on Mastodon, and there I asked Ken whether he also covered setting up a printer, and he answered: printing just works in Ubuntu, thanks to you!!! Then I answered: Good documentation is great, but products which are so intuitive to use that one does not need any documentation are even better. The show must go on ... Destination Linux: Till Kamppeter and Michael Sweet about the history of OpenPrinting Ubuntu Indaba: Till Kamppeter and Michael Sweet about the New Architecture Ubuntu Office Hours: Till Kamppeter and Aveek Basu about the Google Summer of Code Ubuntu Summit 2022: Till Kamppeter hosting an OpenPrinting panel with Zdenek Dohnal, Johannes Meixner, Aveek Basu, and Deepak Patankar Ask Noah: Till Kamppeter on how OpenPrinting improved printing with Linux/Unix Linux Saloon: Till Kamppeter about how he got Snap enthusiast OpenPrinting - We make printing just work! Till Kamppeter, FOSDEM 2024, Brussels, Belgium And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and (new) on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions"
+ },
+ {
+ "id": "post:OpenPrinting-News-A-New-Approach",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - A New Approach",
+ "url": "/OpenPrinting-News-A-New-Approach",
+ "headings": [],
+ "tags": [],
+ "snippet": "Moving on from time-based monthly posts to one post per subject matter",
+ "content": "I have made it, for 5 years I have posted the OpenPrinting News here every month, everything what happened that month and what we had planned and in front of us, and never skipped a single month. In the beginning, it was not much work, Before I started here I also did monthly news posts on the mailing list, I just switched to the web site back in 2019 when our current GitHub-based site went live (First issue). The posts were still very short, more headlines than articles. Also running right into the pandemic at 2020 there were not that many events to talk about. But with the time my write-ups about the different subject matters got longer and more in-depth (November 2022 as example), I got deeper and deeper into coordinating everything to smoothly support the New Architecture of PPD-less all-IPP CUPS 3.x, I got more GSoC contributors for OpenPrinting and they did nice monthly reports, and from 2022 on, when the pandemic ended, I attended (and organized) many conferences which I also covered here. This got exhausting, as sometimes there was a lot of work to do and not much time to squeeze in the news post, especially when being principal organizer of the Opportunity Open Source and also giving several talks there, attending the GUADEC before and a second conference in India right after, and having to do all the usual daily work ... Then having to scrape all what happened in the month together without forgetting anything, adding a nice intro, that all makes it really hard not to forego a month ... This already made everything start to slip. In the beginning the news post for a given month was in the middle of that month. With the time the posts happened only at the end of the month, and this year I ended up to do them only in the following month ... So in the last weeks, after having reached the finish line of 5 years of monthly news posts, I started thinking about how I can do better (sorry for the pause caused by that). Under no circumstances I cannot just stop posting about what we are doing. It is very important for OpenPrinting to get visible, as we are the provider of an essential piece of infrastructure for the free software but not the attractive subject matter where we get swamped with volunteer contributors. The posts also help a lot to onboard new contributors, and last but not least, I by myself can easily check what was done already ... So what I will do now is not collect all the news of a month to put them together to one report, but instead, if I have something interesting or important to tell about, I will do it right away, in its own post. This lets news arrive more quickly, stuff is more freshly in my mind, so I forget less details and less items at all, and old news items are easier to find. Some of you will miss my intros then, as if posts are dedicated to a given subject matter they start with this subject matter right away. So I will also put some posts with mixed, smaller items from time to time. So let us start a great and eventful 2025 at OpenPrinting ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-April-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - April 2020",
+ "url": "/OpenPrinting-News-April-2020",
+ "headings": [
+ "Google Summer of Code 2020",
+ "Google Season of Docs 2020",
+ "Printer Application Framework/SDK -> PAPPL",
+ "Driverless scanning",
+ "Printing Stack Snap",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "5 students for GSoC; LP applies for Google Season of Docs; Progress of PAPPL, Driverless Scanning, and CUPS Snap, cups-filters license change",
+ "content": "The student application period has ended on March 31 and in the whole Linux Foundation we got 28 proposals. Naturally there are always many unusable proposals. For OpenPrinting we got 5 useful ones, in total for the Linux Foundation 10, but there can be more as not all of the workgroups answered to us yet. We have also high redundancy of mentors in OpenPrinting, so if a mentor drops out there should be no problem for the students to continue their work. Some of the students asked for deeper details of their projects and I have explained them the state of the art and what they can expect to work on. We will have to request our number of student slots by April 21 and the accepted projects will get announced by Google on May 4. See Google's timeline. The Linux Foundation will also apply as mentoring organization in this year's Google Season of Docs. Google accepts umbrella organizations for the first time now, after we had a meeting with the GSoD organizers. In the Google Season of Docs technical writers apply for documentation writing projects at free software organizations. This way the organizations get high-quality documentation for their software and technical writers get experience in the free software world. Here is our project ideas page and the project ideas for OpenPrinting. Especially we want to get a tutorial written so that printer and scanner manufacturers have an easy guide to design and package their drivers as Printer Applications. The time period for the writing of the documentation starts on September 14, right after the coding period of GSoC, so that we can get documentation written for code which got created during GSoC. The writing period ends on December 5 for standard projects and on March 8, 2021 for long projects. Michael Sweet has continued his work on PAPPL. He still tells that itis under development and not yet working, but many things already reached a working state. The emulated IPP printers are now advertised via DNS-SD and one gets a mostly correct response on a get-printer-attributes IPP request, meaning that the local CUPS creates a temporary queue, the driverless utility lists the printer's URI and creates a working PPD, and also cups-browsed creates a queue. And you can actually print on this emulated printer, jobs being listed on the web interface of the test Printer Application. In the web interface the structure of pages is already defined, but most pages are still empty. Job history list and consumables are displayed already. This also means that things planned for the Printer Application SDK GSoC project will already be done when the coding period starts, but here we will simply be flexible with what will exactly be done during the project. We will be able to do additional things which we did not plan in the beginning. I am suggesting the following: Take care that all the properties described on here last month are fulfilled. I have agreed with Mike on them. But if Mike does not implement all of these it will be the student's task to add what is missing. One point Mike will most probably not add is the retro-fitting of old PPD/filter drivers. For these we will need to copy over PPD-supporting code from libcups into cups-filters to conserve it for the legacy driver support with a minimum of code creation. Re-structuring of cups-filters to make it easier to use the code of the filters in Printer Applications. I succeeded to get “escl” maintainer Thierry Huchard and “airscan” maintainer Alexander Pevzner join their projects instead of competing with each other!! (see thread on GitLab). Also I did a lot of testing for WSD (Microsoft’s Web Services for Devices) support by the “airsane” driver on my HP OfficeJet 8730 Pro. With my feedback all the problems got fixed and my device is now perfectly scanning with both eSCL (Apple AirScan) and WSD and probably 100s of other multi-function devices, too. Currently we ran into a problem that some devices provide lossless images only in PDF format, so raster extraction from PDF is needed. Unfortunately, we did not find emough students to cover the student project we posted for raster extraction for printing. We discussed the problem and in addition to classic renderers (Ghostscript, MuPDF, Poppler) many libraries were mentioned, which partially also do complete rendering but at least are capable of extracting bitmaps: PDFium, PoDoFo, QPDF. For the latter I confirmed with author Jay Berkenbilt that it is actually capable of extracting raster images. My suggestion is to go with QPDF as cups-filters already uses it and the extraction algorithm will also e used for printing to get higher output quality and faster processing. The discussion of a snapd interface for the Printing Stack Snap has gone on with a video meeting and on the Snapcraft forum. Here we first found out that we have to patch cupsd so that on inquiries on the domain socket it can find out from where those come: Which process? Is the client a Snap? ... Two approaches came to discussion, using PolicyKit (adding PolicyKit support to CUPS) and applying the same mechanism which is applied to the PulseAudio Snap to restrict who is allowed to record audio instead of only playing. We settled on the latter and currently I am investigating how to apply this to the CUPS daemon. No further releases. Still no commits on the CUPS GitHub since Dec 18, 2019. Currently released is 1.27.4. Next development steps of cups-filters are to go towards a PPD-less world and Printer applications (most I mentioned already last month): Make all filters working without PPD, with IPP options. Exceptions are filters especially made for PPDs, as foomatic-rip. Add build options for no-PPD-supporting CUPS, raster-only Printer Applications, no cups-browsed. Snaps will often have their own cups-filters and then a very limited part of it. Move more functionality into the libcupsfilters library, so in Printer Applications filter chains could be implemented as library function calls instead of external executable calls Move all the PPD-related functions of the CUPS library (libcups) into a new libppd, to allow converting legacy drivers into Printer Applications with minimum need of creating new code To make the move of filter functionality into libcupsfilters possible, and also to integrate well with CUPS and PAPPL, we will change the license of cups-filters to Apache 2.0 with (L)GPL2 exception. This is the same as CUPS and PAPPL use. I have reached out to all contributors and all but two agreed so far, no one rejected. I am still waiting fo the answer of the remaining two. We have agreed on not to rename cups-filters. It will only get a new generation number (versions 2.x.y). cups-browsed will perhaps get spun out into its own project. 1.27.4: Bug fix release, several minor fixes and especially memory issues in cups-browsed This will be the cups-filters version of Ubuntu 20.04 LTS (Focal Fossa). No further news."
+ },
+ {
+ "id": "post:OpenPrinting-News-April-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - April 2021",
+ "url": "/OpenPrinting-News-April-2021",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "Google Summer of Code 2021",
+ "Google Season of Docs 2021",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "OpenPrinting Summit/PWG Meeting, GSoC, GSoD, CUPS Snap proxy mode, PostScript Printer Application, CUPS",
+ "content": "On May 4-7 we will have our annual meeting again, the OpenPrinting Summit/PWG Meeting. Because of the Corona virus situation we will again have a virtual meeting, with the side effect that everyone can participate, without needing to travel. Instructions for participation via WebEx are on the meeting's page. The agenda is already put up, with the OpenPrinting part on the first two days. Links to the slides will be added on the meeting page and we will link to any summary/outcome here in the next month's news. With the Linux Foundation being accepted as mentoring organization we are now receiving the student's proposals until the deadline on April 13 (Timeline). After that we have to select the students/projects we want to work with. OpenPrinting's project ideas are posted, but further ideas are still welcome. Note that the projects are half-length this year, 175 hours instead of 350 hours (see our October news). Larger projects we should run in the Linux Foundation Mentoring Program instead of in the GSoC. We have also applied as mentoring organization in this year’s Google Season of Docs. In the Google Season of Docs technical writers apply for documentation writing projects at free software organizations. This way the organizations get high-quality documentation for their software and technical writers get experience in the free software world. Our project this year is User and Developer Documentation for cups-filters. With this we want to get complete user and developer documentation for cups-filters 2.x. CUPS Snap in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse Now, with the CUPS Snap in the Snap Store and all interfaces connecting automatically we started discussing how the cups interface for client Snaps is supposed to work and found out that if a Snap which plugs cups for printing is installed on an older Ubuntu or a non-Ubuntu distribution with classically installed CUPS that there is no protection against administrative action on CUPS, as the CUPS damon has no Snap mediation (CUPS daemon checks whether client is Snap and then requires cups-control for admin tasks). To close this security hole snapd developer Ian Johnson picked up some weird hypothetic idea from me and suggested to implement it this way: The snapped cupsd (has Snap mediation) as a firewall for the classic cupsd on the system (does not always have Snap mediation)! So after some weeks of thinking about the best way to implement it and of coding and testing the proxy mode of the CUPS Snap got born! If a Snap of an application which prints (plugs cups) is installed, the CUPS Snap gets force-installed like a package dependency (\"default-provider\" for content interface) and the snapped application only communicates with the CUPS Snap for printing, never with a classically installed CUPS if one is there. The CUPS Snap works stand-alone as system's CUPS if there is no classic CUPS and it goes into the new proxy mode if there is a classic CUPS. The snapped CUPS in proxy mode mirrors all the queues of the classic CUPS, copying the PPD options for the client's print dialogs to show all options, passes on jobs to the classic CUPS, and lets the classic CUPS apply its printer drivers so that the user continues with his habitual queues and drivers. This all goes automatically and transparently without user intervention needed, nor any changes being done on the classic CUPS. See the technical details of the proxy mode. The content interface is not yet implemented, but it will be my very next step on the CUPS Snap. Features and fixes in the past month: Added the proxy mode - See above Switched to GitHub master snapshot of CUPS - As the Snap support code for CUPS is upstream now no patches for CUPS are needed any more! Fixed in CUPS: Grant access without calling snapctl when the client is our Snap The usb CUPS backend needs to run as root, set permissions appropriately Redefined plugs and slots to standard names cups and cups-control, tested and fixed to have everything work as expected Removed more unneeded plugs from the utilities in the apps: section of snapcraft.yaml Updated version of upstream source package QPDF to 10.3.1 and of cups-filters to 1.28.8 Install the default cups-browsed.conf on the correct place in the Snap README.md - Updated for no need of manual interface connections, interface names, deactivating classic CUPS, proxy mode, new discussion links Main TODOs are: Implement the content interfaces Testing Turn classic CUPS drivers into Printer Application Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap. PostScript Printer Application in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse Nothing really spectacular happened here, only bug fixes, two crashers got fixed after bug reports from a user: Crash on typo in margin handling code Crash on boolean vendor options in PPD The PostScript Printer Application (and any other Printer Application) should now correctly tell that a print queue name is invalid when one with special characters or starting with a digit is entered, instead of telling that a queue with this name already exists. Unfortunately, some things in the PostScript Printer Application are not working as expected due to bugs in PAPPL: USB connection only uni-directional (This especially leads to polling option defaults and installable accessory configuration not working) When creating a print queue via command line, I cannot auto-select the driver (You cannot use -m auto when creating a print queue via command line) Web interface: After adding a queue via command line the frontend does not show all queues (Display glitch of the web interface) \"autoadd\" via command line works but gives 3 times \"ps-printer-app: Unable to get IEEE-1284 device ID: Pipe error\" (Principally it works, but ugly messages appear on the screen) For creation of GUI tools to easily find Printer Applications and set up printers we would need these improvements: Extend \"ps-printer-app drivers\" to also show supported device IDs Add subcommand to simply ask whether a given printer is supported With appropriate features added to PAPPL we will be able to also add the following: Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. Currently released is 2.3.3op2. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 15 months. Ubuntu Hirsute Hippo (21.04) will ship with CUPS 2.3.3op2, the CUPS Snap uses the current GIT master. Currently released is 1.28.8. Many things were going on in the other projects, so here we have only some bug fixes, overtaken from CUPS and also from issues fixed by students applying for GSoC 2021 as assignments. 1.28.8: Bug fix release, to fix several different issues (see below) Ubuntu Hirsute Hippo (21.04) will ship with cups-filters 1.28.8, also the CUPS Snap currently uses this version. Currently released is 1.0.2. PAPPL development has continued, approaching 1.0.3. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-April-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - April 2022",
+ "url": "/OpenPrinting-News-April-2022",
+ "headings": [
+ "Ubuntu 22.04 LTS (Jammy Jellyfish) is coming!",
+ "Linux Application Summit 2022",
+ "Google Summer of Code 2022",
+ "CUPS Snap and snapd printing interface",
+ "AppImage and printing",
+ "Approaching cups-filters 2.0",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "Linux App Summit 2022, GSoC 2022, \"cups\" Snap interface, Snap vs. AppImage for printing, approaching cups-filters 2.x, Ubuntu 22.04 LTS",
+ "content": "On Thursday next week, April 21, 2021, is Ubuntu release day again! Ubuntu 22.04 LTS! Not a lot of new stuff in terms of printing (in addition to all printing- and scanning-related packages being up-to-date) but at least many bug fixes, especially with the page geometry, number-up, orientation-requested, all settings for print-scaling (auto, auto-fit, fit, fill, none) are now working correctly, in arbitrary combinations. Otherwise we have GNOME 42 now with a lot of nice new features! I will be on this year's Linux Application Summit on April 29 and 30 in Rovereto, Italy, near the Lake Garda! There I will give a talk about the New Architecture of printing and scanning and what is important for developers of desktop applications. I will give a summary of the changes and tell what needs to be changed in the desktop world, the new printer setup tool, print dialog requirements and CPDB, snaboxed/distribution-independent packaging, like Snap, Flatpak, ... This should help application and GUI/desktop developers to get print and scan functionality of their software just work. The talk will take place on Sat, April 30 at 15:35 CEST in the Auditorium. It will be also possible to participate remotely. If the talk will get recorded, I will post a link here and also in the May news post. There will also be a Canonical booth with a Canonical gang of 5 people (including me). The orange polo shirts are already in production. And on Fri, April 29, at the end of the lightning talk session an old, gray-bearded, long-time Canonical employee (nearly from the beginning on) will do an important announcement! Thanks, Heather Ellsworth, for participating in the organization of the event and making me aware of it! The time window for the contributor candidates to submit their proposals to Google is open and many proposals got already submitted. Deadline will be April 19, a week from now. So we are still open for GSoC contributors, also non-students, like for example retired people looking into getting involved, and especially people who join our OpenPrinting community, stay with us, maintain, and improve their code, bring in new ideas, mentor contributors in the following years, write on our web site, ... We have posted everything you need to know for participating and our project ideas for you to have a look. We also appreciate any new project ideas brought up to us and narurally also contributors suggesting their own idea. CUPS Snap in the Snap Store Unfortunately, snapd 2.55 with the new cups interface has not made it into the stable channel of the Snap Store yet. A non-cups-interface-related regression has made it getting withdrawn shortly after being promoted into the stable channel. Due to the progressive releases many people did not even see it in stable. The regression has been fixed already and snapd 2.55.3 with the fix is available in the beta and candidate channels. So who wants to test the new cups interface can manually install snapd 2.55.3 via Then everything should work as described last month. If not, there is still a bug which could affect you: During the testing of 2.55.2 I also discovered a bug of the CUPS_SERVER environment variable wrongly being set to /var/cups/cups.sock on ALL Snaps, regardless whether they plug cups or not, especially also on the CUPS Snap and Snaps plugging cups-control which cease to work by that. This got fixed by Michael Vogt, the snapd team manager. When testing the fix I discovered another bug of the CUPS_SERVER environment variable wrongly set by snapd 2.55.2 persisting on the update to the fixed 2.55.3 and with further testing and even more testing I found out that to work around/fix it, you have to run on all your already installed Snaps after updating snapd to 2.55.3 to \"reset\" their environments. This assures that the CUPS_SERVER environment variable is set to /var/cups/cups.sock in all Snaps which plug cups and not set in any other Snap, especially the CUPS Snap or Snaps plugging cups-control. So apply the command either to all Snaps, listed by or at least to the CUPS Snap and each Snap which plugs cups or cups-control: Michael Vogt told me that he is working on a fix this week and that he already has an idea of what can have caused the bug. Anyway, thanks a lot to Michael Vogt and his team on the hard work on snapd. I had a quick look (especially also for the talk on Linux App Summit 2022, see above) into this format for distribution-independent packaging and found out that it is, as Flatpak, also not suitable for packaging system services, like CUPS, ipp-usb, or Printer Applications. AppImage is not actually sandboxed packaging, as Snap and Flatpak are. It is simply a single downloadable file, which a user puts into their home directory, makes it executable, and starts it, this way the included (squashfs) file system is mounted and the application started. The file system is supposed to contain everything to run the application. So one does not need to install anything. Not having any security concept (not found the word \"security\" on the site), like AppArmor or similar, it would be dangerous to put such files into system directories and run them as root, also as normal user this is questionable. So this concept is not suitable for system daemons, like CUPS, ipp-usb, and Printer Applications, meaning that we will continue Snap-only in terms of distribution-independent upstream packaging. Printing from AppImaged applications should just work though, as there is no security concept and therefore full access to the host system. I am getting even closer to the release, nearly no bug fixing and feature adding any more but mostly work on cleaning the code and getting a nica API. So we will see cups-filters 2.0 soon. Important part of my current work on cups-filters is to get away from mix-up of different coding and naming styles arising from the many code contributions I collected from the announcement of the switch-over from the PostScript-based to the PDF-based printing workflow on the first OpenPrinting Summit in Atlanta, Georgia back in 2006. I want to get cups-filters following the same coding guidelines as Michael Sweet created for CUPS, and so extend them to the rest of OpenPrinting. Therefore I started with the naming of the functions and data types. All public API functions now have names starting with cf and the name itself in CamelCase, as the functions of CUPS which start withcups instead. Library-internal functions are declared in *-private.h files and have names like the API functions but starting with _cf, like the private functions of CUPS start with _cups. Functions used in only the source file where they are defined (local functions) are not declared in any *.h file, declared static, and have all-lowercase names with \"_\" as word separator. Constants are all-uppercase, also with \"_\" as word separator, and start with CF_. This way one can very easily see in the source code of some program what comes from libcupsfilters. This is a substantial change on the API, but fortunately, there are only very few consumers of the libcupsfilters API yet, to my knowledge only pappl-retrofit and the c2esp printer driver. I have updated the pappl-retrofit code appropriately and also the patch for the c2esp printer driver (commit, commit) in the Ghostscript Printer Application. After that I have tested all the 4 Printer Applications and all are working correctly with the new API. Even without the renaming the API of the libcupsfilters in cups-filters 2.x is not compatible with the libcupsfilters of the 1.x series. Therefore I have bumped the library's soname to 2. I have also set the version number to the one of the first planned release: 2.0b1. The new cups-filters will also drop support for old software. At least CUPS 2.2.2, Ghostscript 9.56.0 (if Ghostscript is used), and QPDF 10.3.2 are required. Note that no yet all of the conditionals are removed. When compiling on Ubuntu 22.04 (gcc 11.2.0) there are no compiler warnings. All functions in libcupsfilters, especially the filter functions, do not log to stderr. All logging is done via logging functions (see also cupsfilters/log.h, cupsRasterParseIPPOptions(), bannertopdf(), raster driver functions). Filter functions do not load or modify the PPD file data structure. When using PPD files, the structure has to be set up before calling the first filter function for the job. There is a new API function for that, cfFilterLoadPPD() There is also a new filter function to free the space used by the PPD data structure again: cfFilterFreePPD(). Generally all filter functions use parameters instead of environment variables now. The ghostscript() filter function now makes use of Ghostscript 9.56.0 or newer supporting all data formats used by driverless IPP printing as output formats. It outputs PWG Raster, Apple Raster, PCLm (both color and grayscale), PDF (standard with vector graphics and fonts, embedded raster in color and grayscale), and for legacy CUPS drivers also CUPS Raster and PCL-XL (both color and grayscale). The default output format of the gstoraster CUPS filter for the case that the FINAL_CONTENT_TYPE environment variable is set to an unknown format is CUPS Raster now, as the unknown format can come from a rasterto... CUPS driver. Ghostscript is the recommended renderer (RIP, Raster Image Processor) for high-level graphics print files (PDF and PostScript) for CUPS, cups-filters, and Printer Applications. It is optimized for print output and supports ALL data formats for driverless printing. Note that we cannot neglect PCLM in driverless printing! Printers like the HP LaserJet M15 do driverless printing only with PCLm! For those who prefer MuPDF instead of Ghostscript as PDF renderer the mupdftopwg() filter function/CUPS filter is now fully usable as one can generate with it (and the help of an additional post-filter) all Raster formats (Apple/PWG/CUPS Raster, PCLm) and so one can use MuPDF instead of Ghostscript for all driverless printers and printers with CUPS Raster driver (and with pdftops() also for all PostScript printers). mupdftopwg() was originally named mupdftoraster(). We renamed it as the underlying mutool only outputs PWG Raster and the actual output we get by calling pwgtoraster() or rastertopclm() afterwards. The changes we did on mupdftopwg() are simply to get color space and resolution for the final output format and not for PWG Raster from the PPD file or IPP attributes. Therefore we enhanced the pwgtoraster() filter function to take both Apple and PWG Raster as input and produce Apple, PWG, and CUPS Raster as output, Fixed the rastertopclm() filter function to work with printers which do not supply a default resolution for PCLm, typically models which support only one single resolution, like the HP LaserJet M15. As the pclmtoraster() filter function already produces PWG Raster, it is only the flick of flag in the cupsRasterOpen() function to get Apple Raster output, so we support Apple Raster here now. Let the rastertopwg() filter function error out if no or a wrong output format is specified and let the CUPS filter rastertopwg default to PWG Raster. The pdftopdf() filter function received further fixes on the output page geometry. I especially fixed the output when the landscape or orientation-requested options are used and when the auto-rotation of the input pages is suppressed (see also this great write-up from Brian Potkin about pdftopdf). Fixed also the behavior of the filter function if the output page is landscape-shaped (Width > Height) which is usually the case if the printer feeds the paper long-edge-first (Issue report). in the pdftops() filter function use Poppler instead of Ghostscript for all Apple LaserWriter models, as they all seem to have the firmware bug not working with Ghostscript's PostScript output (commit), We also identify HP LaserJet printers more precisely to apply the correct PostScript interpreter bug workarounds. Only HP LaserJet XXXXY models with XXXX being a number of at least one and at most four digits and Y an optional group of letters (no extra words after that) are to consider old and to be used with Poppler, whereas printers with extra words in the model name (HP LaserJet 500 color M551) are to consider modern again and need Ghostscript's PostScript output. For the universal() filter function we also install the individual filter executables together with the universal CUPS filter now, as PPD files could explicitly call the individual filters via their *cupsfilter(2): lines (commit), As the executables are only stubs which call the actual filter functions this does not occupy much more disk space. Several fixes got applied to the bannertopdf() filter function (commit). Especially it does not use environment variables any more, but instead, it takes the template directory as parameter and printer info and location via the \"printer-info\" and \"printer-location\" options or IPP attributes. All dynamic memory is freed correctly after use now and there is no crash on a missing PDF template any more. Also let the generated PPD files for driverless printers only have one *cupsFilter2: \"...\" line for the preferred data format and not one for each supported format any more (commit), and we removed the unused Kolor Manager/Oyranos support code from the color management functions. What is missing now is a way to build cups-filters without PPD support, general code clean-up, license info in the source files, and then we are ready for a Release Candidate. HPLIP 3.22.2 in all Printer Applications The HPLIP Printer Application (Snap Store) got another update of the underlying HPLIP version. It is now HPLIP 3.22.2. We continue using the Debian package sources to include more than 80 bug fixes not adopted upstream. Sorry for the delayed updates due to this. It is always a lot of work for Debian printing package maintainer Thosten Alteholz to update the upstream source code and to adapt the patches where needed. Thanks a lot for this, Thorsten. The update adds explicit support for the new HP printer models which got released in the beginning of 2022. Note that most of those printers should also work as driverless IPP printers and therefore also work without the HPLIP Printer Application. The update worked out smoothly. If you have installed an HPLIP Printer Application version which still uses an older HPLIP and have the proprietary plugin installed, the plugin gets updated right after the installation of the new version of the Printer Application. Note that this can take some minutes and that during this time your printer will perhaps not work. After that, I have updated also the HPLIP used in the PostScript Printer Application (PostScript PPD files for HP printers, Snap Store) and in the Ghostscript Printer Application (HPIJS for non-HP PCL-5c/e lasers, Snap Store) to the Debian package source of HPLIP 3.22.2. In all the 4 Printer Applications (and also in the CUPS Snap) I have also fixed bugs caused by GNU-TLS -> SSL transition of CUPS and PAPPL. In addition, I have updated the code of pappl-retrofit and the patch for the c2esp printer driver in the Ghostscript Printer Application (commit, commit) for the new cups-filters 2.x API. I tested all the 4 Printer Applications and all are working correctly with the new API. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|4584| |ipp-usb|ipp-usb|1895| |ps-printer-app|PostScript Printer Application|2358| |ghostscript-printer-app|Ghostscript Printer Application|1235| |hplip-printer-app|HPLIP Printer Application|4141| |gutenprint-printer-app|Gutenprint Printer Application|3395| Currently released is 2.4.1. There will be further bug fix releases in the 2.4.x series. Some bug fiixes were done, see changes below. Ubuntu Jammy Jellyfish (22.04 LTS) will come with 2.4.1. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.15. We are continuing to polish and to fix bugs for the 2.0.0 release. I have especially renamed function and data types to get a clean API, bumped the soname of libcupsfilters to 2, set the version number to 2.0b1, and fixed tons of bugs. I also backported several fixes to the 1.x branch so that they make it into current Linux distributions, especially Ubuntu 22.04 LTS (Jammy Jellyfish) which has Final Freeze tomorrow and will get released one week later on thursday, April 21. The fixes are the ones on the pdftopdf CUPS filter for printing on printers which take the paper long-edge first (1.28.13) and for the landscape or orientation-requested options to work correctly (1.28.14). Also fixes for the handling of PostScript interpreter bugs in pdftops got backported, for Apple Laserwriter printers into 1.28.13 and for HP LaserJet printers into 1.28.15. I also backported the fix for PCLm printers which do not report their default resolution into 1.28.14. 1.28.13 Bug fix release, for correct printing on printers which take in the paper long-edge-first and for Apple LaserWriter printers. 1.28.14 Bug fix release to get correct PDF output when using \"landscape\", \"orientation-requested\", and/or \"nopdfAutoRotate\" options, and to get PCLm printing work on printers not telling their PCLm default resolution. 1.28.15 Bug fix release, to make all HP LaserJet PostScript printers correctly work. Ubuntu Jammy Jellyfish (22.04 LTS) will come with cups-filters 1.28.15. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.1.0. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-April-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - April 2023",
+ "url": "/OpenPrinting-News-April-2023",
+ "headings": [
+ "Ubuntu 23.04 (Lunar Lobster) is coming!",
+ "Linux App Summit 2023",
+ "OpenPrinting",
+ "Ubuntu/Canonical",
+ "Release party!",
+ "Google Summer of Code 2023",
+ "Release Candidate for cups-filters 2.0.0",
+ "Common Print Dialog Backends getting into the dialogs"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/3-_aUNZMvko/hqdefault.jpg",
+ "snippet": "Ubuntu 23.04 release, LAS 2023 in Brno, GSoC 2023, Release Candidate for cups-filters 2.0.0, CPDB support in print dialogs",
+ "content": "Not long ago that there were the March News, and now we already have the April ones! April News contain important announcements and therefore they cannot be late, usually the new Ubuntu release, and the latest and greatest about the upcoming Linux App Summit. But no April fool's pranks, like this one, for that we are too late. But don't worry, we will go on snappy ... On Thursday next week, April 20, 2023, is Ubuntu release day again! Ubuntu 23.04! This will be the first distribution with the second generation of cups-filters! The Release Candidates of the components, released this week, in time for Final Freeze have made it into it. This is the first piece of the New Architecture, and even if Ubuntu 23.04 has not yet switched over, it is important to have the new cups-filters already there so that it has one Ubuntu release (6 months) more of getting intensely tested. The user-facing printing-related changes are lots of bug fixes: More accuracy in handling page sizes and margins, including overspray for borderless printing orientation-requested now also correctly working for images and plain text as input Plain text printing in landscape orientation Correct handling of the print-scaling attribute for all input formats Suppress auto-rotation of images by supplying landscape=false or orientation-requested=3/4/5/6 attributes Auto-selection of output color space based on requested print quality Color printers print in color by default 16-bit-per-color-output support for all input formats Correct 1-bit monochrome dithered output Apple Raster preferred over PDF for more printing speed and reliability, printer's PDF interpreters are often slow and buggy cups-browsed is more stable and reliable now Universal CUPS filter for less external filter executable calls by CUPS In addition, there are included: CUPS 2.4.2 (with auto-setting PPD options by print-quality, print-color-mode, and print-content-optiomize job IPP attributes) Ghostscript 10.0.0 (with fix for not matching custom page size against PPD) HPLIP 3.22.10 Otherwise we have GNOME 44 now with a lot of nice new features! And there will be a release party!! In-person on the Linux App Summit in Brno! On Saturday evening, right after the talks. A joint party together with the release of Fedora 38! The Linux App Summit 2023 in Brno in the Czech Republic is approaching! It is less than a week and we will meet in Brno. Brno is an office location of Red Hat, so we will have many people from Red Hat on the Summit, but for Ubuntu not getting overrolled by them there will be a Canonical Gang of 7 (!): Dennis Loose, Heather Ellsworth, Igor Ljubuncic, Jeremy Bicha, Jesús Soto, Marco Trevisan, and me. Update: Links to the recordings Recordings: Day 1, room 1, Day 2, room 1, Day 2, room 2. Direct links to all sessions are in the comments of the videos (thanks, Ban Jo @Enry211). Unfortunately, there are no recordings of room 2 on day 1. As printing and scanning are not unimportant for the free software application ecosystem, OpenPrinting will be present again, this year with two sessions, both on Saturday, April 22 (all times CEST): 15:00: OpenPrinting Informal BoF/Scheduled Hallway Session Meeting in front of Room 1/Plenary Room, exact location TBD, no streaming/recording. Please watch out here and on Mastodon, #LAS2023, #LinuxAppSummit, and #OpenPrinting. This one is an informal meeting of me with my colleagues and contributors on the printing area, Zdenek Dohnal (Red Hat), Marek Kasik (GNOME/GTK), Albert Astals Sid (KDE/Qt), Harald Sitter (KDE/Qt). We will mainly talk about the printing GUI, the print dialogs of Desktop environments and applications, and also printer setup tools, about the GSoC work in this area, but if desired, also about general printing subjects ... Everyone can join, make suggestions, ask questions, for example for developing apps with print or scan functionality, or perhaps you want to join OpenPrinting? For developing, documentation, testing, ... The duration of the meeting is not pre-determined, if we have more to discuss, it simply takes longer, at the latest, it ends around 16:30, and we all will move into the Plenary Room for the second session ... 16:35: The New Printing GUIs: GNOME Control Center and Common Print Dialog Backends Room 1/Plenary Room (Video, Slides) Here I will give an update about our printing-related GUI work for the New Architecture. I will show off the state of the art of the \"Printers\" module in the GNOME Control Center, done by GSoC contributor Mohit Verma, and the Common Print Dialog Backends (CPDB), done by GSoC contributor Gaurav Guleria. I will demo the new GUI components, the GNOME Control Center, and the CPDB based on the GTK print dialog, and, if possible also the Qt print dialog. As I meet Marek Kasik, maintainer of the \"Printers\" G-C-C module and the GTK print dialog before this session and having him also in the room, there may be changes. After the demos there will be a Q&A/AMA (As me anything) part and there will not only be me but also Zdenek, Marek, Albert, and Harald (from the BoF) be present and participating in the conversation. With a Canonical Gang of 7 and Canonical being main sponsor of this event, we will have a lot of sessions from the Ubuntu folks: Opening and Closing Remarks Given by Heather Ellsworth and Igor Ljubuncic. Booth There will be a Ubuntu/Canonical booth, no marketing people, but a gathering point to meet who makes Ubuntu, to start great hallway chats (like described here). Office Hours Meet the whole gang at the booth, Saturday in the lunch break, 12:45-13:45. Ask your questions, discuss with us the future development of Ubuntu, get help for your application projects by the desktop developers and snappers, ... Update: We did a panel instead (video). Talks, panels, workshops, ... Saturday, April 22 14:15: Snap performance optimization - The Firefox case study Igor Ljubuncic, Room 1 (video) 14:15: What's next for the Linux App Ecosystem? Panel Discussion Host: Sriram Ramkrishna; Heather Ellsworth is one of the guests, Room 2 (video) 15:50: Bringing Windows applications to Linux app stores with Wine snaps Mr Merlijn Sebrechts (Ubuntu - Ghent University - imec) and Ms Lucy Llewellyn (Snapcrafters & Ubuntu), Room 2 16:35: The New Printing GUIs: GNOME Control Center and Common Print Dialog Backends Till Kamppeter, Room 1 (see above, video, slides) 16:35: Accessibility Testing Workshop Heather Ellsworth and Jeremy Bicha, Room 2 Sunday, April 23 14:40: Testing Flutter Desktop Applications Workshop Dennis Loose, Room 2 (video) 16:20: Game development on Linux (Lightning Talk) Jesús Soto, Room 1 (video) 16:30: We can’t spell BUGs without U Heather Ellsworth, Room 1 (video) Complete schedules We celebrate the 38th Release! Ubuntu? Fedora? Both!! Ubuntu 23.04 Lunar Lobster, the 38th release of Ubuntu and Fedora 38. Now you would ask yourself whether Ubuntu's and Fedora's first releases happened to the same time. No, Fedora started earlier, in November 2003, and Ubuntu is really young, they started in October 2004 with 4.10, the Warty Warthog. While Ubuntu always had the strict twice-a-year pace, Fedora's pace was somewhat more loose. But independent of this, we will all gather right after the talks of Saturday and celebrate these 2 new Linux distro releases together. With cake and general merriment ... The deadline for contributors to submit proposals has passed on April 4 and all our candidates have worked out a proposal with help from me and also their mentors. Now they are concentrating on their projects again planning their work and partially already starting with it. Until April 27 we have to rank all the proposals (for the Linux Foundation, not only OpenPrinting) we like to actually mentor. By this Google will know how many proposals we want to accept and how important each one is for us (or how much confidence we will have that the project works out). If we do not get the requested amount of contributor slots (usually when all the mentoring organizations together demand more slots that Google has budget for), the proposals ranked highest will get automatically accepted, the rest gets rejected. So we have once to evaluate the importance of each of the projects for OpenPrinting but also to observe how well the candidates have done up to now and how they will do until the 27th, to get the ranking for OpenPrinting together. The other sub-organizations of the Linux Foundation will do the same thing and provide their rankings. Now we as the organization administrators have to assemble a ranking for the whole Linux Foundation based on each sub-group's ranking, each one with a different number of proposals. We cannot simply rank the sub-groups now, putting the one we consider as most important first, and so forth, as then whole subgroups at the end of the list do not get any project end the highest ranked ones all their projects. So we have to join the rankings in zipper style, taking into account also the different numbers of projects of each group. This assures that nobody gets stepped on their toes when a cut-off of contributor slots will happen. I have released the release candidates (2.0rc1) of the 4 components libcupsfilters, libppd, cups-filters, and cups-browsed and updated the Ubuntu 23.04 (Lunar Lobster) packages in time for the Final Freeze last Thursday. Filter functions To prepare for this I checked through all the repositories for not yet merged pull requests, assignments of GSoC candidates, and have done some further testing, partially motivated by the bug reports and experiences from the GSoC candidates. Especially I got the following sorted: GSoC candidate Sourabh Sav reported that he was not able to suppress the auto-rotation of images when printing JPG or PNG image files. So I investigated the case and ended up correcting the attributes orientation-requested (page layout orientation, landscape, upside-down, ...) and landcape in the cfFilterImageToRaster(), cfFilterImageToPDF(). cfFilterTextToPDF(). and cfFilterPDFToPDF() filter functions. I also discovered that cfFilterTextToPDF() was not able to layout text in landscape orientation at all, which I have also fixed. And I also fixed the ppi attribute in the image filters, which means printing with given pixels per inch and not crop, but let the image span over more than one sheet instead. Also on auto-rotation (or with the \"landscape\" attribute), the printer's preferred rotation direction (counter-clockwise or clockwise) is used, according to the printer's landscape-orientation-requested-preferred IPP attribute (or “*LandscapeOrientation: ...” PPD keyword). In Issue #25 of libcupsfilters problems with 16-bit-per-color output were reported, one being the image filters producing a blank page, with correct page size, resolution, and color mode, but just white. This problem I gave to GSoC candidate Harshit Krishna as assignment and we got it solved by him adding the missing code to convert the input to 16 bits per color. I also assigned Issue #20 of libcupsfilters, a grid of black dots appearing on white backgrounds when printing in dithered 1-bit monochrome, and Issue #26 of libcupsfilters, empty page output when not supplying the page size for the job, and ended up fixing them by myself as the GSoC candidates disappeared. libcups3 support And the Release Candidate has one last, slight API change in libcupsfilters: For resolving DNS-SD-service-name-based device URIs (ex.: ipps://psc2500%20(E313F0)._ipps._tcp.local/) for IPP printers as CUPS uses them, to standard IPP URIs (ex.: ipps://localhost:8000/ipp/print/psc2500) libcups2 does not offer any useful API and we therefore ended up implementing 2 workarounds, one based on the libcups2's API for CUPS backends and the other calling the external executable ippfind. For each we have created an API function in libcupsfilters. libcups3 has an API function for this task now. Therefore we have adapted our API for its use already now, even with libcups3 support only being introduced in libcupsfilters 2.1.0, because we want to keep the API stable for the whole 2.x series. Change is renaming the function cfippfindBasedURIConverter() to cfResolveURI2() to not have the function named by the method it uses. Now the names are suitable for using the new API function httpResolveURI() of libcups3, cfResolveURI() always returning the IPP URI for printing and cfResolveURI2() taking an additional boolean argument to tell whether one wants the print or fax out URI. The implementation of the libcups3 support (see also last month) for libcupsfilters is now nearly completed. Thanks to GSoC candidate Gayatri Kapse for his excellent work. Bug report from Ubuntu 23.04 user After having taken care in libcupsfilters and libppd that if the destination printer supports both Apple Raster and PDF to send the jobs in Apple Raster, due to the fact that PDF interpreters in printers are often slow and/or buggy, I have discovered now that cups-browsed still selects PDF in such a case and fixed this now. This follows a bug report by a user testing Ubuntu 23.04 with the fresh update to cups-browsed 2.0b4. In the same report he also complained that the auto-generated print queue for his color printer defaulted to grayscale printing. This was due to the printer reporting \"auto\" as color mode default and the PPD generator not setting the default color mode then. This is now fixed in libppd. Autopkgtests As told here in February and March Debian and Ubuntu packages have so-called autopkgtests which are run on the build servers after each upload and build of a new package release, with the package installed on a virtual machine running the destination distribution. This revealed especially two bugs which we fixed in the Release Candidates. After uploading cups-filters 2.0b3 to Ubuntu, the autopkg test of the foo2zjs printer driver package started failing, but only on the ppc64el architecture. Repeating the test also failed, so the problem seemed not to be intermittent. There it always came to a SIGPIPE error when the foomatic-rip CUPS filter called Ghostscript. As I do not have easy access to a system based on ppc64el, I talked with Steve Langasek (@vorlon) from the Ubuntu release team on IRC (#ubuntu-release, Libera.Chat) and he had some test setup where he could investigate the problem. He found a fix for this in foomatic-rip and provided a pull request. Thanks a lot, Steve. Another failure caused by the new generation of cups-filters was the failure of the autopkgtest of the dymo-cups-drivers package. Test print jobs were simply erroring out. The reason were duplicate page size entries in the PPD files of this label printer driver, created because of differently named label types having the same size. In the process of converting the PPD file into printer IPP attributes for libcupsfilters' filter functions only one instance of the size with only one of the names got cached and with the default size being the other name, the default got not found and without a defined page size the error occured. Now the default size is also matched by the size dimensions. Gaurav Guleria is currently working on getting the merge request for CPDB support in the Qt print dialog merged. With that and the GTK dialog we are not yet ready, as several applications have their own dialogs which also need CPDB support. GSoC candidate Kushagra Sharma, mentored by Gaurav, is already working on this. Naturally this needs also support from the respective upstreams, so I reached out: I posted a Feature request for Mozilla (Firefox/Thunderbird), a Mailing list posting for LibreOffice (after some IRC chat on #libreoffice-dev on Libera.Chat), and e-mailed to some people of Chrome OS' Paper I/O team. Only from the LibreOffice developers I got a reaction yet. They have taken my inquiry to their meeting and I have answered to their meeting minutes on the list. This answer shows especially the importance of getting CPDB into the apps dialogs instead of bolting the GTK dialog (also via distro patch as last mean) onto them. Most critical here is the spread sheet application of LibreOffice as this one puts many options about which part of the spread sheet to print, in which layout, ... This cannot get simply injected into a standard dialog. For LibreOffice there was already a GSoC project by Yash Srivastav back in 2017 in which CPDB-support got added to print dialog, this could be also used to facilitate the current project. The MIRs (Main Inclusion Requests, Libraries, CUPS backend, File backend) for Ubuntu are practically completed, only thing missing is the review of cpdb-libs by Canonical's security team. Unfortunately this did not happen in time and therefore CPDB did not make it into Main in 23.04, but will do in 23.10, to be released in October. In the course of the preparation for demos of the GUIs for the New Architecture on the LAS I will probably rebuild the GTK package of Ubuntu with CPDB support activated and put that into my PPA (Personal Package Archive) for the New Architecture, so that everyone can test."
+ },
+ {
+ "id": "post:OpenPrinting-News-April-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - April 2024",
+ "url": "/OpenPrinting-News-April-2024",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "Linux App Summit 2024",
+ "Google Summer of Code 2024",
+ "system-config-printer development revival",
+ "KDE Print Manager",
+ "CUPS 2.4.8",
+ "pycups 2.0.4"
+ ],
+ "tags": [],
+ "snippet": "Releases of Ubuntu 24.04, Fedora 40, MS-DOS 4.0, OpenPrinting Summit/PWG Meeting, LAS 2024, GSoC 2024, system-config-printer revival, KDE Print Manager, CUPS 2.4.8, pycups 2.0.4",
+ "content": "We had three releases of free software operating systems in the last weeks. Both Ubuntu and Fedora came with their 40th release! Ubuntu 24.04 LTS (Long Term Support) and Fedora 40. Unfortunately we did not have a Linux App Summit for a joint release party in that week. This year the Linux App Summit will only take place in October (so one could celebrate 20 years of Ubuntu there). Printing-wise there is not anything special to tell about in these two releases. In Ubuntu I have taken care that from all components the newest release is included and I have applied some bug fixes, and in Fedora probably the same thing got done. The next major change will probably only happen in Ubuntu 25.04 and Fedora 42 (to be released in one year from now), as then we have hopefully CUPS 3.x and the needed changes in the desktop environments and applications. The third one is MS-DOS 4.0. MS-DOS? This is not free software and was already released decades ago, you would think. No, now it is free software. Microsoft has put it under a MIT license and posted the source code on GitHub! Unfortunately, GIT does not do well with such old source code leading to some compatibility problems. So to be able to easily build it we have to see whether, when, and how Microsoft will fix that. Note that OpenPrinting does not plan to support DOS ... So let us see what happened at OpenPrinting in April ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions On May 6-8 we will have our annual meeting together with the PWG (Printer Working Group) again, the OpenPrinting Summit/PWG Meeting. As in the years before the event is totally online. We will present and discuss our work of the last 12 months and what we plan to do next. Especially CUPS 2.5.x/3.x, Printer/Scanner Applications, Common Print Dialog Backends (CPDB), Chrome OS, desktop integration, and the GSoC 2024 projects for the New Architecture are the main subjects of the meeting. We will again not have a presentation from Artifex about Ghostscript and MuPDF. Due to the vastly reduced staff there was no actual feature development on Ghostscript, only bug fixes. The freed up time we will make use of to talk about desktop integration, changes on printer setup tools, and CPDB support in print dialogs. We will also have a session about distribution methods, where we will cover Snap, especially snapping the CPDB backend for CUPS and CUPS 3.x, and OCI containerization of CUPS and the Printer Applications. From this year's GSoC contributors Akarshan Kapoor will give a short talk about scanner support in PAPPL and Rudra Pratap Singh about OCI containerization. See the schedules and how to participate on the event web page. Probably you were already wondering that I did not write about the Linux App Summit 2024 here. It is not skipped, it will take place, but this year only in October. This is because the organizers in Monterrey in Mexico, where the Summit will take place, did not find a date in April and so finally decided to settle on October 4-5. The fact that the LAS ended up in Mexico this year was also caused by me. On the GUADEC 2023 in Riga, Manuel Haro has given a keynote in which he mentioned community work he did and he also mentioned the possibility of running a LAS. As it was some days before the deadline of the Call for Locations for 2024, I stepped up to him right after his keynote and told him how to apply and about the nearing deadline and he showed interest. The next day on GUADEC Manuel met Jesús Soto from Canonical's Desktop Team, who lives in Mexico and studied in Monterrey, and talked with him about the idea. Jesús offered then to contact his university and so they applied for running the LAS in Monterrey, and this bid won. Here is the Call for Proposals. Last week, Google has announced the slot counts assigned to each of the mentoring organizations and the accepted projects. This time the Linux Foundation got generously served! 21 contributor slots for the 27 ranked proposals! For OpenPrinting this means that we got 11 slots for our 13 ranked proposals. We had never that many contributors! The accepted proposals for OpenPrinting are the following: Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh Mentors: Cristovão Cordeiro, Ira McDonald, Mohit Verma, Pratyush Ranjan, Saurav Dharwadkar, Till Kamppeter CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha Mentors: Michael Weghorn, Gaurav Guleria, Akshit Chauhan, Ira McDonald, Sahil Arora, Till Kamppeter Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu Mentors: George-Andrei Iosif, Dustin Ingram, Ira McDonald, Pratyush Ranjan, Shivam Mishra, Till Kamppeter PAPPL API Bridging for Scanner Applications Contributor: Akarshan Kapoor Mentors: Rishabh Maheshwari, Deepak Patankar, Dheeraj Yadav, Ira McDonald, Mohit Verma, Till Kamppeter CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma Mentors: Gaurav Guleria, Akshit Chauhan, Aveek Basu. Ira McDonald, Shivam Mishra, Till Kamppeter Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal Mentors: Mohit Verma, Zdenek Dohnal, Aveek Basu, Ira McDonald, Shivam Mishra, Till Kamppeter Make a native printer Application from Gutenprint Contributor: Ankit Pal Singh Mentors: Solomon Peachy, Aveek Basu, Dheeraj Yadav, Ira McDonald, Zdenek Dohnal, Till Kamppeter GNOME Control Center: Finalizing the New Printing Architecture for GNOME Contributor: Kaushik Vishwakarma Mentors: Mohit Verma, Ira McDonald, Pranshu Kharkwal, Shivam Mishra, Till Kamppeter User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma Mentors: Gaurav Guleria, Deepak Patankar, Ira McDonald, Saurav Dharwadkar, Shivam Mishra, Till Kamppeter Converting Braille embosser support into a Printer Application Contributor: Arun Patwa Mentors: Samuel Thibault, Chandresh Soni, Akshit Chauhan, Deepak Patankar, Ira McDonald, Till Kamppeter Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak Mentors: Deepak Patankar, Dheeraj Yadav, Akshit Chauhan, Ira McDonald, Rishabh Maheshwari, Till Kamppeter Of the 2 candidates who did not get selected, Sujal Bhor wants to do his project \"cups-filters: Create OCR filter to deliver scans as searchable PDFs\" voluntarily. He appeared very lately before the submission window and so he could not do many assignments for us to know him better and therefore I ranked him on a rather low position. I told him that when he is doing his project well, he should apply in 2025, so that it will happen to him what now happened to Biswadeep and Ankit, who did not get selected last year and after doing excellent work voluntarily I ranked them higher this year and they got accepted. By the way, the selection process works as follows: Each mentoring organization selects the proposals they actually want to mentor from the ones they received during the submission period and have to rank them. For the Linux Foundation as a whole we have ranked 27 and Google gave us 21 slots. So the first 21 got accepted, ranks 22-27 got rejected. As the Linux Foundation is an umbrella organization they are composed of several sub-organizations, OpenPrinting being one of them. So I as org admin asked each sub-group for ranking their projects and I by myself have ranked the OpenPrinting projects. After that I had to join the rankings in a round-robin, zipper style to not step on any sub-org's toes. Inside OpenPrinting I applied the following criteria for ranking and for assignment of project ideas to contributors: The project ideas most urgent and important to get done for OpenPrinting and the free software ecosystem are ranked the highest and assigned to the most promising candidates. The most promising candisates for us are those who we know best due to their work on assignments, like investigating and fixing bugs, but even better due to voluntary contributions to OpenPrinting or a GSoC project they did with us in a previous year (one person can be GSoC contributor 2 times at maximum). Contributors coming late to the party and therefore we not having time to give assignments and the candidate to work on them get lower-priority project ideas and so go lower in the ranking. Last year we had two contributor candidates, Biswadeep Purkayastha and Ankit Pal Singh, who did not get a slot (we got only 12 slots for 24 ranked proposals for the whole Linux Foundation, or 6 of 12 for OpenPrinting) and they worked voluntarily for OpenPrinting and applied this year again. As they did amazing work I gave them more important projects and higher ranks and therefore they got accepted this year. This counts much more for us than the proposals. Candidates just submitting a proposal without contacting us before will usually not get considered. What also helped us for getting a good cut of slots is probably that we gathered many mentors. So thanks a lot to everyone who stepped up as mentor for OpenPrinting. Originally, we already had discontinued the development of system-config-printer and put it into maintenance mode, only fixing bugs and collecting UI translations. But system-config-printer is still used a lot. There are practically only 3 printer setup tools around: The \"Printers\" module of GNOME Control Center, the printer manager of KDE Settings, and system-config-printer. There are many more desktop environments than just GNOME and KDE, and distributions using many of those use system-config-printer as their printer setup tool. Also both the GNOME \"Printers\" module and the KDE printer manager depend on system-config-printer. system-config-printer provides all its \"intelligence\" in a D-Bus service, named scp-dbus-service, which contains two algorithms which I have written long time ago, in the late 2000s when I started at Canonical and was responsible for the printing part of Ubuntu. This is once the algorithm to assign the best, most suitable driver to a printer given by make and model (or device ID) and second, the algorithm to find out whether two discovered printers are actually the same physical device. The algorithms wer separated into the D-Bus service to serve for other printer setup tools, too, and the ones of GNOME and KDE actually use it. This means that system-config-printer is also the gold standard for assigning the correct driver to a discovered printer ... For switching distributions into the New Architecture, meaning from CUPS 2.x to CUPS 3.x, the printer setup tool needs to get appropriately adapted, to list IPP print destinations with appropriate configuration options, especially access to their web admin interfaces, and assign Printer Applications to non-driverless printers. And one needs to be very careful with switching over Ubuntu. The original distro from Canonical is GNOME-based, but there are the flavors, community-maintained distros derived from Ubuntu but with all kinds of different desktops. And the base of all of them is the same, and the printing stack, especially also CUPS is part of the base. So simply taking care of GNOME and then switching over is failing miserably ... One could also think about dropping the concept of printer setup tools altogether as modern, driverless printers are simply there, but it is not very intuitive for a user to have to find a Printer Application and install it to make a non-driverless printer working and that for driverless printers and Printer Applications there are web admin interfaces and how to access them. So to assure continued coverage of all desktops we need to revive development of system-config-printer and make it supporting the New Architecture, as we did already with the \"Printers\" module of GNOME. Also to complete any effort for CUPS 3.x support on the GNOME and KDE tools we also need to update system-config-printer. So therefore we have revived the development, adding the support for CUPS 3.x in the GSoC project \"Desktop Integration: Update system-config-printer for the New Architecture of printing\" by Shivam Jaiswal. There are also some thoughts about further development towards CUPS 3.x in the README.md. I told in the previous section that there are practically only 3 printer setup tools, system-config-printer, the one from GNOME, and ... ... the KDE Print Manager in KDE Settings! The first 2 are well covered by our GSoC activities, only the KDE one is not. But here the KDE developer Mike Noe is taking care of. See his (and also my) comments on the following issue reports on the Print Manager: #1 Port away from deprecated CUPS API calls: This one is only about doing away with the use of deprecated CUPS APIs. But this is already an important first step, to be able to smoothly switch to libcups3 and to display and handle IPP print destinations for which CUPS creates temporary queues automatically. #2 Printer Manager - Where to go next?: This is about a general make up of the Print Manager. Inside there is a sub-thread started by Nate Graham making aware of the \"OpenPrinting CUPS 3.0 architecture\" with reference to Michael Sweet's notes in the CUPS GitHub repo and my talk on the GUADEC 2023 in Riga. Mike Noe and me, we answered, I with a longer detailed message telling about the details and referring to Mohit Verma's work on GNOME Control Center. #11 Post Plasma6 rollout and CUPS 3.0 Direction: Mike Noe's issue report about working towards CUPS 3.0 on the Print Manager, referring to the sub-thread in issue #2 and Zdenek Dohnal's first thoughts on CUPS 3.0 support in system-config-printer. Also see the following merge request: #121 kcm: Provide the driverless config option when driver discovery fails: Here Mike Noe has added a functionality for setting up printers as driverless IPP printers. So KDE developers are aware and especially Mike Noe is on it. I also had a longer e-mail exchange with Mike Noe explainiung him all the details and answering his questions. I also plan to give a talk on the aKademy 2024 in Würzburg, Germany. Half a year's worth of bug fixes, especially such important things like a race condition when querying an IPP print destination for which CUPS creates a temporary queue (Issue #871), raised cups_enum_dests() timeout for listing available IPP print destinations (Issue #751, to make lpstat -l -e working correctly also when there are many IPP destinations in the network), and many many other bug fixes ... Get it here and see all the changes in detail. And the CUPS Snap is also already the current version, 2.4.8, thanks to Snap release automation! The Python bindings for CUPS also received an update. This time it is all about compatibility with newer Python versions, 3.10 and newer. Pycups 2.03 pycups 2.0.3 contains changes from 2.0.2 - mainly changes related to newer Python3 versions: removed shebang from example/cupstree.py ignore driverless utilities for postscriptdriver tags creation (Fedora bug #1873385) remove epydoc from Makefile (#27) fix invalid delete of pointer (#11) Makefile uses wrong Python (#32) define PY_SSIZE_T_CLEAN in cupsipp.h - fixes traceback during IPPRequest.writeIO with Python 3.10 fix the test.py when there is no printer installed (#46) Use PyObject_Call() instead of deprecated PyEval_CallObject() Version 2.0.3 was created to attempt to fix pycups installation via pip, but it was unsuccessful. Enjoy! Pycups 2.04 The hotfix release removes install_requires from setup.py, which is used for generating OS requirements. Enjoy!"
+ },
+ {
+ "id": "post:OpenPrinting-News-August-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - August 2020",
+ "url": "/OpenPrinting-News-August-2020",
+ "headings": [
+ "20 Years of working on printing with free software!",
+ "OpenPrinting Microconference on Linux Plumbers Conference 2020",
+ "Google Summer of Code 2020",
+ "Google Season of Docs 2020",
+ "Linux Foundation Mentorship Program",
+ "CUPS Snap",
+ "Printer Applications",
+ "Driverless Scanning and IPP-over-USB",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "20 years working on printing, Linux Plumbers, GSoC, LFMP, cups-filters 2.0.0 approaching",
+ "content": "This month I have my 20th work anniversary of working with printing under Linux and free software. In August 2000 I have started at MandrakeSoft in Paris (later Mandriva) to switch the first Linux distribution from LPD/LPRng to CUPS. See how all began. Update: Recording on YouTube As already back in 2019 we are holding a Microconference on the Linux Plumbers 2020, this year in ... ... the wider Internet!! Yes, due to COVID-19 it is all virtual this time, no travelling, no 12 hours with a mask in an airplane full of people. But also no nice sights and delicious restaurants, not tourist-guiding my co-workers with the help of my knowledge of the Portuguese language through a nice city. But it has also one big advantage: It is much easier to get the desired speakers, as one does not need to get their travel funded. So we will have Michael Sweet, Ira McDonald, Aveek Basu, Alexander Pevzner, and Rithvik Patibandla on our virtual stage, and me naturally, too. We will talk about the following subjects: Printer Applications - A new way to print in Linux IPP scan (or virtual MF device) server (Scanner Application) 3D Printing IPP Fax Out - A new reality Designing and Packaging Printer and Scanner Drivers The conference takes place from Monday, August 24 to Friday, August 28, every day from 2pm - 6pm UTC. Our day will be the Friday, August 28, with our microconference to span all the 4 hours. Everyone is invited to visit us. If you are actually attending the Linux Plumbers Conference, please visit the OpenPrinting MC on Friday and participate in the discussion of the future of printing and scanning. If you are not registered, please listen in via YouTube Live Stream for free. The links to the YouTube streams will appear on this page shortly before the sessions start. Unfortunately, one of our students, Aakash Lahoti, had to leave the GSoC early due to family reasons. In the first month he started adding scanner support to PAPPL. His work you can see here (last two commits). As a replacement, we have opened another LFMP project and got accepted with it. This allows us to put two students, each one for 3 months onto this project, and fortunately, we got promising applications. The other 14 students all passed the second evaluation, 6 of them working for OpenPrinting. Here are some status messages of our students (all from August 11, 2020): Jai Luthra Tasks completed: Discovering network devices.(Issue #17, Issue#18) A standard Main Loop for Printer Applications.(Issue#19) Porting the CUPS rastertohp and its corresponding PPD files to a Printer Application.(Issue #16) The work done so far can be found in PAPPL (https://github.com/michaelrsweet/pappl) and the HP Printer Application (http://github.com/michaelrsweet/hp-printer-app). The HP printer application is a native printer application and an example of how to use PAPPL to create printer applications. In Progress: Device Auto-Setup. The Pull Request is open in PAPPL and I am working on it. Next: As per time permits, I along with other GSoC 2020 students am going to help to move the functionality of filters to libcupsfilters. Special thanks to Jai for his work on the PCL sample Printer Application which gave me a lot of insight in the way how Printer Applications are created and how they work. This made me designing the new concept of filter functions in cups-filters (see more below). Mohit Mohan I have completed the following parts for the project: Testing cups-browsed with many printers (https://github.com/mohitmo/Testing) Design document for implementing multi-threading in cups-browsed. (https://github.com/mohitmo/design-document-cups-browsed/blob/master/doc.md) Parallelised printer discovery in cups-browsed. (https://github.com/mohitmo/cups-filters/tree/thread_new) Currently I am working on parallelising queue creation in cups-browsed, but I cannot commit the changes as of now. Vikrant Malik The main goal of my project was to build a filter which could extract raster data from raster-only pdf files and PCLm files, so that we don’t have to pass them through poppler or other APIs to rasterise them. My project is near its completion. The pclmtoraster filter has been tested and added to the cups-filters project and is ready to use. The newly added pclmtoraster filter can extract raster data from the following categories of files: All PCLm files PDF files with 1 bitmap per page (Colorspace supported: DeviceRGB, DeviceCMYK, DeviceGray, with 8 bits-per-component) I am currently working to convert the pclmtoraster filter into a filter function and test it. Git Repo Link: https://github.com/V1krant/cups-filters. Priydarshi Singh All the major features of the project have been completed. The project can take user's options and print according to those options. There are some minor things left, like dealing with unused options, fixing some bugs, adding documentation to the code, and making it strictly follow the Qt Coding style. The code is available in the \"cpdb\" branch of my fork of qtbase (https://github.com/dryairship/qtbase/tree/cpdb). Lakshay Bandlish I have completed the browsing part and most of the GUI. So currently, using the program, one can see all the running IPP System Services and their network details, updated in real-time in the GUI. I have written the code for IPP request handling in a separate file, I am yet to integrate it with the GUI. Apart from that, I still need to add options to edit the printer settings in this code. Currently my code resides in this branch of my repo: https://github.com/lbandlish/Administrate-MF-Devices-GUI/tree/dns-sd_browse The readme has the exact instructions to run the current functionality of the program. Sambhav Dusad I have worked on several different issues and enhancements during GSoC. Here is a list of all the issues/enhancements completed: Adding Print-Test Page functionality Log Rotation support and setting log-level Creation/Deletion of printer from web-interface Pager Support and Cancel job(s) buttons to web-interface I have submitted the PR for adding support for job-save in PAPPL. Also, I have contributed directly to the PAPPL project. So, there's no specific repo for GSoC. I am currently having a discussion with Michael and Till for the next contributions. Sambhav started now to work on a Gutenprint Printer Application for the rest of the GSoC. Thanks to all the students for their status reports! On August 16 Google will announce the technical writers who will participate in the program. Only then we will get to know which of the projects we nominated will get selected by Google. We have selected the two students for our first LFMP project: Wrapping proprietary printer drivers into a Printer Application Student: Dipanshu Verma Support for IPP Fax Out Student: Nidhi Jain Currently, I am mentoring both. Depending of the further needs other mentors could jump in. They have both started at the beginning of August and will work until end of October. As a replacement for our incomplete GSoC project for IPP Scan we got accepted in the next round (September - November) of LFMP for a 2-student project on IPP Scan letting one student to extend PAPPL for Scanner Applications (IPP Scan as a server) and the other student expand the driverless scanning SANE backend sane-airscan to also support IPP Scan in addition to the already supported eSCL and WSD (IPP Scan as a client). Principal mentors will be Michael Sweet and Alexander Pevzner, the same mentors as of the former GSoC project. This project is currently open for student applications and the work period will be September 1 to November 31. Several students have applied already and we are currently introducing them into the project and asking them to learn about IPP Scan and SANE. The CUPS Snap project is currently waiting for the snapd project to add the needed interfaces and API extensions. To control the access to the snapped CUPS we want to have two interfaces which application Snaps should plug to: \"cups\" should allow the plugging application to print, list jobs, remove the user's own jobs, ... this is the interface for users, it should auto-connect by default. The second is \"cups-control\" which also allows administrative CUPS tasks to the application which plugs it, like creating and removing print queues, or remove someone else's jobs. This interface will not auto-connect without special permission of the Snap Store. A Pull Request for the implementation of these interfaces in snapd is posted and worked on. The snapped CUPS needs a way to find out whether a snapped client is plugging one of these interfaces and for being able to do so without getting full access to snapd a new API functionality will get added to snapd. Thanks to snapd developers Jamie Strandboge and James Henstridge for the great collaboration on the integration of the CUPS Snap. With the start of the PCL sample Printer Application as a first working model of a printer driver as Printer Application I have made my first thoughts on how to retro-fit classic printer drivers into Printer Applications. This made me starting some discussion on the printing-architecture mailing list at OpenPrinting: Printer Applications: Retro-fitting classic printer drivers - libppd Printer Applications: Retro-fitting classic drivers PostScript printers without PPD files? Canceling jobs in Printer Applications Filter Functions - Getting years of development in cups-filters into Printer Applications Printer Application for PostScript printers Here I have found the answers to many of my questions, introduced libppd and also the filter functions concept, gave guidelines to program filter functions, got told that PostScript is deprecated/obsolete and will not be used without PPDs ... Note that for participating in these discussions you have to subscribe to the printing-architecture mailing list. ipp-usb and sane-airscan are making it into Debian and Ubuntu. They are both already in Ubuntu Universe and a planned to be promoted into Ubuntu Main for Ubuntu 20.10, so that driverless printing and scanning both via network connection and USB work reliably right out of the box for everyone. A Main Inclusion Request to promote ipp-usb into Ubuntu Main is already posted, sane-airscan will follow soon (Update: Main Inclusion Request for sane-airscan). ipp-usb should replace ippusbxd as standard IPP-over-USB implementation in Ubuntu 20.10. In Debian, both ipp-usb and sane-airscan are already in Unstable. Update: sane-airscan made it into the updates-testing repository for Fedora 32 now. Thanks to Alexander Pevzner for the hint. Currently released is 2.3.3. No further releases or GIT commits, also now 87 open issues and 23 open Pull requests. Only few answers from upstream developers. A person from Apple told me that CUPS development should recover in a few weeks, but in the weeks after that nothing happens. I am still thinking about as a last mean to temporarily fork CUPS so that distribution maintainers can collaborate on fixing bugs there. Currently released is 1.27.5. No new release as I am currently working towards the second generation of cups-filters, 2.0.0. Main goal of cups-filters 2.0.0 is better support for Printer (and Scanner) Applications. cups-filters 2.0.0 should contain the following features: All filters converted to filter functions in libcupsfilters, see below All filters (if not specific to PPD use) should work without PPD and job and printer IPP attributes instead Filters should safely run in parallel without conflicting, no global variables, no (or locked) writing to common data structures Filter function to chain filters Wrappers for the filters to allow their use from CUPS IPP handling functions, mainly to be used for filter functions libppd for retro-fitting classic drivers and manufacturer-supplied PPDs for PostScript printers into Printer Applications pclmtoraster filter function to convert PDF files from scanners into PWG/CUPS/Apple Raster without loss of image quality cups-browsed with multi-threading to better scale with larger amounts of printers in the network Options for the ./configure script for partial builds: No cups-browsed, no libppd/PPD support, no libqpdf, raster-only printing/scanning, ... to allow Snaps build only the part of cups-filters which they actually need Filter Functions One of the main new features in cups-filters are the filter functions. Here we move the former CUPS filters into library functions in libcupsfilters and also make them all work without PPDs and with IPP attributes for job and printer instead. This way Printer Applications can call the filters directly, without call of external executables. So a lot of overhead, as the call of the executable, and the flattening of complex data structures, as IPP attributes into command line option strings and parsing them by the filter, is eliminated. With the filter functions we also conserve the many years of work which we have put into the CUPS filters, to live on in the Printer Applications. Each filter function is called with the same scheme: Input and output file descriptor, is input file descriptor seekable?, common data records for all filters in the chain (job IPP atttributes and printer IPP attributes OR option list and PPD file (retro-fit), logging function), call parameter record for individual filter. This allows easy chaining of filters, defining the filter chain as an array of records of filter and filter call parameters, and all filters in the chain getting the same job and printer data. This is a generalization of the CUPS filter scheme which gets print data through stdin, puts resulting data to stdout, and all filters are called with the same arguments and environment variables by CUPS, so they all get the same job and printer data. The filter function scheme especially extends to IPP data structure support and caller-supplied logging function. I have already converted the pstops and pdftops filters into filter functions, for use in a Printer Application to support PostScript printers with the manufacturer's PPD files. GSoC student Jai Luthra is starting to convert filters now, too, beginning with the rastertops filter and GSoC student Vikrant Malik will convert his own pclmtoraster filter. For any volunteer wanting to help converting filters, I have put up some guidelines for filter function programming. General discussion about filter functions happens in this mailing list thread. Bug fixes Again many bug fixes in cups-browsed, the driverless utility, and the filters have been performed, often with the help of our GSoC/LFMP students or candidates doing assignments. Thanks to all of them. I will later do a fork to create a last 1.x.y release for Ubuntu 20.10. With ipp-usb making it into the major Linux distributions, ippusbxd will get more and more deprecated, probably only the Chrome OS team will hang on it. Hints on how to solve the problems of ippusbxd are discussed in Issue #15. Update: The Chrome OS developers also have written a replacement for ippusbxd, ippusb_bridge, in Rust, implementing only a subset of ipp-usb but enough for the needs of Chrome OS. This means that we can deprecate ippusbxd for now. This will not mean that we remove ippusbxd's repository, you can play with the code and contribute fixes, but we will not put effort in it like GSoC projects for example. Thanks to Alexander Pevzner for the hint. ipp-usb is more and more recognized as the better, more reliable implementation of IPP-over-USB. Thanks to Alexander Pevzner for this great tool. During the last month only a few bug fixes got committed."
+ },
+ {
+ "id": "post:OpenPrinting-News-August-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - August 2021",
+ "url": "/OpenPrinting-News-August-2021",
+ "headings": [
+ "The Ubuntu Desktop Indabas and OpenPrinting",
+ "OpenPrinting Micro-Conference on the Linux Plumbers 2021",
+ "Google Summer of Code 2021",
+ "Retro-fitting of CUPS printer drivers into Printer Applications",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/LRPdTI1-OiY/hqdefault.jpg",
+ "snippet": "Ubuntu Indaba, Linux Plumbers, GSoC progress, Retro-fitting CUPS drivers with easy option setting and backends, CUPS, cups-filters",
+ "content": "From the announcement: Heather Ellsworth: What is the Ubuntu Desktop Team Indaba? Indaba is a South African term for “a conference or consultation between people”. This will be a live stream event, featuring members of the Ubuntu Desktop Team and members of the community. To get a feel for what to expect, you can review the last Indaba event on YouTube from July 30, 2021. To keep up a consistent cadence of these Indabas, we’ve decided to have them the last Friday of the month, every month. (The actual time of day may change a bit as we work out scheduling kinks that may arise) In this month's edition, on Friday, August 27, 5PM UTC (2 weeks from now) it is all about printing and what's new in this area. Therefore the special guests will be me and Michael Sweet (author of CUPS, PAPPL, did important part of IPP and driverless printing) and we will present the newest state-of-the-art and we will be open for the questions of the Ubuntu users. The event will be streamed live on YouTube and Twitch, both with live chat (links on the announcement page). Thanks a lot to the creator and main organizer of the Ubuntu Indabas, Heather Ellsworth, and also to the others from the team, Monica Ayhens-Madon and Rhys Davies. See you there! We got accepted for our third Openprinting Micro-Conference on the Linux Plumbers Conference 2021 taking place from Monday September 20 to Friday September 24, 2021, at the same place as last year: On the wider Internet! With the COVID-19 situation improving some conferences are slowly coming back to be in-person but with still many travel restrictions we will have an online conference again. But it has also an advantage, as we can freely choose the speakers without having to worry about travel expenses. Also it is easier for anyone to listen in on the live stream. The date of OPenPrinting's turn is not yet determined, please keep an eye on the web site of Linux Plumbers. Our 5 students have continued their work and made further progress. All the filters of cups-filters (if not treated appropriately earlier) go through 3 student projects: First getting turned into a filter function by Pratyush, after that made working without PPD file but based on IPP attributes instead by Suraj, and finally landing in the universal CUPS filter/filter function by Pranshu. This will get completed in the last few weeks to go. Perfect team work! Also Bhavna and Divyasheel made good progress. On this month's OpenPrinting conference call all students participated again giving a short screen-share-based presentation of their GSoC projects. There will be also a presentation of the GSoC projects on the PWG August 2021 Face-to-Face Meeting which takes place online on August 17-19, 2021. The GSoC presentation will be on August 18, 10AM to 10:30AM EDT (UTC−04:00), with video demos of the students. Here is some short summary about what got done: cups-filters: Make sure all filter functions work without PPD files Student: Suraj Kulriya Mentors: Jai Luthra, Till Kamppeter, Dheeraj Yadav Suraj made the following filter functions working also without PPD file, based on printer and job IPP attributes: pdftopdf() pclmtoraster() He again created some library functions for common functionality, this time ippRasterMatchIPPSize() and getBackSideAndHeaderDuplex() uploaded together with the changes on pclmtoraster(). cups-filters: Convert filters to filter functions Student: Pratyush Ranjan Mentors: Till Kamppeter, Dheeraj Yadav Pratyush converted the following CUPS filter to a filter function: texttopdf() bannertopdf() is currently in the works. cups-filters: Create a single, universal CUPS filter to replace the chain of individual filters Student: Pranshu Kharkwal Mentors: Till Kamppeter, Dheeraj Yadav Pranshu is not only creating a nice universal CUPS filter, but by this he is also testing all the filter functions and so we discovered some oversights where new filter functions were still using stdin or stdout at some places instead of the new input and output file descriptors, making the universal filter hang or somehow else mis-behave (like outputting a zero-page job). He is up to texttopdf() with the support now. Most important still missing part is testing it with CUPS and creating the needed MIME conversion rule file. See his work on this GitHub branch. GUI for listing and managing available IPP Print/Scan services (or DNS-SD-advertised network services in general) Student: Divyasheel Mentors: Till Kamppeter Divyasheel is currently taking care of the correct device types getting listed, services from the same physical device grouped and duplicates skipped. He also takes care of the correct user action buttons be displayed for each service. Here is the GitHub branch with the code. PAPPL: Printer setup tool support and Scanning support Student: Bhavna Kosta Mentors: Jai Luthra, Till Kamppeter, Michael Sweet Principally mentored by Michael Sweet Bhavna is making good progress with the addition of scanning support to PAPPL. She has submitted a total of 4 pull requests. The new one of this month is \"Add scanner-webif.c\", adding web interface pages for scanners. Currently I am continuing with the work towards retro-fitting classic CUPS printer drivers into Printer Applications. I have continued to post sneak previews of the most important mile stones at the usual place. Here I have especially done the following: Easy printing on every printer using standard IPP options Now the 3 IPP attributes print-color-mode, print-quality, and print-content-optimize (or equivalent options under \"Printing defaults\" in the web interface) will actually work, for nearly every existing PPD file (please tell if they do not work with yours). This allows easy control of every printer with the same operation scheme, no searching for the right options for 99% of the printing tasks, including high quality photo printing, quick and toner-saving draft prints, ..., and printing from restricted client interfaces, like phones (iOS directly, Android with Mopria app). The correct PPD options for the jobs are automatically selected internally. So simply make use of your (old) printer's capabilities with only 3 options/attributes! For special needs not covered one only needs to switch the printer-specific options away from \"automatic-selection\" to manually fine-tune. Do not forget to get back to \"automatic-selection\" when done with the special job. Tested with following PPD files: HPLIP (\"hpcups\" driver), Gutenprint, Foomatic (\"bjc250gs\" and \"hl7x0\" drivers), PostScript PPDs from Ricoh, Toshiba, HP. The most tricky part of this is to automatically find the options and choices in the PPD file which needs to get set for switching between color and grayscale printing, draft, normal, and high print quality, and for optimizing the output for photo, graphics, text, and text-and-graphics jobs, and that for ~10000 PPDs, where everyone has his own ideas about which parameters to make user-settable and how to call the options and choices for them. This is implemented in libppd in cups-filters (probably the only new PPD file support feature which did not exist in CUPS). In the file ppd/ppd-cache.c a data structure for advanced properties of the PPD file is created (by the ppdCacheCreateWithPPD() function. One of the items in the structure are the so-called presets. To each of the 6 combination of settings for print-color-mode (color/grayscale) and print-quality (draft/normal/high) a set of PPD option settings (as key/value pairs) is assigned to allow quick and easy printing with standard IPP attributes. Problem is that to make use of this functionality one has to define the presets in the PPD (via APPrinterPreset PPD attribute) but no one who creates PPDs did this actually and no one wants to create a database of presets for ~10000 PPDs manually. So to finally (with PPDs already deprecated for years and now active work happening to get rid of them) put live into this great idea, I have added an algorithm to automatically generate the presets, in the new function ppdCacheAssignPresets() in the same file. This function gives scores to all PPD options on how much they influence grayscale/color printing and print quality by the names of the options and choices, and by embedded PostScript code affecting resolution, color space, and color depth. This way the relevance of each option for the presets is determined and which choice to set in each of the 6 presets. And in addition to print-color-mode and print-quality combos I also evaluate options for their influence on print-content-optimize (auto/photo/graphics/text/text-and-graphics) in the same function to create a preset for this. For auto the retro-fit library switches to photo on image file input and for PDF input it determines from which app the PDF is coming and chooses of the 4 content types appropriately. The resolution support implicitly also selects up to 3 preferred resolutions (3 print qualities) and so the problem of PAPPL only supporting 4 resolutions for a printer is overcome. In the Printer Application we simply select the resolutions which are set by the presets. We also make use of the fact that PAPPL does not set the default resolution but selects the lowest/middle/highest resolution from the list for draft/normal/high print quality (Note here that for PAPPL selecting the correct \"normal\" resolution we have to list one resolution twice in some cases. This is not a bug). The code is here: Initial commit Add Ricoh's \"RIPrintMode\" Improved for HPLIP and Gutenprint Resolution support Filter function chains for format conversions This change in the retro-fit library allows to use a chain of any number of filter functions, both in the conversions for spooling printing mode and also in the formats for streaming printing mode. This way we especially add the pdftopdf() filter function (former pdftopdf CUPS filter) when PDF is the input format in spooling mode so that the pages get rotated into the destination page format of the printer, the print-scaling attribute correctly applied, ... and in the streaming mode for printers with pure PDF PPD files the PJL commands of the PPD get correctly applied to the PDF output by the pdftopdf() filter function. Streaming mode for filter functions In streaming printing mode (input is PWG/Apple Raster or an image) we instruct the filters to stream the job data and not load the whole jobs into a temporary file or into memory only to check which format it is and whether it perhaps does not contain any page for printing. For that we supply the boolean option filter-streaming-mode to the filters/filter functions in the filter chain. In cups-filters now pdftopdf(), ghostscript(), and foomatic-rip support this streaming mode. pdftopdf() drops the whole processing by QPDF (adjustment of page size and orientation, number-up, page-ranges, ...) and only applies JCL/PJL commands from the PPD and the other two assume the input being PostScript (the other alternative, PDF is not streamable anyway) and do not check whether the input is a zero-page job. Support for CUPS backends Now we are adding the last major feature for the CUPS driver retro-fitting framework: Support for CUPS backends Several classic CUPS drivers do not only consist of PPDs and filters but also bring a CUPS backend, or several of them. HPLIP provides one to talk with USB printers in IEEE-1284 packet mode, protocol 3, 7/1/3. By the way, protocol 1 is uni-directional stream, protocol 2 bi-directional stream (both supported by PAPPL's own USB scheme and the usb CUPS backend) and protocol 4 is IPP-over-USB (needs the ipp-usb extra daemon to work as a network IPP printer). Another one coming with HPLIP supports faxing on many HP printers. Gutenprint has one for the totally proprietary USB protocol of many dye-sub printers. To be able to correctly retro-fit this into a Printer Application I have now added a custom PAPPL scheme, named \"cups\" to which a backend directory and include/exclude lists for backends in that directory can get assigned. This scheme integrates the backends in the Printer Application listing all devices which the backends discover (when all run in turn without arguments, like lpinfo -v in CUPS) and allowing to add printers using them. This is not complete yet. It is an interim snapshot. For now it only lists the devices (so you see them in the \"Device:\" list of the \"Add Printer\" web interface page, but when adding a printer using such a device, it will not print, as the communication for job execution is not implemented yet. You only can see that the devices got correctly discovered from withing the Printer Application. If you actually want to print you have to select one of PAPPL's own devices. I have also implemented the back channel and side channel concepts of CUPS' filters and backends, so that classic drivers which use them, will correctly work, and also some functionality of PAPPL's device concept will work better then. Some of the implementation is in cups-filters (especially in the filterExternalCUPS() filter function which I also have added CUPS backend support to). The implementation for actual job processing will come soon. CUPS Snap in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, more than 2200 installations via Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but unfortunately, they are very busy currently. Unfortunately, no news on this. Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces (see above) Testing Turn classic CUPS drivers into Printer Applications (see progress below) Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap PostScript Printer Application in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, more than 1300 installations via Snap Store I did not add anything new to the PostScript Printer Application as I continued my work on the printer driver retro-fit library (see below). The PostScript Printer Application will soon get switched over to be based on the library and this way receive new features, especially easier handling of color mode, print quality, and content optimization by the user. With appropriate features added to PAPPL we will be able to also add the following: Support for string/text-style vendor options. Needs support in PAPPL (Patch already applied in the Snap). Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. Currently released is 2.3.3op2. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 18 months. Ubuntu Impish Indri (21.10, Feature Freeze next week) will also come with CUPS 2.3.3op2, the CUPS Snap and the PostScript Printer Application Snap use the current GIT master. Changes mainly happened in the build system and on the support for different system platforms. Also new logos were added. There is no new entry in CHANGES.md. Currently released is 1.28.9. Feature additions are principally done for retro-fitting classic CUPS drivers, see details in the separate section, but also work of our GSoC students: Added auto-generation of presets for PPD files, to easily control the printing via print-color-mode, print-quality, and print-content-optimize, with any of more than 10000 PPD files. Added support for CUPS backends in both discovery (no arguments lpinfo -v) and job processing mode, especially in the filterExternalCUPS() filter function. Added support for the back channel and side channel which CUPS uses for communication between filters and the backend. ghostscript(): Added raster-only PDF and PCLm output support (for this also reported a Ghostscript bug that the new \"pclm\" and \"pdfimageXX\" output devices need seekable output files and the Ghostscript developers fixed it within a few days!) foomatic-rip, ghostscript(), pdftopdf(): Added streaming mode for filters, to be activated by the filter-streaming-mode boolean option. pwgtoraster(): Added support for borderless printing with overspray, stretching the input image by some pixels to file the overspray size. libppd: In ppdCacheGetPageSize() also checked page size variants (like A4 and A4.Borderless) taking the paper dimensions of the base size and only the margins of the variants, to overcome different paper dimensions in the variants (for example for borderless with oversparay). Improved the sample PPD files for PDF printers: Added borderless page size definitions, removed redundant *cupsFilter2 lines, fixed bugs (all discovered on testing under the retro-fitting Printer Application). Nearly all filters are filter functions now and can be used both with PPD files and with printer and job IPP attributes. Also some bug fixes were done: pwgtoraster(): Do not apply back side orientation for duplex printing, it is the responsibility of other filter functions. Several minor clean-ups and fixes 1.28.9 Bug fix release, fixes backported from the master (2.x) branch (see below) Ubuntu Impish Indri (21.10, Feature Freeze next week) will come with cups-filters 1.28.10 (to be released soon). The CUPS Snap currently uses 1.28.9. The PostScript Printer Application Snap uses the current GIT master of cups-filters. Currently released is 1.0.3. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-August-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - August 2022",
+ "url": "/OpenPrinting-News-August-2022",
+ "headings": [
+ "Using Windows? We can help you, too.",
+ "New web pages about our work are completed",
+ "OpenPrinting Micro-Conference on the Linux Plumbers 2022",
+ "Open Source Summit Europe 2022",
+ "Ubuntu Summit 2022",
+ "GUADEC 2022",
+ "Google Summer of Code 2022",
+ "Common Print Dialog Backends 2.0",
+ "CUPS Snap and snapd printing interface",
+ "Approaching cups-filters 2.0",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/CBPefa0Ckq8/hqdefault.jpg",
+ "snippet": "Printer Applications under Windows, Pages about our work, Linux Plumbers, Ubuntu Summit, GUADEC, GSoC, CPDB 2.x, \"cups\" snapd interface, cups-filters 2.x",
+ "content": "In March 2019, right before the pandemic broke out, on a Canonical-internal conference, I entered the team room of my team, the Desktop Team, and my colleague Heather Ellsworth introduced me to another person, saying: This is Till, he makes printing just work, on everything except Windows. Now, two and a half years later, we must correct: This is Till, he makes printing just work, on everything except Mac. Once, Michael Sweet has left Apple end of 2019, and second, one can run Printer Applications under Windows! Microsoft and Canonical are collaborating and the Desktop Team has a nice WSL (Windows Subsystem for Linux) sub-team now. With this I came up with the idea to run Printer Applications under WSL and this way make legacy printers which are abandoned by Microsoft and also their manufacturers work under Windows again. My colleague Carlos Nihelton, of the WSL sub-team, has worked out a first approach with my guidance. He made his HP OfficeJet J4660 working under Windows again as his work requires him to use this OS quite often. About this he has written a HOWTO and contributed it to OpenPrinting. The HOWTO explains step-by-step how to compile and install a Printer Application under Windows to make ones good old printer working again. Thanks a lot, Carlos. The process is still somewhat awkward, but with further development of WSL (support for systemd, AppArmor, Avahi, snapd) it will get easier with the time and we will keep updating our HOWTO. Last month I told about that we want to have a blog post about OpenPrinting at Canonical to make OpenPrinting and Canonical's support for it more visible and that therefore I have decided to write some articles about what OpenPrinting has done and is doing. These articles I have completed now (All linked from the \"About Us\" page): How did this all begin? Our principal achievements What we are currently doing The first is derived from my blog article about how I got started with OpenPrinting, the second one is about what we have achieved in all the time, and the third is about what we are currently doing. I have not only added the page about our current activities but also added some forgotten items to the achievements page. The pages will get updated from time to time in the future, when items get completed and new items started. Linux Plumbers 2022 is approaching! It will take place in Dublin, Ireland on September 12-14, 2022. Our micro-conference will make the happy-end of the conference, being on Wednesday, September 14, 2022, 3pm - 6:30pm Dublin time or 2pm - 5:30pm UTC Full schedules of LPC 2022 I will be live on stage in Dublin, also Piotr Pawliczek from Google, and Monica Ayhens-Madon will also be there and help me with remote attendee's questions. All the other speakers will participate remotely. Also several of our GSoC contributors will participate remotely. We will have the following sessions: CUPS 2.5 and 3.0 Development Presenter: Michael Sweet 3D Printing Presenter: Michael Sweet Testing and CI for OpenPrinting projects Presenter: Till Kamppeter, Michael Sweet Restricting access to IPP printers with OAuth2 framework Presenter: Piotr Pawliczek Documentation for OpenPrinting projects Presenter: Till Kamppeter, Aveek Basu Sandboxing/Containerizing alternatives to Snap for Printer Applications Presenter: Till Kamppeter Up-to-date schedules on LPC web site Note that these sessions are not just slide presentations, there are some slides to introduce into the subject matter, but as the Linux Plumbers micro-conferences are intended for, we will discuss the about issues, decisions, design, ... to put our future work into the right direction, and for answering questions of the attendees. The exact schedule is posted on the Linux Plumbers web site. Registered remote attendees can participate interactively in the live discussions. Probably there will also be the possibility for non-interactive watching of the micro-conference on YouTube and a recording on YouTube after the micro-conference, as last year. Once in Dublin for the Linux Plumbers (see above) I will also be lurking around on this year's Open Source Summit Europe of the Linux Foundation, which also takes place in Dublin, on Sep 13-16. During this year, Canonical has formed a new Community Team and wants to interact more with the Ubuntu community. Therefore they revived the former Ubuntu Developer Summits (UDS) which were discontinued 10 years ago. Now they come with a new concept, covering the wider community, not only developers, but also designers, documentation writers, ... It is now an annual (not coupled any more with the Ubuntu releases) meeting between Canonical employees and the free software community. It is named Ubuntu Summit and the first edition takes place in Prague, Czech Republic, November 7-9. See the web site for subscribing to a newsletter, registration, call for proposals, ... Currently the site is preliminary, but in the next days more information and features will appear ... See also a first public announcement on the LAS 2022 back in April this year. Canonical comes with a good anount of their employees and is inviting a lot of important contributors from the free software community. We will have talks, workshops, BOFs, tutorials, ... about Ubuntu, the desktop, Snap, robotics, ... and naturally also several sessions with the OpenPrinting team, most probably at least me, Aveek Basu, and Zdenek Dohnal. Get in touch with the Ubuntu developers in Prague!! I have attended my first GUADEC, in Guadalajara in Mexico and it was a success, and also a lot of fun. In my talk I have first introduced the GNOME Community into the New Architecture of printing and scanning and then spread the news about our GSoC work on the \"Printers\" module of the GNOME Control Center and on the GTK print dialog (slides, video). Bye Bye, colord! My talk was a success!! It generated a hallway session! Right after my talk Sebastian Wick chatted with me about the demise of colord. He said that colord is about to be abolished. This daemon is a manager for color profiles, *.icc files which convert color spaces, especially correct the color appearance of output devices like monitors or printers. Wayland handles the color profiles for monitors by itself, and in the New Architecture for printing CUPS only deals with driverless IPP printers and those use only sGray, sRGB, and AdobeRGB color spaces, all are known color spaces and so no profiles are required. And so only printers which need a driver can need color profiles and as a driver is a Printer Application in the New Architecture, the profile is hidden in the Printer Application. Only point to solve is the soft proofing. This means that you apply the output device's color profile to an image to check with a program on the client whether the output device is able to correctly reproduce the image. The program looks for blown out highlights (structureless white areas) and warns the user. For this we would need a way to poll the output device's profile still ... Driverless printing with Slackware On the second BoF day I had a spontaneous micro-BoF with only Logan Rathbone who is running Slackware on his tablet (which was originally running Windows) and was not able to do driverless printing. So we tried to fix this. Slackware is, similar to Gentoo but not that extremely, a CIY distro (Compile it yourself). On his machine there was CUPS and cups-filters installed and the versions were not that old, but there was no avahi-daemon which is needed to discover driverless IPP printers in the network as they advertise themselves via DNS-SD (aka BonJour, mDNS, ZeroConf). There was no Avahi at all, not even the libraries, and therefore the CUPS and cups-filters packages got compiled without Avahi support as Slackware's compile scripts do not have hard build dependencies on Avahi. So we needed to compile the two, and also update CUPS to the newest version to catch a bug fix and then all worked. He saw the Printer Applications on my laptop then. He learned a lot about driverless printing, CUPS, cups-browsed, its config files, and I about Slackware. On one end Slackware and Gentoo, somewhere in the middle Ubuntu, on the other end an all-Snap Ubuntu (if we get such a thing) ... Now the second month of the coding period of the Google Summer of Code 2022 has passed and our contributors are continuing their great work! 7 of the 8 contributors have passed the mid-term evaluations. I have also mentioned our GSoC work and all the contributors and active mentors on our new page about our current activity. All of them have posted again a little summary of what they have done in our group chat on Telegram: Converting Braille embosser support into a printer application Contributor: Chandresh Soni Mentors: Till Kamppeter, Samuel Thibault I'm currently developing a native printer application for the Braille embosser. I'm currently following Micheal R Sweet's lprint application, which is based on PAPPL. Currently, I am writing a driver for a generic embosser while also working on using existing Braille filters that are in shell script using FilterExternalcups() to make them ready for use in printer applications. After finishing the driver, I will work on the application's backend and test it. Scanning Support in PAPPL Contributor: Deepak Khatri Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar I am currently working to implement pappl_sc_options_t structure based on pappl_pr_options_t, as I work on scanner objects. After that I will implement the API papplSystemSetScannerDrivers and will attempt to add pappl_sc_autoadd_cb_t, pappl_sc_create_cb_t, pappl_sc_driver_cb_t callbacks to system.h for the driver interface. Adding Common Print Dialog Backends (CPDB) support to existing Print Dialogs Contributor: Gaurav Guleria Mentors: Till Kamppeter I have completed the GTK printbackend and created a merge request upstream: https://gitlab.gnome.org/GNOME/gtk/-/merge_requests/4930 I also have improved the cpdb-libs and cpdb-backend-cups libraries and fixed some bugs. I also tried working on QT CPDB print backend implementation, and had a meet with Priyadarshi Singh (previous GSoC contributor who has worked upon CPDB backend for qt). Though due to the lack of proper communication/guidance for the development of Qt, I have dropped it and started working on firefox instead after talking with my mentor. I have installed it from source and have been going over it's CUPS print backend, and talking with people on the IRC regarding the development of a new Print Backend for firefox. Cute update: I have succeeded to get Qt print dialog upstream maintainer Albert Astals Cid working with us and so Gaurav is no working on the Qt print dialog! GTK Merge Request: Draft: New CPDB print backend for GTK Print Dialog Gaurav's GitHub repository for the GTK print dialog GNOME Control Center GUI for discovering non-driverless printers and finding suitable Printer Applications for them Contributor: Mohit Verma Mentors: Till Kamppeter, Michael Sweet, Pranshu Kharkwal, Divyasheel, Deepak Patankar I am currently working on adding functionalities for Printer Applications in G-C-C. The work for the discovery of Printer Application in cups-pk-helper was completed last week. I was able to get the name of the binaries of Printer Application which were being advertised on the IPP System Service, _ipps-system._tcp . In G-C-C , I will be creating a GUI through which I will be testing the feature of a quick auto-add-this-printer button in a Printer Application(Already Installed on the system) and a button to open the web interface of the Printer Application. Once, the architecture and design of GUI for Printer Application is finalized, I will adjust the current GUI to actual design and also add a button, which does a fuzzy search for the printer make and model on the Snap Store/the OpenPrinting web site to find Printer Applications which are not installed on the local system. Further discussion happened on Mohit´s issue report: GNOME Issue report #1878 with discussion on Mohit's work. cups-pk-helper changes: cups-pk-helper PR #7: Added discovery of Printers via lpinfo, PAPPL and Printer Applications Scanning Support in PAPPL with eSCL Support Contributor: Rishabh Maheshwari Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar I am currently looking into the functions _papplClientCreate() and _papplClientRun(), _papplClientProcessIPP() of PAPPL and have started work on developing the _papplClientProcessESCL() by understanding the similarities of code to be used from AirSane. Add Avahi calls for discovering and resolving driverless IPP printers and Optimize the processes Contributor: Sachin Thakan Mentors: Till Kamppeter, Michael Sweet, Deepak Patankar I have created header file containing discovery APIs and its source files. This link contains implementation and its application on a demo service browse utility. I tested it fine on my local setup. Here is PR containing integration of the new avahi module with ippfind utility, PR#434 . Taking suggestion from Michael, I have tried improving on coding conventions. Currently I am working on better implementation of same since I am having difficulty implementing current design in other files containing service discovery code. Hoping to complete it soon in this week. Create new printer setup tool for the GNOME Control Center Contributor: Shivan Mishra Mentors: Till Kamppeter, Pranshu Kharkwal, Divyasheel, Deepak Patankar I am currently working on adding the GUI functionality of configuring IPP multi function devices using IPP system service in the module for listing available IPP print services. I plan to finish it by this week so that I can move over to fine-tuning and adding support for IPP scanner and print queues as currently program supports IPP system and printer objects. Feature requests so far: #1877: Improve setting of IPP options #1879: Do not show setting of drivers for IPP printers #1911: Printers: Make adminurl available for IPP printers While our GSoC contributor Gaurav Guleria is working on adding CPDB support to the print dialogs (see above) he has also done many fixes and improvements on the CPDB framework itself: Support for human-readable strings for options and choices Removal of CUPS dependencies in the core libraries Access to media size dimensions Asynchronously acquire printer details Renamed functions not to contain \"cups\" in their name All this made me considering a 2.0 release of the Common Print Dialog Backends. Therefore I have now renamed all the function, data type, and constant names similar to how it is done in CUPS and cups-filters, so that the CPDB libraries can be used together with any other libraries without name clashes. For the release itself I will still wait a little bit, as Gaurav could find other needs of functionality during his work on the Qt dialog. CUPS Snap in the Snap Store Now with the cups snapd interface in place Snap package maintainers are starting to use it. Some days ago I have worked with my colleagues in the Canonical Desktop Team on switching their Snaps over to the new cups interface and they did and it is actually working now. At least the Firefox, Chromium, gnome-text-editor, and evince Snaps should be switched over now, at least in the \"Edge\" channel of the Snap Store. Also of the LibreOffice Snap a switched version will appear soon. Thanks a lot to Oliver Tilloy, Nathan Pratta Teodosio, Sergio Costas, and Heather Ellsworth! Completed the restructuring to have libppd depend on libcupsfilters instead of libcupsfilters depend on libppd, as introduced in May now! The commit is here. And the adaptations on pappl-retrofit are here. The direct PPD file access in all filter functions is now replaced by converting PPD options and attributes to IPP printer attributes and control options in the ppdFilterLoadPPD() function (which calls ppdLoadAttributes()) in libppd. In addition, I succeeded to simplify the restructuring by not needing wrapper filter function in libppd for each filter function in libcupsfilters. Such wrappers are now only used for a few filter functions which need some special handling of the PPD file. To not need a different data structure for the filter data for PPD-supporting filter functions of libppd and not PPD-supporting filter functions of libcupsfilters I have added support for named extensions to the filter data structure. With this we can split the cups-filters repository into libcupsfilters (filter functions), libppd (PPD file and PostScript output support), and cups-filters-legacy (filters for CUPS 2.x) and do not need to eternally maintain PPD support code for distros any more. The code only needs some clean-up now and then is ready for a first beta release. Note that there is not enough time any more to get cups-filters 2.x into Ubuntu 22.10 (Kinetic Kudu). From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|75697| |ipp-usb|ipp-usb|2397| |ps-printer-app|PostScript Printer Application|2381| |ghostscript-printer-app|Ghostscript Printer Application|1557| |hplip-printer-app|HPLIP Printer Application|5074| |gutenprint-printer-app|Gutenprint Printer Application|4242| Currently released is 2.4.2. There will be further bug fix releases in the 2.4.x series. Some bug fixes were done during the last month, see changes below. Ubuntu Kinetic Kudu (22.10 will most probably come with a later 2.4.x. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.15. The restructuring of the code to separate the siamesian twins of the filter functions and PPD file support is completed and now we will finally polish and bug-fix the code for the 2.0.0 release. See above for more details. As cups-filters 2.0.0 will not make it into Ubuntu 22.10 there will be probably at least one further bug fix backport release in the 1.x series. Ubuntu Kinetic Kudu (22.10 will coming with cups-filters 1.28.15 or a later 1.28.x release. The CUPS Snap is currently locked to the /e496badbf2 commit (from May 20) of cups-filter's GIT master (2.x) until the restructuring gets more tested. The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.2.1. In the last month the development of the 1.3.x series has started. See changes below. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-August-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - August 2023",
+ "url": "/OpenPrinting-News-August-2023",
+ "headings": [
+ "Opportunitiy Open Source in the IIT Mandi, India",
+ "DebConf 2023 in Kochi, India",
+ "Ubuntu Summit 2023 in Riga",
+ "Google Summer of Code 2023",
+ "The CUPS Snap NOT in Ubuntu 23.10"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/eVAoG83lm3Y/hqdefault.jpg",
+ "snippet": "Opportunity Open Source in IIT Mandi, India, DebConf 2023 in Kochi, India, Ubuntu Summit 2023 in Riga, GSoC 2023, CUPS Snap switchover postponed, Ubuntu Core Desktop first",
+ "content": "Usually, I am posting each month's news mid-to-end of the month, now it got really late with it, but it is still for August, there will be the September one in the end of this month. I was really busy these days, once trying to complete the desktop integration of the New Architecture of printing in Ubuntu 23.10 and second, organizing the Opportunity Open Source in the IIT Mandi, in India. While with India everything is going well (I am writing these lines on the flight) I did not succeed with the switchover to the CUPS Snap in time and we are rolling back to the original Debian-package-based setup of 23.04 and before. But it was not lost time and effort, it was a test, a rehearsal, and a wake-up call for the desktop and application developers. Our GSoC contributor team is continuing with the desktop integration full-steam neverthelesss, as there is not only the switchover of Ubuntu to the CUPS Snap, but also all-Snap Ubuntu Core Desktop and CUPS 3.x are right in front of us. Now there are only a few days left until the Opportunity Open Source. Canonical's Ubuntu OnAir (the same live streaming system which is used for the Ubuntu Indabas) is set up for live streaming and for remote live speakers. Akarshan and his colleagues in Mandi are lining up a volunteer team and organizing the equipment needed to stream from the 2 conference rooms. And I will meet Aveek in Kolkata in a few hours and will travel with him to Mandi on Thursday, being at the venue Friday morning for setting up the rooms and briefing the volunteers ... Meet us in Mandi ... ... or on a screen near you ... And as usual: Stay updated on Mastodon: #OpenPrinting. Now there are only 2 days missing before we all meet on the Opportunity Open Source in the Indian Institute of Technology Mandi in Northern India. The final schedules are published now and we got exceptional sessions together to introduce the students to the amazing world of Open Source. We start Friday afternoon, at 3pm IST (Indian Standard Time, UTC+5:30) or 9:30am UTC. After a short introduction by Aveek and me Aveek will explain what Open Source and free software exactly means, for those who are new to the scene. Then we will hear some introducing words from Kate Stewart from the Linux Foundation and the Zephyr project, before I tell what OpenPrinting is, how it started, and what we are currently doing. After a break for some snacks, coffee, and most importantly, hallway sessions, we split into 2 tracks in our 2 conference rooms for the rest of the day. In Room 1 I will host the OpenPrinting track with Michael Sweet connected remotely, talking about the current development of CUPS and how we will proceed in 2023 and 2024 and discuss with us. After that I will present and discuss the desktop integration of the New architecture and also the integration in immutable distributions with sandboxed packaging. Mohit Verma will give a demo of his work on making the GNOME Control Center ready for the New Architecture. In Room 2 we will have a Zephyr track, hosted by Aveek Basu, with 2 remote sessions. First, Benjamin Cabé from the Zephyr project will give an introduction into Zephyr, a free software lightweight operating system for IoT, for microcontrollers and similar devices not powerful enough to run Linux. After that we will have the first interactive workshop where the speaker is connecting remotely. Jonas Remmert will teach using Zephyr and developing on Zephyr to the audience in the room. On Saturday we start in the morning, at 10am IST, or 4:30am UTC. Here we will have a Google Summer of Code panel hosted by Aveek and me with GSoC contributors nd mentors, another panel with a Canonical Gang telling about what it is to work at Canonical and how to apply, talks about immutable distributions, one about Snap and Ubuntu Core Desktop by me and another about blendOS by Rudra Saraswat, talks about documentation, lightning talks, and two workshops. The talks and panels all take place in Room 1, the workshops are run in parallel, a Zephyr training in Room 1 and a workshop about packaging applications as Snaps, hosted by me, in Room 2. For the lightning talk session most of the spots are still free and you can sign up during the event. Naturally I hope to see you in-person in Mandi, but alternatively, you can attend remotely on YouTube or Twitch via Ubuntu OnAir. See instructions on our event site and on Ubuntu Discourse. And watch out for updates on Mastodon: #OpportunityOpenSource. After Mandi in the north of India I will directly go to Kochi in the south, to the DebConf. My two proposals got both accepted, and the event's schedules are published. Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! Tuesday, Sep 12, 10:30 - 11:15 IST, Anamudi Room This talk is about how we have organized the conference, the challenges, and naturally also the outcome and experiences with running it, having come right from there to the DebConf. And we will have a Q&A session about organizing conferences and also being a mentoring organization for the Google Summer of Code. So everyone interested in running a free software conference and/or participating in the Google Summer of Code is welcome to participate in this session. The New Architecture for Printing and Scanning on Debian Saturday, Sep 16, 12:00 - 12:45 IST, Anamudi Room With the DebConf taking place right in the new cycle after the Bookworm release I will tell the Debian developer community about the New Architecture of printing and scanning to help them switch the Debian distribution to the new IPP-only PPD-less realm. The talk will also cover any news from our roadmap sprint in Mandi. For this year's Ubuntu Summit the presentationns have been chosen, but unfortunately, my talk about the Opportunity Open Source in India and the workshop about snapping (packaging as Snaps) applications, together with Lucy Llewellyn, did not get selected. But I will not be there without any contribution. My workshop \"Improving snap maintenance: automating tag updates\" got selected. Some changes have happened in our contributor team. Yuvraj Aseri has finally failed on mid-term and Gayatri Kapse's project of updating libcupsfilters, CPDB, ... to IPP Everywhere 2.0 turned out to be unnecessary and so I moved her over to do the native Gutenprint Printer Application. With that we have now 5 GSoC contributors plus 1 volunteer. OpenPrinting: CPDB support for application's print dialogs: Firefox, Chromium, LibreOffice Contributor: Kushagra Sharma Mentors: Till Kamppeter, Gaurav Guleria, Shivam Mishra, Rithvik Patibandla, Ira McDonald I have pushed the dummy printer code for review and in response chromium team replied that code is compiling and linking perfectly fine but it needs to be invoked from the core code that initiates print backend, I am able to locate the issue with creating instance of print backend and successfully implemented it and tested the functionality of dummy print backend . Next task is to import CPDB and replace dummy code with CPDB API’s Sand-Boxed Scanner Application Framework Contributor: Akarshan Kapoor Mentors: Till Kamppeter, Rishabh Maheshwari, Deepak Patankar, Ira McDonald I am in the process of developing a series of callback functions for scanning, which will later interface with SANE via PAPPL Retrofit. One of the challenges I face is manually reviewing the entire list of callback requests, ensuring adherence to specific input and output specifications. Furthermore, as we support Continuous Integration (CI), it's essential to maintain a standard set of text files suitable for use as a Dummy Driver Replacement. I've nearly completed the callbacks for \"Get Scanner Capabilities\" and \"Scanner Buffer Info\". My upcoming focus will be on the PUT requests typically sent to the server for scan settings verification and for estimating the size of the scanned image. This will lead into the development of Scan Job Callbacks, which will necessitate a thorough examination of the MOPRIA scan specifications. We already have a set of data structures to store scan information, accompanied by a custom XML generation function. This function facilitates the conversion of data from these structures into the XML format for the client. Alongside these developments, I am also delving into SANE's implementation within PAPPL Retrofit. GNOME Control Center: List and handle IPP print services for the New Architecture Contributor: Mohit Verma Mentors: Till Kamppeter, Marek Kašík, Zdenek Dohnal, Rithvik Patibandla, Ira McDonald Mohit is continuing his work after being out for a required internship for some time. Trying to get Ubuntu 23.10 using the CUPS Snap I asked him to make everything working, especially the \"Add Printer\" part and visible grouped listing of IPP print destinations in the main view, as soon as possible and do the UI design worked out with Elio Qoshi from Canonical afterwards. For the \"Add Printer\" part one problem was to find the executable of a locally running Printer Application discovered via DNS-SD, in order to run it as command line client to control the Printer Application, like making it auto-discover the printers or assign a driver to a given printer. I found out that PAPPL provides (non-standard) IPP calls for all needed operations and Mohit now succeeded to implement the \"Add Printer\" part only using DNS-SD and IPP to communicate with the Printer Applications. This is also important as if we use Snap packages or other containers, G-C-C does not see processes in other containers and also cannot access the executable files. The fact that we use non-standard IPP calls of PAPPL is no problem, as the command line interface we wanted to use before is also PAPPL-specific. There is no standard way to make a Printer Application discover printers or assign internal drivers to a given printer. Native Gutenprint Printer Application Contributor: Gayatri Kapse Mentors: Till Kamppeter, Solomon Peachy, Rishabh Maheshwari, Chandresh Soni, Ira McDonald I have gained an understanding of how the pappl-mainloop operates, as well as how printer states are managed in pappl using the .state file. I have also identified various functions responsible for handling requests like get-printer-attributes and print_job in pappl. Moreover, I have explored the web interface of the printer application running on port 8000. Currently, I am delving into the codebase of gimp-print-source, where different printer driver series have distinct backends. These backend methods are stored in an object, and backend_common.c plays a role in determining the appropriate backend to execute based on options. I am in the process of identifying functions within libgutenprint that I can correlate with pappl, facilitating the creation of a native printer application. Preset management web interface for PAPPL-based Printer Applications Volunteer contributor: Ankit Pal Singh I have completed writing the code in pappl and cpdb-backend-cups to implement presets support. Currently, I am in the process of refactoring and making some UI changes. Once this is done, I will proceed to finalize the documentation. Sorry for the false alarm last month, unfortunately, we had to step back from the switchover. So Ubuntu 23.10 will, as 23.04 and before, come with a printing stack in Debian packages. As I told last month, I had conducted the switchover together with Sebastien Bacher, and so Ubuntu 23.10 (Mantic) was using the CUPS Snap as printing stack and so was forced into the New Architecture. Principally this works, but only on the command line, or on headless servers. What was missing is the desktop integration. I have tried to rush in the changes in the \"Printers\" module of GNOME Control Center getting it just working without any UI design fancinesses and put Mohit Verma under some pressure, but this turned out not being that easy. Also Ubuntu is not only the original distribution from Canonical, with GNOME desktop. There are many so-called flavors, distributions derived from the original Ubuntu and also having the same release cycles as the original Ubuntu. In most cases they have a different desktop, but also versions for special tasks, like education, or media streaming and editing are under them. Many of them do not use the current GNOME Control Center, but other printer setup tools. This caused a lot of discussion in a Ubuntu Discourse thread, especially the leaders of several Ubuntu flavors chimed in. I tried to calm the people down and bring in ideas for quick solutions, like providing a modified GNOME Control Center with all modules but the \"Printers\" module removed for example, which could be installed as independent printer setup tool on any distro. But this does not cover everything and already being after Feature Freeze it would be impossible for all these flavors getting ready for the New Architecture, and therefore we have pulled back. Especially also to avoid a disaster as we had with Firefox. And as I always keep the community up to date, between the OpenPrinting News posts via Mastodon, it made it right away into OMG! Ubuntu and following that we got also a video by Brodie. So for now I will concentrate on printing and scanning integration in the all-Snap distro Ubuntu Core Deskop, using the CUPS Snap, the Printer Application Snaps, Akarshan Kapoor's scanning support in PAPPL for Scanner Application Snaps, Mohit Verma's work on the GNOME Control Center, and Gaurav Guleria's and Kushagra Sharma's work on CPDB and print dialogs. If all this is working, we will reconsider the switchover of the \"classic\" Ubuntu, to avoid breaking an LTS (24.04) in Ubuntu 24.10 at the earliest."
+ },
+ {
+ "id": "post:OpenPrinting-News-August-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - August 2024",
+ "url": "/OpenPrinting-News-August-2024",
+ "headings": [
+ "Soumyadeep Ghosh",
+ "Opportunity Open Source in IIT Kanpur",
+ "UbuCon Asia 2024 in India",
+ "Open Source Summit Europe in Vienna",
+ "Ubuntu Summit 2024 in The Hague",
+ "Google Summer of Code 2024",
+ "Pull Requests"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/XOZOT0Fu2p0/hqdefault.jpg",
+ "snippet": "Soumyadeep Ghosh, Opportunity Open Source in IIT Kanpur, UbuCon Asia 2024, Open Source Summit Europe 2024, Ubuntu Summit 2024, GSoC 2024, Pull Requests",
+ "content": "Sorry for posting late, but events are following close to each other ... Last month I did my second trip to India, for the second Opportunity Open Source in the IIT Kanpur and also for the UbuCon Asia in Jaipur, and having the Taj Mahal in the middle of the way between the two, I visited it during the days between the events. On the UbuCon Asia I met Soumyadeep Ghosh, Snapcrafter and submitter of the Snapcrafters' booth and workshops on the Ubuntu Summit and being newcomer in conferences, the UbuCon Asia was his very first conference. So I started to mentor and inspire him ... And next week there is already the next conference, the Open Source Summit Europe, this year in Vienna, so I will not need to travel nor need I a hotel room, I can easily commute by Vienna's excellent subway. I even played with the idea to attend aKademy 2024 in Würzburg, Germany, on the weekend between UbuCon Asia and OSS, but this would really get too much. So it was even better here that my talk did not get accepted. For the Ubuntu Summit in the Hague the sessions are selected and published. I will give a Snap workshop and participate in the Snapcrafters' booth. For many mentoring organizations the Google Summer of Code has ended, as the standard 12-week coding period is over. But we at OpenPrinting have extended the deadline for most of our projects as our contributors were not able to continuously work full-time in the default coding period, due to academic work, exams, ... Therefore for us the GSoC is continuing full-steam. This way the contributors are able to finish their projects thoroughly and without stress instead of having to rush them in, producing low-quality, buggy code. So let us see what happened at OpenPrinting in August ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat When reviewing the submissions on the Call for Proposals for the Ubuntu Summit 2024 in the Hague I saw 3 abstracts posted by Soumyadeep Ghosh together with other Snapcrafters, including Heather Ellsworth, one being for a Snapcrafters booth and the other two for Snap workshops. So I am not the only one who is organizing Snap workshops. Especially as already before the CfP in the Ubuntu Summit organization team we planned to pre-set some workshops with Canonical employees teaching certain Canonical projects (one being me with Snap) I suggested to merge my workshop with the initial one of theirs and not compete with them. After having seen this, first there was GUADEC in Denver and there I have met Heather in-person. I talked with her about the submissions and she agreed with me on joining and merging the workshop. She proposed that I should write an e-mail to all participants of the submissions and I did after GUADEC and Soumyadeep approached me on Telegram, where we had longer conversations about the Snap workshops. Especially Soumyadeep also studied my initial workshop (which originally got created by Heather). Soumyadeep is GSoC contributor for KDE this year, his project is a Snap permisson manager for KDE, his own idea, not in KDE's project idea list. He also told me that we meet in-person on the UbuCon Asia and that he will run a Snapcrafters booth on the event. So we already made an appointment to meet the evening before the first conference day, to plan the booth, right when he arrives in Jaipur. I already arrived a day earlier and have been the first day together with the organizers, and asked them for a TV for our booth, which I actually got. And in the evening of the second day Soumyadeep and me met again and re-modeled my workshop, to replace the GNOME-based exercises by CLI-based ones, so that when the attendees do the exercises they do not download the large GNOME content Snap which contains all GNOME libraries during the Snap build, as this would overload the slow Wi-Fi in the venue. Soumyadeep also told me that the UbuCon Asia was the very first conference in his life, the first flight, the first solo trip. So I was his conference mentor and we were up until 2am both nights, so not being principal organizer of the UbuCon I did not get any more sleep than on the Opportunity Open Source ... Soumyadeep and me have given the workshop together then and he was a surprise guest, as we decided to do the workshop together only in the two nights before and I did not come around to ask the organizers to modify my entry in the schedules. Soumyadeep talked with the organizers about the Wi-Fi needs and they have swapped the workshop into the plenary room as that room has faster Wi-Fi than the breakout room. The attendees liked the workshop a lot (especially also Guruprasad Lakshmi Narayanan from Launchpd). Soumyadeep's conference debut was a great success. And now he got really enthusiastic. He does not only want to speak on the Ubuntu Summit this year, but also be GSoC contributor for OpenPrinting next year, create a monthly Ubuntu podcast interviewing people (comeback of the Indabas?), and create a programming club in his college ... Seems that I have really inspired him ... Update: LinkedIn report by Soumyadeep about this section I have done my second trip to India, mainly for the Opportunity Open Source 2.0 in the Indian Institute of Technology (IIT) Kanpur, on August 24-26. Arriving at the campus of IIT Kanpur and approaching the the actual venue, the central lecture hall building, large, nicely designed posters with the faces of many of the speakers, including the event chairs Aveek and me, appeared at several places, and especially at the main entrance there was a row of posters, each featuring two faces, like at the entrance for a polling place for elections ... This showed already the excellent on-location organization of the event by Pratham Sahu, Rahbar Khan, Shreya Shree, Prakhar Mishra, Sanskar Yaduka, and many volunteers. Thanks a lot to them. They did not only get 3 lecture halls (all with projector, mics, and speakers) for us during all the two days but they also organized guest house rooms for speakers and attendees, set up registration and payment for attendees, designed the web site and the posters, and organized an excellent conference dinner not only for the speakers but for all attendees on Sunday. And this was naturally not possible without sponsors. Our organization team found local start-ups, Trumio and CDIS, and also Red Bull as sponsors and raised funds near 10000 USD. Before the start of the conference I got kept busy with adjusting the schedules, accommodating last-minute speakers, talks by the sponsors, speakers only coming for one day, but I got puzzled together everything to cater for everybody. The conference went smoothly, we had some delay, due to technical problems, but not more than half an hour, and we succeeded to stream the plenary and breakout rooms as planned and also we succeeded to record the workshops at least on Sunday. But it was not really easy for me to rush through all the 3 rooms in the beginning of each day and at the end of the lunch breaks, to set up the streaming. We also needed to move to different rooms on Saturday after the afternoon break, due to university events happening in our rooms. A special success were the 9 workshops. they were really well attended. People seem to like to try out the things hands-on than just listening to talks ... And on Sunday evening, after the 2 days of talks and workshops, came the big surprise: We went to a place on the campus, a large open-air area, and there a catering hired for the conference dinner set up a nice decoration, a delicious buffet, especially also with live cooking and a nice mocktail bar (alcohol-free cocktails, as booze is not allowed on-campus), and also waiters going around with finger food, and that not only for the organizers and speakers but also for all the attendees. This was great for networking and many people came up to me as they wanted to have the next Opportunity Open Source in their college, and many, many people have taken photos of them with me ... On Monday, the third day of the Opportunity Open Source, the Hackathon day, has taken place, a 12-hour programming competition, with a really odd timing, starting at midnight and ending at noon. For this tables and chairs got set up in a yoga hall and there were many people participating, the hall got very busy. The problems to work on were provided by the Hackathon sponsors Trumio and Overlayy and the best 3 submissions won an internship at Trumio. Thanks a lot to the sponsors. Schedules Of at least some sessions the slides are available here, under \"Presentation Materials\". All days Recordings The recordings are not edited and it is possible that on some there is a bad audio quality. Also note that the closing plenary has taken place in the breakout room and not in the plenary room. Saturday, August 24, Morning Plenary Room Breakout Room Saturday, August 24, Afternoon Plenary Room Breakout Room Sunday, August 25, Morning Plenary Room Breakout Room Sunday, August 25, Afternoon Plenary Room Breakout Room Coverage There are several blogs, reports, and announcements about this event, mostly on LinkedIn. People liked it a lot and are eager to attend the next edition. IIT Kanpur Announcement Hindustan Times Announcement of the event on LinkedIn My summary on Ubuntu Discourse Report by Tushar Gupta on Ubuntu Discourse Report by Aveek Basu on LinkedIn Report from speaker and former OpenPrinting GSoC contributor Sahil Arora on LinkedIn Report by Aditya Nigam on LinkedIn Report by Aditya Narayan on LinkedIn Report by Abhipsa Nayak on LinkedIn Report by Mayank Porwal on LinkedIn Report by Apurv Gupta on LinkedIn Report by Kaushal Sharma on LinkedIn Report by Rishu Singh on LinkedIn Report by Garvit Bhardwaj on LinkedIn Report by Garvit Bhardwaj about the Hackathon on LinkedIn Pictures Not many of the talks and workshops on Sunday, unfortunately, but hopefully more pictures will get added. Saturday Sunday & Monday Mastodon #OpportunityOpenSource After leaving Kanpur my trip went on in the direction of Jaipur with a stop-over in Agra, to see the Taj Mahal. Alao the stop-over split the road trip into 2 4-5-hour pieces. In Jaipur the UbuCon Asia 2024 has taken place, on Aug 31 - Sep 2 (Sat - Mon). There I have given a talk and a workshop about Snap, and, only one week before the event, when I was already in Kanpur, I got the invitation to also give my submitted lightning talk about conserving old printers under Windows using WSL. Update: Aftermovie Update: Recordings of all talks, links to my talks below Desktop Linux, as easy as a smartphone! Just in a Snap! (Slides, Video) Your app everywhere - Just in a Snap! - Interactive Workshop (Slides, Video) Save Legacy Printers under Windows with WSL and Printer Applications (Slides) But the most important of this conference for me was to meet Soumyadeep Ghosh (see above). Coverage Report by Soumyadeep Ghosh on GitHub Report by Youngbin Han (/young/bin/) on Ubuntu Discourse Report by Soumyadeep Ghosh on LinkedIn Report by Lakshya Borasi on LinkedIn Report by Vaibhav Chouhan on LinkedIn Report by Uddaraju Praneeth Kumar on LinkedIn Pictures Official photographs Community-submitted photos and videos Playlist of all recorded sessions This year's Open Source Summit Europe in Vienna is approaching, next week! On September 16-18. It is a home game for me and so I had attended it independent whether I had given a talk or not. Especially also as I am one of the 8 fellows of the Linux Foundation, the conference fee is waived for me. But independent of this I had submitted a talk and it got accepted, so mark your calendars: OpenPrinting - We Make Printing Just Work! Wed, September 18, 15:10 - 15:50 CEST, Hall B (Level 2) Track: LinuxCon Update: Slides, Video I will give an overview of our work. Going through OpenPrinting's history the components of the printing infrastructure of modern Linux (and other Posix-style) operating systems will get shown. - How did the Internet Printing Protocol (IPP) with the printing system CUPS being an implementation of it simplify printing a lot? - The printer driver challenge, good and bad cooperation with manufacturers, packaging and distributing ... - Desktop integration, GUI toolkits, print dialogs, setup tools, portals, ... Especially also the New Architecture of all-IPP printing and scanning and also the integration in immutable OS distributions will be treated ... There will also be a Canonical/Ubuntu booth (Hall E, Level 0, Booth G/S13) with several people from Canonical, especially I will meet there Cristovão Cordeiro, Rockcraft expert and mentor of our GSoC contributor Rudra Pratap Singh, and Mauro Gaspari, organization lead of the Ubuntu Summit. See all Canonical/Ubuntu activity in this Ubuntu blog. Also the Ubuntu Summit is coming closer, only 6 weeks left (on October 25-27). The sessions are selected now but not yet scheduled. So you can see our talks, workshops, and booths in the now published list of contributions. See also how we got our nice stork logo. I will be there, not only as member of the organization team, but also presenting Snap together with the Snapcrafters, on the booth and also in the workshop, all together with Merlijn Sebrechts, Heather Ellsworth, Scarlett Moore, and Soumyadeep Ghosh. All our 11 contributors have passed their mid-term evaluations and one, Rudra Pratap Singh, has passed the finals. All the others asked for a later deadline as they were not able to work full-time on their projects during the originally scheduled 12 weeks, but they are all well in shape for successfully completing their tasks. And this time we got write-ups of all of them: Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh Work Product PASSED Successfully completed the packaging of all four printer apps: ps-printer-app (https://github.com/rudra-iitm/ps-printer-app-rock), hplip-printer-app (https://github.com/rudra-iitm/hplip-printer-app-rock), gutenprint-printer-app (https://github.com/rudra-iitm/gutenprint-printer-app-rock), and ghostscript-printer-app (https://github.com/rudra-iitm/ghostscript-printer-app-rock). Integrated GitHub Actions from ubuntu/desktop-snaps (https://github.com/ubuntu/desktop-snaps) into each app, enabling seamless automatic versioning and dependency updates. Added registry-action.yml (https://github.com/rudra-iitm/hplip-printer-app-rock/blob/main/.github/workflows/registry-actions.yml) to streamline pushing Docker images of the Rock packages to Docker Hub. Documented the printer apps and further enhanced the documentation of CUPS rocks (https://github.com/rudra-iitm/cups-rock). Had the honor of delivering a talk, conducting a workshop, and joining the GSoC panel at Opportunity Open Source 2.0 (https://events.canonical.com/event/89/), hosted by IIT Kanpur (https://www.iitk.ac.in/). Wrapped up both the month and my official GSoC journey by submitting the final report. Explore it here: https://medium.com/@rudransh.iitm/gsoc-2024-final-report-container-chronicles-759fe7f23ac6 While the GSoC period has ended, a few tasks remain, which I’ll continue working on with my mentor at our own pace. CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha This month I worked on multiple small bug fixes, styling changes and phasing out most of the low level handling of CPDB's components by replacing them with CPDB API function calls. I also fixed the issue of user-selected printer settings not being actually sent in the print job and that of starting of the print dialog sometimes leading to crashes. Currently I am working on replacing multiple DBuS calls to get translations of options and choices seperately with one single call to get everything to prevent the slowing of the LO print dialog. WIP Pull Request. Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu In the past month, we achieved the integration of another important project of OpenPrinting, cups-filters, into the OSS-Fuzz framework. The primary focus of the initial fuzzing effort has been on the texttopdf functionality. To date, OSS-Fuzz has uncovered a total of 35 issues across OpenPrinting projects, with 22 already resolved. We have fixed the building for the Google Fuzz Introspector, a critical development tool for monitoring fuzzing activity and visualizing data within OSS-Fuzz. The information extracted by the Fuzz Introspector are now used by the automated fuzz driver generator OSS-Fuzz-Gen. We recently shared insights our OSS-Fuzz integration experience at the security track of OOSC 2024 and we are going to lead a workshop at the Ubuntu Summit 2024 by Mr. George-Andrei Iosif to further exploring these advancements. PAPPL API Bridging for Scanner Applications Contributor: Akarshan Kapoor This month, the focus was on integrating the eSCL components into the new scanner API within PAPPL. Although the coding for these components was completed some time ago, it is currently being refactored with newer API integrations in mind. The primary objective is to finalize the eSCL integration to ensure that both the coding and logical aspects are fully addressed. This will enable testing with both dummy and SANE scanners to begin. The main goal for the coming month is to streamline the code and complete the logistics setup, ensuring sufficient time for both testing and configuration. Akarshan's ongoing work you find in this work-in-progress pull request on PAPPL and in his GIT clone of PAPPL 1.4.x. CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma the dummy print backend is up and running successfully. I've started the process of integrating CPDB into the codebase, which is a critical step for our project's development. Currently, I'm working through some import issues related to CPDB, which I anticipate resolving soon. Once these issues are addressed, we can proceed with further integration and testing to ensure CPDB functions seamlessly within the system Kushagra created a good collaboration with the Mozilla developers now, via my original feature request. Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal I have written the asynchronous service discovery code and tested it with my local instance of system-config-printer. Regarding the part on \"assigning Printer Applications to non-driverless printers,\" after receiving feedback from Till, I'm now working to understand the required changes. My next goal is to discuss and select a UI for the discovered services, compile the final code, and merge it into the main GitHub repository of SCP. After that, I will focus on the \"assign Printer Applications to non-driverless printers\" task. Make a native printer Application from Gutenprint Contributor: Ankit Pal Singh I’m working on adding cups_image_t to the rasterRasterJob and printJob functions to handle image data for printing. I’m fixing some minor issues with memory and data formatting. Once these functions are done, I’ll start on the Pappl backend. GNOME Control Center: Finalizing the New Printing Architecture for GNOME Contributor: Kaushik Vishwakarma Migrated all previous work done by the previous GSoC contributor, and my current mentor Mohit Verma, from GCC 45 to GCC 46.4. This migration included updating UI code that Mohit added to the new GCC architecture, migrating all features, and updating the library versions. Additionally, I removed duplicate printer entries in the GUI that appeared with different options by modifying the sort function used in the main GCC printer panel. I also created a DBus mechanism in CUPS pk-helper to add printers into the printer application , provide printer information. What's Next? Implement a feature to allow the printer application to choose options from already installed system printers for auto-adding printers. Make necessary changes to the UI and code to finalise the project. Create a pull request to the GCC repository to merge all the completed work. User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma I developed a local server for user authentication, integrating OAuth support for CPDB. The server facilitates secure user verification by redirecting them to GitHub for authentication. This approach ensures a seamless and robust authentication process, leveraging GitHub's OAuth system to handle user credentials and access securely. Now the task will be to add a few more ways to authenticate users. And later I will work on security issues as well. Converting Braille embosser support into a Printer Application Contributor: Arun Patwa This month, I have added the functionality for converting text to BRF format using 'liblouisutdml' Repo and integrated the Braille Embosser with the PAPPL application. This integration allows the application to handle Braille embossing tasks. The next steps involve thorough testing to ensure everything works smoothly. I am currently working on it and taking help of Samuel. Once this would be integrated successfully then will add other filters. Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak While going through all the converted files, found many errors, and converted pdfio-xobject.cxx file once more.I also updated the the pdfio-pdftopdf-processor.cxx and pdftopdf-processor.cxx files. Here is Uddhav's work on GitHub. Special thanks go to Biswadeep Purkayastha (CPDB support for LibreOffice) and his mentor Michael Weghorn (LibreOffice upstream developer) as they did again many changes and improvements, mainly on the CPDB libraries (cpdb-libs) and also on the CUPS backend for CPDB (cpdb-backend-cups). Most changes are bug fixes. Since the 2.0b6 releases they did 24 Pull Requests on cpdb-libs and 5 on cpdb-backend-cups: cpdb-libs PR #53: Fix memory leaks in cpdbUnpackOptions(), by Michael Weghorn PR #54: text-frontend: Fix memory leak in \"add-setting\", by Michael Weghorn PR #55: Replace cpdbConcat() with g_strconcat(), by Michael Weghorn PR #56: Drop unused cpdbExtractFileName(), by Michael Weghorn PR #57: Fix memory leak in cpdbGetDefaultPrinterForBackend(), by Michael Weghorn PR #58: Allow to extract translations from table, by Biswadeep Purkayastha cpdb-backend-cups PR #36: Pass correct parameters to cupsStartDestDocument(), by Biswadeep Purkayastha"
+ },
+ {
+ "id": "post:OpenPrinting-News-December-2019",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - December 2019",
+ "url": "/OpenPrinting-News-December-2019",
+ "headings": [
+ "OpenPrinting Mini Summit at IIT Mandi, India",
+ "Google Summer of Code 2020",
+ "Avahi local service support",
+ "OpenPrinting web site",
+ "CUPS",
+ "cups-filters",
+ "ippusbxd"
+ ],
+ "tags": [],
+ "snippet": "CUPS 2.3.1 and cups-filters 1.26.0 released, lots of improvements and fixes for cups-browsed and the \"driverless\" utility, OpenPrinting meeting in Mandi, India, GSoC 2020 org application period announced.",
+ "content": "On November 9 we had a meeting in India presenting the work of OpenPrinting at one of the universities where our Google Summer of Code students came from. See our separate news article with pictures. We need to start with the student selection process soon, so that we can let them do assignments to compensate for the missed Google Code-In opportunity. The mentoring organization application time window for the Google Summer of Code 2010 got announced. It is from January 14th to February 5th, 2020. Trent has added a comment to the Upstream issue with some questions on December 6th, 2019 and I (amd Michael Sweet) have answered. No further action after that. This has raised the idea in me to make cups-filters (cups-browsed and the \"driverless\" utility) use DNS-SD-service-name-based IPP URIs, like CUPS does. Compared to the standard host-name-based ones they are independent of network interfaces and ports and so make it easier to implement local IPP services (like Printer Applications). I have implemented this in cups-filters 1.26.0 (see below). We urgently need the localhost support for the Printer/Scanner Applications, as PPD support will go away within a year. Dheeraj has continued to work on the web site and fixed several issues. Especially the last three news items are presented on the front page now and they are listed with author and date. On the \"News and Events\" page we have also a link to the archive of minutes of the monthly OpenPrinting phone meetings now. CUPS 2.3.1 got released today! Tons of bug fixes: Currently released is 1.26.0. 1.26.0: This release adds some new features to cups-browsed and to the driverless utility: Both now use DNS-SD-service-name-based URIs for IPP print queues, like CUPS does. These URis are independent of network interfaces and ports and so make providing IPP services on the local machine (Printer Applications) easier. cups-browsed creates large numbers of local queues in portions now, so that it can treat jobs to print clusters between the portions, this makes printing more reliable in large networks with many printers. In addition, a lot of bugs got fixed. 1.25.13: Bug fix release, mainly to solve problems of cups-browsed, mainly for compatibility problems with some printers, leaks, and crashes. Also updated the PPD generator to catch up with the one of CUPS. Prefer Apple Raster instead of PWG Raster as some printers have bugs in their PWG Raster implementation. 1.25.12: Bug fix release, to address a bug of grayscale jobs not printed on PostScript printers when Poppler is used as PDF interpreter, to allow printing on printers which claim to accept PWG Raster but actually do not print this format, and to eliminate all compiler warnings when building the package. No further news."
+ },
+ {
+ "id": "post:OpenPrinting-News-December-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - December 2020",
+ "url": "/OpenPrinting-News-December-2020",
+ "headings": [
+ "Google Summer of Code 2021",
+ "Google Season of Docs 2020",
+ "PAPPL 1.0.0 released!",
+ "PostScript Printer Application",
+ "CUPS",
+ "cups-filters"
+ ],
+ "tags": [],
+ "snippet": "PAPPL 1.0.0, PostScript Printer Application, GSoC 2021, GSoD ended, CUPS 2.3.3op1, cups-filters",
+ "content": "We are currently looking for project ideas for next year's Google Summer of Code. As mentioned already in October student projects will only be half the time (6 weeks). Google tells that this will probably attract more students, but for us it is a much higher workload as we have to find the double amount of students and get the double amount of students introduced and up to speed to get the same work done. For larger projects we should also consider to run them under the Linux Foundation Mentoring Program instead of GSoC. The standard length (3 months) projects of this year's Google Summer of Docs have ended and so also our OpenPrinting project done by Piyush Goyal. His work continues to be available on our web site and he has also put up his final report. Piyush also reported his successful conclusion of GSoD on LinkedIn and thanked his mentors and others on OpenPrinting who helped him. Only part not completed is the section about Scanning as the implementation os scanning support in PAPPL is still work in progress. Michael Sweet has issued the first stable release of PAPPL, version 1.0.0. With the help of my issue reports and feature requests during the development of the PostScript Printer Application he reached a certain feature-completeness for the first stable version. Especially following features are now available in PAPPL: Automatic driver/model selection based on the printer's device ID, device ID obtained from USB printers and network printers, the latter discovered via IPP or SNMP. Fallback to automatic driver selection if in an update of the Printer Application the selected driver does not exist any more. Adding user-settable options/IPP attributes specific to the individual Printer Application and settable via web interface or as command line options when submitting a job. Adding web interface pages for functionality specific to the individual Printer Application. Adding buttons and navigation bar items to access them. All can be done either per-printer or for the system. Saving parameters specific to the individual Printer Application which are not necessarily user-settable options as \"...-default\" IPP attributes in the state file. Support for non-raster, high-level output formats (PostScript, PDF, PCL-XL, ...) with direct conversion from PDF or PostScript input without inbetween raster graphics step. Also useful for retro-fitting classic drivers which output a proprietary raster format but only accept high-level input formats (like Ghostscript's built-in drivers). Support for data-driven (not hard-coded in the Printer Application's C code) driver lists and parameters. Improved user experience and stability. See also the currently open and closed issues of PAPPL. Michael Sweet is now continuing the development towards version 1.1. Next step is for the Linux distributions to package and include PAPPL. The devlopment of the PostScript Printer Application is going on and has driven the development of PAPPL forward. The PostScript Printer Application got several new featrures: Automatic selection of the printer model by simply selecting \"Auto-detect Driver\" (the default) for the driver instead o weeding through a long list (currently around 4000 models), also the autoadd option of the command line interface uses this functionality. Auto-selecting the printer model and the autoadd option always check whether the printer actually supports PostScript, independent whether it is in the list of explicitly supported model, for generic support of models not explicitly supported and to make sure that an optional PostScript add-on is actually installed. Quick 1-bit-dithered raster output for monochrome/grayscale jobs in draft print quality. This reduces the raster data sent to the printer a lot and this way speeds up the jobs significantly. Not only the standard options of the PPD files, which can be represented by IPP attributes, but also vendor-specific PPD options are suppprted now. The latter can at least be controlled by the \"Printing Defaults\" page of the web interface and by supplying them when submitting a job via the Printer Application's command line interface. Printing a test page via appropriate button in the web interface. The test page is the good, old, 20-years-old CUPS test page from the pre-PDF era. It shows valuable information about the PostScript printer it is printed on and works with practically any page size. Improvements on the user experience: No options with a single choice displayed, options with human-readable choices named \"true\" and \"false\" displayed as boolean check box options, \"OutputBin\" only displayed when it is actually in the PPD file. Lots of bug fixes, including for the very first bug report we got. We get closer to completing this Printer Application. Features still planned are: Extra per-printer web interface page for device settings, especially configuration of which optional hardware add-ons are actually installed (\"Installable Options\" group in the PPD files). So the user selects which add-ons (extra trays, duplex unit, finishers, ...) are installed and the options and choises on the \"Printing Defaults\" page and also the capabilities reported as response to a get-printer-attributes IPP request from a client get appropriately adapted. Also polling add-on setup and option defaults from the printer will be available on this page. Ink level check via ps_status() function. Needs support in PAPPL. Web interface page for user to add extra PPD files Checking PPD files for *cupsFilter(2): ... lines and for options without PostScript/PJL/JCL code. These are hints for unsuitable, typically non-PostScript PPD files or options based on host-side extra filters. Such PPDs and/or unsuitable options should get removed, during Snap build, during building of Printer Application's driver list, when user adds a PPD. Make Snap fire up Printer Application automatically as daemon and Printer Application set up USB printers automatically when they get connected (needs support in PAPPL. We also need to put up the PostScript Printer Application in the Snap Store soon. Before starting with further driver-retro-fitting Printer Applications I am thinking about spinning some of code of the PostScript Printer Application out into a library for retro-fitting Printer Applications, like libpappl-retrofit or similar. Currently released is 2.3.3op1. Note that from now on I will report releases on our fork of CUPS on OpenPrinting here. With 2.3.3op1 Michael Sweet has issued the first CUPS release on OpenPrinting! The release already made it into Debian unstable and will soon get merged into Ubuntu Hirsute Hippo (21.04). Also the CUPS Snap is updated to this version. We will from now on present the new items in CHANGES-OPENPRINTING.md of the fork here: Currently released is 1.28.6. On the way towards 2.0.0 and driven by the further development of the PostScript Printer Application I have added the following new features: Overtaken all fixes and improvements from the PPD generator in current libcups to the PPD generator implementations in libppd and libcupsfilters. Made cupsRasterParseIPPOptions() function (called from filter functions used without PPD file) consistent with the changes in the PPD file generators. Added the possibility to define a callback function to tell a filter function when the job got canceled. Before, a pointer to an integer was used. This change is to get more flexibility and especially to support the papplJobIsCanceled() of PAPPL. Added support for Sharp-proprietary \"ARDuplex\" PPD option name for double-sided printing. Moved the functions ppdPwgUnppdizeName(), ppdPwgPpdizeName(), and ppdPwgPpdizeResolution() into the public API of libppd. In the ppdPwgUnppdizeName() allow to supply NULL as the list of characters to be replaced by dashes. Then all non-alpha-numeric characters get replaced, to result in IPP-conforming keyword strings."
+ },
+ {
+ "id": "post:OpenPrinting-News-December-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - December 2021",
+ "url": "/OpenPrinting-News-December-2021",
+ "headings": [
+ "CUPS-driver-retro-fitting Printer Applications",
+ "CUPS Snap",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "Testing and bug fixing to approach cups-filters 2.x, CUPS 2.4.0, PAPPL 1.1rc1",
+ "content": "This month's news post is somewhat shorter, as not many important features, milestones, or great new ideas we have to talk about. I mainly tested cups-filters and fixed bugs to approach its 2.0.0 release. But we are not completely without milestones, as CUPS 2.4.0 got released as the first stable feature release of CUPS on OpenPrinting. We are back with a new stable release series of CUPS and Ubuntu 22.04 LTS and probably many other distributions will come with a 2.4.x version of CUPS. And also keep in mind that for 2022 everyone can participate as code contributor in the Google Summer of Code, not only students. See last month's edition. So if you like to participate, or at least be part of the OpenPrinting developer community, please speak up (till at linux dot com). We need also project ideas for the GSoC 2022. Note that there are 2 sizes now, 3 months like on GSoC 2020 and before and 6 weeks like on GSoC 2021. On further testing I have found the following issues and corrected them: Removed now unneeded workaround for missing mdns4_minimal in core20, as this is fixed in released core20 now (commit) Adjusted the systemd timeout for shutdown (TimeoutStopSec) in the Printer Application Snaps, to be longer than PAPPL's internal timeout on shutdown, to assure regular shutdowns instead of killing (kill -9 ...) the Printer Application (GitHub Issue). CUPS Snap in the Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but we have again progress here. Only few things still need to get adjusted, once to prevent breaking the AppArmor profile by the CUPS socket path specified in the client Snaps (discussion) and second, the best location for the CUPS socket to do not interfere with other files (discussion). I got asked to do two further real-life tests of the new snapd to see whether the new cups interface is working correctly. Here are the results of the second test and the third test. Generally, all tests showed that the interface is correctly working, but in the third test, done after snapd having gotten a facilty to set the CUPS_SERVER environment variable automatically in client Snaps, the interface only worked after re-connecting it after the snapd update. So we come closer now. Main TODOs are: Complete the cups interface in snapd. Testing Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|3425| |ipp-usb|ipp-usb|856| |ps-printer-app|PostScript Printer Application|1914| |ghostscript-printer-app|Ghostscript Printer Application|689| |hplip-printer-app|HPLIP Printer Application|2414| |gutenprint-printer-app|Gutenprint Printer Application|1718| Currently released is 2.4.0. This is the first feature release of CUPS on OpenPrinting. Thanks to Zdenek Dohnal (RedHat) for having taken the role of the release manager for the CUPS 2.4.x series. See our development roadmap posted earlier here for details. Ubuntu Jammy Jellyfish (22.04 LTS) will come with CUPS 2.4.x, if all works well, as Snap. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. 2.4.0 CUPS 2.4.0 is the latest stable OpenPrinting CUPS release. Among the changes from beta and release candidate the stable release adds two new configuration options for optimizing cupsd setup on servers and several other changes. Currently released is 1.28.10. We are continuing to polish and to fix bugs for the 2.0.0 release. I have especially tested the new universal filter function and by that found some bugs in the filter function itself and in cups-filters in general. Also switching the implicitclass CUPS backend of cups-browsed over to use filter functions instead of external filter executables revealed some bugs. Forgotten to include bannertopdf()(commit) and its MIME rule (commit) in the 'universal()` filter function. Added CUPS conversion rule files (commit) separately for individual CUPS filters and universal() Make universal() not fail if the filter chain turns out to be empty (commit). Let universal() use the log function (commit). Added way to silence the driverless utility by environment variable so that the Legacy Printer Application can suppress its report of driverless printers (commit). pdftopdf() did not correctly scale and rotate the pages according to the print-scaling job IPP attribute, especially on documents which contain pages of different sizes. Fixed also N-up printing (N pages per sheet), and handling of job option/attributes (commit). Made sure that all filter functions use their input/output file descriptors and log functions get used everywhere, not stdin/stdout/stderr, nowhere call exit(), code clean-up and simplification, feeding all needed information by parameters, ... things which got overlooked when converting external executable filters to library functions. In the universal() filter function do not call pdftopdf() on input data in application/vnd.cups-pdf, this data is considered as already treated by pdftopdf() (commit). Fixed environment variable handling in filterExternalCUPS() (commit). Created a debug helper filter function to check data passing between two filter functions in a chain (filterTee()). Accepted a Pull Request making sure that when the driverless utility communicates with a device with IPPS URI the communication is encrypted. Ubuntu Jammy Jellyfish (22.04 LTS) will most probably come with cups-filters 2.x. The CUPS Snap currently uses 1.28.10. The Printer Application Snaps use the current GIT master of cups-filters. Currently released is 1.1rc1. The release candidate for PAPPL v1.1 is now available for download. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. Changes in 1.1rc1 include: Fixed a bug in the printer configuration web page. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-December-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - December 2022",
+ "url": "/OpenPrinting-News-December-2022",
+ "headings": [
+ "Adobe gets 40 and releases PostScript source code",
+ "Ubuntu Summit - Videos, pictures, blogs, podcasts ...",
+ "Recordings",
+ "Photos",
+ "Blogs and articles",
+ "Podcasts and videos",
+ "Google Summer of Code 2022",
+ "Common Print Dialog Backends Second Generation - First Beta Release!",
+ "pappl-retrofit - First Beta Release!",
+ "PAPPL 1.3.0",
+ "Snaps of the retro-fitting Printer Applications and of CUPS updated",
+ "Bug fixes in libcupsfilters, libppd, and cups-filters",
+ "OpenPrinting GitHub repositories have discussion forums now",
+ "Snap Store Overview"
+ ],
+ "tags": [],
+ "teaserImage": "/assets/images/ubuntu-summit-2022/ubuntu-summit-2022-recordings.webp",
+ "snippet": "Adobe releasing PostScript source code, Ubuntu Summit 2022 recordings and coverage, GSoC 2022 upstreamizing, CPDB 2.0b1 release, pappl-retrofit first release, PAPPL 1.3.0, Snaps updated, bug fixes",
+ "content": "This is the last News Post of 2022. Most of us will be meeting family and friends during the holidays. And many of them are not Linux and free software users as we are. Struggling with their Windows and Mac systems and considering you as computer guru they are asking you to solve their problems. If it is Windows 11 (or at least updateable to 11) and an old printer, you are lucky as we have already posted the solution here (video). But if there are more severe problems, like for example network printing with Windows, with Windows' printing system being \"that mess of Windows 3.0\" (of the late 90s, see also below), it is at the time to convince them to switch over. And for that there is now a nice Christmas gift available, the book \"Beginning Ubuntu for Windows and Mac Users\" by Nathan Haines, one of my colleagues in the organization committee of the Ubuntu Summit. Still in doubt that this is the right book? Then let Nathan tell you more about it in the December edition of the Ubuntu Desktop Team Indaba which has taken place some days ago (YouTube video). And also the organization team of the Ubuntu Summit has a nice holiday gift for you: Hours of entertainment (and knowledge) with the recordings of nearly all the sessions on YouTube and lots of photos, and there is even more to read and listen to about the Summit by bloggers and podcasters ... (see below). Best wishes for the holidays from the OpenPrinting team! 40 years ago, in December 1982, Adobe got founded, to start the development of the page description language PostScript. The language was intended as a universal, device-independent form of describing printable content. Especially the characters of the fonts and also other graphical content should not be described as bitmaps, handcrafted for every needed resolution, but as device-resolution-independent mathematical descriptions, Bezier curves, vector graphics, ... It got the standard for page description languages for a long time, many printers were made which use it and it got the standard format for Unix and later Linux to describe print job content in a device-independent way, until Michael Sweet and me replaced it by PDF, the Portable Document Format, also from Adobe. On the occasion of their 40th anniversary Adobe, being known to keep well their algorithms and methods as trade secrets, they have released the source code of an early development stage (version 0.1.0) of their PostScript language and made it available via the Computer History Museum in Mountain View, CA. It is available through a blog article. But do not think, it will now make the rounds through the free software community or even be made use of by OpenPrinting. Its license puts the \"Don´t Touch\" sign on it (which you know very well from museums). No redistribution, no commercial use, ... And as it does not compile with modern compilers (like gcc) without modifications anyway, you should simply pass over straight to Ghostscript ... Also have a look on some comments on Hackaday. By the way, I had already visited the museum many years ago. The Babbage Difference Engine No. 2 which had been there was really awesome. A completely mechanical computer, even with printer. Someone should implement IPP on it ... Update: Impressions of the event: The Aftermovie! The first Ubuntu Summit was really one of the greatest and most awesome conferences I have experienced. As reported here already in the last month I and many others have put a lot of work into it and the result was overwhelming ... You did not make it to Prague? Or, while you have attended a great session on the Ubuntu Summit an awesome session was taking place in another room? No problem! We have recorded most of the talks and panels in the ballroom and the 4 breakout rooms Karlin 1-4 and they are now available on YouTube in a playlist. Ubuntu Summit Recordings on YouTube Note that we did not record the workshops, as they were highly interactive and so watching a recording of them would not make much sense. Also we had technical problems in the breakout rooms on the first day, and therefore we could not use the recording of most of the sessions, only 4 we could save with a lot of editing work. By the time of writing this News Post the uploading process of the videos to YouTube was not yet completed. The third day is still missing. It will be added to the playlist in the next days. Note that editing and uploading the videos is really a lot of hard work. Thanks a lot to Mauro Gaspari and Aaron Prisk of Canonical's Community Team for doing this. Update: All the recordings of all the 3 days are available now!! I have also updated my report in last month's news adding links to the recordings of every session I mentioned there. And I have to give a special thank you to Mauro and Aaron as the recordings of all the (non-workshop) sessions where I was the speaker or host of worked out great: Your app everywhere, just in a Snap! OpenPrinting - Join the team to make printing just work! Save Legacy Printers under Windows with WSL and Printer Applications Especially to mention is Mauro's amazing editing work on my Snap panel where everyone is audible, especially the 7 panelists using one mic lying on the chair in front of them. Thanks a lot! Such an event gives also a lot of opportunities to take photos. Once we have hired a professional photographer for the first 2 days and the closing party and second, we have asked the attendees in our post-Summit blogs to submit their pictures, leading us to two nice photo galleries: Professional photographer Attendee's photos Have you been on the Ubuntu Summit and taken some interesting shots? Submissions are still open until mid-January. Please use this upload form. The conference also attracted several bloggers and news writers, so there is a lot to read about the Summit. My lightning talk about saving old printers under Windows with WSL and Printer Applications was a special success. When one looks through all these articles and blogs (and especially also the podcasts) it can feel like the conference was a printer-saving-under-Windows Summit despite this subject matter only being presented in a 10-minute lightning talk and the Summit being all about Linux. What perhaps contributed to this was also Mark Shuttleworth who has mentioned me and my lightning talk as the very first highlight of the Summit in his opening plenary. I have never seen that a lightning talk got so much attention. Canonical's Ubuntu Blog Ubuntu Summit Highlight Reel: Heather Ellsworth (with some help by Mauro Gaspari, Igor Ljubuncic, and me) writes about what has happened: Lots of photos from the sessions (including my Snap panel), the GNOME panel (or better stand-up meeting?), the Mini Pupper and plotter workshops, the foosball action, the Kinetic Knitting workshop of the first night the game night, the boat party ... Ubuntu Summit Memories Live On: In the second post-Summit blog Heather gives us the links to the photo galleries and the recordings, and she also motivates to come or even speak next year, or make the next Summit a part of your day job, working at Canonical! Canonical's Snap Blog Snapcrafters: 2022 wrap-up: This is about what happened in the volunteer organization Snapcrafters (they snap what upstream is not snapping) during the year 2022. Especially it also tells about the Ubuntu Summit and mentions (and YouTube-links) Dani Llewellyn's plenary talk \"Getting started within the Ubuntu Community\" and my Snap panel \"Your app everywhere, just in a Snap!\", the latter even with YouTube thumbnail image. OpenPrinting OpenPrinting News - November 2022: I have also written about the Summit, especially my work on contributing to its organization, on creating the Snap tutorial workshop series, preparing the first 2 panel sessions I have hosted in my life, the build-a-plotter workshop (with photos), my 4 sessions, the hallway track, and the success of my lightning talk. Jonathan Esk-Riddell Ubuntu Summit 2022 Prague: The KDE-related sessions on the Ubuntu Summit (Jonathan is creator of the KDE Neon distro and former leader of Kubuntu). The Register Looking for a holiday DIY project? Build your own pen-plotter, for under $15: Liam Proven writes about Daniele Procida's workshop on building a pen plotter. No formal certifications? CUE the Ubuntu skills testing scheme: Liam Proven writes about Adrianna Frick's talk \"The Problem of 'Street Cred'\", the skills-testing and training scheme CUE, Canonical Ubuntu Essentials. OpenPrinting keeps old printers working – even on Windows: Liam Proven writes about my lightning talk. He met me on the hallway after my OpenPrinting panel session and told me about his intention to write this article and asked me some questions. Strong support for Snap and Ubuntu Core as Canonical meet IRL: Liam Proven writes about Oliver Grawert's talk about Snap and Ubuntu Core, \"An Ubuntu for a 10 ton steel press and your window shades: UbuntuCore at a glance.\" and about Snap in general. Deepak Patankar on LinkedIn Ubuntu Summit and Google Summer of Code: Deepak Patankar, former GSoC contributor and currently GSoC mentor for OpenPrinting, tells about the Ubuntu Summit and the opportunity to get contributor in GSoC 2023. The Summit was not only written about a lot but also talked about. Here are podcasts and videos I found about the Summit: TuxDigital: Destination Linux (Video Podcast) Celebrating 300 Episodes by Giving Thanks to Open Source: Brief discussion about Ubuntu Summit, Michael Tunnell’s talk \"Open Source Marketing Done RIght\", Mark Shuttleworth interview, Canonical contributions to OSS. Beginning of section \"Giving Thanks To Open Source Contributors\", ~11:00 min Linux Downtime (Podcast) Episode 60: Martin Wimpress talks about his exciting experience with the Flutter Track on the Ubuntu Summit and about his project Butterfly, an Ubuntu with an all-Flutter desktop. Right in the beginning, first section of the podcast. Late Night Linux (Podcast) Episode 203: Starting at minute 13:55 up to the very end of the episode, Graham Morrison (co-host at Late Night Linux and documentation manager for Snap/Core at Canonical) has interviewed Ken VanDine (leader Canonical Desktop Team) in-person in Prague, on the Sunday before the Summit. Ken talks about the importance of the Desktop, the sub-teams of the Desktop Team, Snap and its advantages, also for maintenance of Ubuntu, the Steam Snap, and that Canonical is hiring for the Desktop Team. Episode 204: Alan Pope (Popey) and Will Cooke (former leader of Canonical's Desktop Team) tell about my lightning talk about saving legacy printers under Windows with WSL and about OpenPrinting as an organization in general, what we are doing, GSoC, ... (8:50 min -> 11:50 min) 2.5 Admins (Podcast) Chaos Emerald Wealth: Jim Salter was on the Summit and starting at 14:00 min he is talking about the Summit, complaining about too much Snap (\"it is rather a Snap Summit than an Ubuntu Summit\"), but what he liked most were the hallway sessions (sorry, Jim). Ask Noah (Podcast) Ask Noah Show 312: Noah speaks about the Ubuntu Summit via Simon Quigley’s experience. Overall a very positive review (29:35 min -> 32:10 min). Mentioned as the very first item was my lightning talk about saving old printers under Windows with WSL (again), but they called this method OpenPrinting (which is not correct), after that the KDE session by KDE president Aleix Pol i Gonzalez, the hallway track, and the Ubuntu flavors panel got prominently mentioned. Ubuntu Portugal (Podcast) Ubuntu Summit 2022, o Rescaldo: (In Portuguese) This is all about the Ubuntu Summit, Prague, and the Summit itself. The authors Tiago Carrondo and Diogo Constantino, who were on the Summit presenting about Ubuntu PT and the Ubucon in Sintra, Portugal, liked most the talks from the Africans, and as many listed here, liked a lot my lightning talk about saving old printers under Windows and also me (“an exotic, entertaining, and very special person”) and complain about the printing stack of Windows (“the mess of Windows 3.0”) (34:40 min -> 38:00 min) and they liked Daniele Procida's build-a-plotter workshop. And playing Bomb Jack with Martin Wimpress. And especially important: The hallway track. Jardim das Borboletas: (In Portuguese) The title \"Jardim das Borboletas\", means \"Butterfly Garden\" and at minute 50:10 to the end Tiago Carrondo and Diogo Constantino talk about Martin Wimpress' Butterfly project, Ubuntu with an all-Flutter desktop. Earlier there is also talk about Nathan Haines' books. TechnikTechnik (Podcast) Schmetterlinge in Prag: (In German) Marius Quabeck (Nerdzoom.de) was invited to the Ubuntu Summit and reports about it, practically everything, the talks he has attended, the hallway sessions, people he met all over the event, the evening events, the report is really packed, as the Summit was (and nothing about saving old printers) ... The title of the podcast \"Schmetterlinge in Prag\" means \"Butterflies in Prague\" and it is because of Martin Wimpress' all-Flutter \"Butterfly\" Ubuntu flavor. Marius had a longer meeting with Wimpy and others about it. Great podcast! 1:09:42 min -> 1:31:18 These podcasts were all ABOUT the Summit, and here is one which was ON the Summit: Linux Lads (Podcast) Live from Ubuntu Summit: This podcast got produced live on the Summit. It is about how these podcasts get produced. With a lot of audience interaction, contains also some words of the masters of Ardour, Paul Davis and Robin Gareus, and the master of the Indabas, Heather Ellsworth. Special thanks to Mauro Gaspari for editing the audio recording done with the Ubuntu Summit infrastructure and making the whole session well audible. Now I have talked such a lot about podcasts here. would you like to listen to a podcast produced by me, or about OpenPrinting? Then listen to the audio of the following YouTube videos, close your eyes or put another window in front of your browser. The sessions are not originally designed to be podcasts but are all without slides and so also consumable audio-only: Your app everywhere, just in a Snap! OpenPrinting - Join the team to make printing just work! Ubuntu Community Office Hours - Summer of Printers And there are probably also some other panel sessions without slides on the Ubuntu Summit which you could listen to ... And at the end we have something to relax: A video of the closing party on the boat. Simply the impressions, no talking. In India the end-of-year exams at the universities/colleges are over and now, during their winter break, I am working with our contributors on the upstreamization of their work. To ease the acceptance of the pull/merge requests of the new code and also its acceptance by OS distributions I have released first beta versions of the libraries, libcupsfilters, libppd, cups-filters, and cpdb-libs (see below). Many of the contributors already have posted pull requests during the coding period: Mohit Verma, working on making the \"Add Printer\" part of the \"Printers\" module in the GNOME Control Center ready for the New Architecture, has submitted two merge requests: GNOME Issue report #1878: Allow to add new printers via Printer Applications cups-pk-helper PR #7: Added discovery of Printers via lpinfo, PAPPL and Printer Applications He is shortly before completing the work on them. Then only the UI/UX design team of GNOME needs to refine the user interface changes. There are further feature requests on the \"Printers\" module: #1877: Improve setting of IPP options #1879: Do not show setting of drivers for IPP printers #1911: Printers: Make adminurl available for IPP printers Shivam Mishra was working towards this part, but did not reach far enough. Mohit will carry on voluntarily here. Gaurav Guleria, working on the CPDB support for the GNOME and GTK print dialogs, has already done several changes on CPDB itself, especially support for human-readable option and choice names and improved support for media sizes and margins, leading it into its second generation, see the 2.0b1 release below. And he naturally submitted merge requests for his work on the print dialogs: Qt Merge Request #437301: Add CPDB support to Qt print dialog GTK Merge Request #4930: New CPDB print backend for GTK Print Dialog Sachin Thakan, working on optimizing the use of Avahi, has submitted a pull request for cups-filters, but before the splitting for the 2.x release. Now he needs to update it for the split repositories. cups-filters Pull Request #487: Driverless avahi optimization Chandresh Soni, working on the Braille embosser Printer Application, did not yet submit a pull request but is currently preparing it. It will get right into the new braille-printer-app repository. We are now releasing the first beta of the second generation of the Common Print Dialog Backends (CPDB). As part of making everything ready for the New Architecture of printing we have finally added CPDB support to the print dialogs of the major desktop environments/GUI toolkits, GNOME/GTK and KDE/Qt. This was done in Gaurav Guleria's GSoC project and in the course of his work on the print dialogs he also did a lot of improvements on the CPDB framework, mainly due to missing features but also to work well in a PPD-less world. The components we are currently maintaining got all updated and released as version 2.0b1: cpdb-libs: The central library package implementing both ends of the D-Bus interface (backend = server, frontend = client) and the APIs for frontends and backends. cpdb-backend-cups: The CUPS backend. It allows the print dialogs (frontends) to print with CUPS. It polls the list of available printers (queues) from CUPS and also the option/setting list for a selected printer, and it passes on jobs with option settings to CUPS. It uses the current APIs of libcups for that and does not interact with PPD files at all, so that porting the backend to CUPS 3.x will be easy. cpdb-backend-file: This backend allows the print dialogs to print into a file. As most print dialogs have already their own functionality for that, this backend will probably not be needed in production. We have it at least for sake of completeness, but it is also useful as code example for backend developers. After the last 1.x releases of the CPDB components, the following changes have been done: Added interfaces to get human-readable option and settings names Print attributes/options and their choices are usually defined in a machine-readable form which is more made for easy typing in a command line, not too long, no special characters, always in English and in a human-readable form for GUI (print dialogs), more verbose for easier understanding, with spaces and other special characters, translated, ... Older backends without human-readable strings can still be used. In such a case it is recommended that the dialog does either its own conversion or simply shows the machine-readable strings as a last mean. Added get_media_size() function to retrieve media dimensions for a given media option value Support for media sizes to have multiple margin variants (like standard and borderless) Support for configurable user and system-wide default printers Acquire printer details asynchronously (non blocking) Made cpdb-libs completely CUPS-neutral Removed CUPS-specific functions from the frontend library functions and the dependency on libcups, renamed CUPS-based function and signal names Debug logging now includes system error messages now The API and the organization of the source and header files got vastly changed with the transition to version 2.x (note that this makes the API incompatible with 1.x): Renamed all API functions, data types and constants To make sure that the resources of libcpdb and libcpdb-frontend do not conflict with the ones of any other library used by a frontend or backend created with CPDB, all functions, data types, and constants of CPDB got renamed to be unique to CPDB. Here we follow the rules of CUPS and cups-filters (to get unique rules for all libraries by OpenPrinting): API functions are in camelCase and with cpdb prefix, data types all-lowercase, with _ as word separator, and constants are all-uppercase, also with _ as word separator, and with CPDB_ prefix. All headers go to /usr/include/cpdb now Base API headers cpdb.h and cpdb-frontend.h, interface headers (and also part of the API) backend-interface.h and frontend-interface.h, and the convenience header files backend.h and frontend.h (include exactly the headers needed). Renamed and re-organized source files to make all more standards-conforming and naming more consistent. Bumped soname of the libraries to 2. The CUPS backend has also the followig functionality added: Added function to query for human readable names of options/choices With the added functionality of cpdb-libs to poll human-readable names for options/attributes and their choices this commit adds a simple function to provide human-readable strings for the user-settable printer IPP attributes of CUPS queues. Added support for common CUPS/cups-filters options Options like number-up, page-set, output-order, ... Available for all CUPS queues, not specific to particular printer. The new versions of the CPDB components: cpdb-libs: More Details and Download, Discussion cpdb-backend-cups: More Details and Download, Discussion cpdb-backend-file: More Details and Download, Discussion This is the first beta release of the upcoming pappl-retrofit 1.0.0. pappl-retrofit is a library to convert classic CUPS drivers, consisting of PPD files, CUPS filters, and sometimes also CUPS backends, into Printer Applications, the new format of printer drivers, mainly for CUPS 3.x which goes all-IPP and does not support the PPD/filter concept for printer drivers any more. Printer Applications are emulations of driverless IPP printers which on their other end pass on the jobs to the actual printer. pappl-retrofit uses PAPPL, a library for Printer Applications in general, as its base, and so it does not need to care of the general functionality of Printer Applications. So it only contains the code to adapt classic CUPS drivers and PPD files into the Printer Application framework. To support as many classic drivers as possible pappl-retrofit supports all kinds of PPD files, with and without specification of a CUPS filter, installable accessory settings, CUPS extension for custom option values, *.drv PPD compiler files, PPD-file-generating executables, CUPS filters, CUPS backends, side and back channels for filter/backend communication, pre-filtering from the driverless-IPP-standard input formats to the input formats of the driver filters. pappl-retrofit also comes with the Legacy Printer Application, which when it is classically (not as Snap or other container) installed sees all classically installed CUPS drivers on the system and maps them into its IPP printer emulation, so that CUPS 3.x can make use of all these drivers. This way the user does not loose their old printer drivers on the transition to CUPS 3.x, which is especially important for (often proprietary) drivers from printer manufacturers. As this library was developed along with the 4 retro-fitting Printer Applications for PostScript, Ghostscript, HPLIP, and Gutenprint as the base for them, it has grown with these applications and contains all functionality they need. It has also grown with PAPPL, getting support for PAPPL's newest features. So we are not releasing now because we completed a pre-planned feature list but rather to have releases of this package and the Printer Applications for their easier adoption into Linux distributions. With this we will also version the Printer Application Snaps in the Snap Store, so that when distributions adopt them as their default printer drivers, they can also better manage their customer support. Feature-wise we are even not 100% complete. We will still add ink level read-out from the printer (SNMP-based network printers, same as supported by CUPS) and internationalization, but this will not cause any compatibility-breaking API changes. More Details and Download GitHub Discussion Before the release, I switched to using the new papplLocGetDefaultMediaSizeName() function of PAPPL 1.3.0 to determine the default paper size (A4 or Letter) taking into account all Letter countries, which are many (commit). I also finally made the web interface displaying the actual human-readable strings of the PPD options for the vendor-specific options on the \"Printing Defaults\" pages (commit). This was already possible with PAPPL 1.2.x though, but there were a lot of other, more important things I had to do. And as with cups-filters and CPDB I renamed all functions to follow OpenPrinting policy, API function names starting with pr and name itself in CamelCase, library-internal function's names starting with _pr, constants PR_ and then all-uppercase underscore-separated. White-space/indentation clean-up, renamed the internal header files to ...-private.h and the API header file (former base.h) to pappl-retrofit.h. Michael Sweet has released PAPPL 1.3.0. It contains important features like string option support in the web interface, automatic A4/Letter default page size selection by location information, new job management, image printing, and a lot more ... It also made it into Phoronix! And here is the long list of new features and fixes: Added debug logging for device management. Added support for job hold and release (Issue #15) Added support for PNG image scaling using embedded resolution information (Issue #65) Added papplLocGetDefaultMediaSizeName function to get the default media size for the current country (Issue #167) Added support for localized banners at the top of printer and system web pages (Issue #183) Added timer APIs to manage periodic tasks (Issue #208) Added support for network configuration via callbacks (Issue #217) Added APIs to limit the maximum size of JPEG/PNG images (Issue #224) Added support for the Clang/GCC ThreadSanitizer with the --enable-tsanitizer configure option. Added Norwegian Bokmål, Polish, and Turkish localizations. Added a password visibility button to the Wi-Fi password field. Changed names of PAPPL-specific attributes to use \"smi55357\" prefix. Updated USB device code to generate a 1284 device ID and use the manufacturer and product strings when necessary (Issue #234) Updated the USB gadget code to handle disconnections. Updated PAPPL to conform to the new prototype PWG 5100.13 specification (Issue #216) Fixed a device race condition with job processing. Fixed a initialization timing issue with USB gadgets on newer Linux kernels. Fixed a potential memory underflow with USB device IDs. Fixed web interface support for vendor text options (Issue #142) Fixed a potential value overflow when reading SNMP OIDs (Issue #210) Fixed more CUPS 2.2.x compatibility issues (Issue #212) Fixed a 100% CPU usage bug when cleaning the job history (Issue #218) Fixed the default values of --with-papplstatedir and --with-papplsockdir to use the localstatedir value (Issue #219) Fixed storage of label offsets for printers that implement them. Fixed some thread access issues on ARM. Fixed when the kernel USB printer driver is unloaded on Linux (Issue #233) Fixed papplDevicePrintf to allow the \"%c\" character to be 0. More Details and Download GitHub Discussions I have updated all the Snaps to build and work with the new second-generation libcupsfilters, libppd, cups-filters, and pappl-retrofit. Setting build-environment: (environment variables for build process of a part) for the next part finding the libraries built by the previous parts, removing bogus *.la files (they contain paths of libraries where they get with a classic installation), distribution of the old cups-filters' dependencies and ./configure arguments to libcupsfilters and libppd. I also removed the unnecessary patches parts as one can access patches directly in the Snap's source repo via $SNAPCRAFT_PROJECT_DIR. Thanks to Sergio Cazzolato for giving me the hint when preparing the Daemon Snapper's Workshop) on the Ubuntu Summit. The updating of the Snaps to the new, split cups-filters packages has revealed some bugs, some caused by the splitting, and also some general bugs. I found some bugs in the filter functions: cfFilterGhostscript() does not use the page dimensions of the input pages if no page size information is supplied, cfFilterPDFToPDF() can produce output which Ghostscript turns into blank pages, cfTextToPDF() produces one blank page per input character if no page size information is supplied. Investigating these bugs it turned out that all are caused by missing page dimension information when no printer IPP attributes (PPD file if classic CUPS filter wrapper is used) are supplied. I fixed this by now accepting any specification of media size/properties given as options or job attributes when no printer attributes are given and defaulting to US Letter when not even any specification of the page size got found (main commit, commit, commit, commit). I have also added a NULL check to prevent the ppdFilterEmitJCL() function in libppd from crashing when no PPD file is supplied. The function adds JCL (PJL) commands to PDF print jobs when they are sent to a (non-driverless-IPP) PDF printer (commit). In all the components I did fixes on minor bugs found while preparing the release of pappl-retrofit and making all the Snaps (Printer Applications, CUPS) building with libcupsfilters, libppd, and cups-filters 2.0b1. I added foreign to AM_INIT_AUTOMAKE() in configure.ac to cope with README.md instead of README, removed the check for GLib in libcupsfilters, and did many fixes and improvements in README.md, CHANGES.md, and INSTALL. GitHub does not only have the issues and pull requests as a mean for users and contributors to communicate with the project's developers, but also a platform for open discussion, simply called \"Discussions\". Unfortunately, this functionality is not turned on by default when creating a new repository. So now I have activeted it for our more than 30 repositories and on new releases I have checked the box for doing the release announcements also in the appropriate GitHub discussions. I hope we will get more and easier communication by that. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|877688| |ipp-usb|ipp-usb|3300| |ps-printer-app|PostScript Printer Application|2742| |ghostscript-printer-app|Ghostscript Printer Application|2119| |hplip-printer-app|HPLIP Printer Application|6890| |gutenprint-printer-app|Gutenprint Printer Application|5379|"
+ },
+ {
+ "id": "post:OpenPrinting-News-December-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - December 2023",
+ "url": "/OpenPrinting-News-December-2023",
+ "headings": [
+ "New Architecture under Windows",
+ "From the Ubuntu Summit 2023 into YouTube and Podcasts",
+ "FOSDEM 2024",
+ "Google Summer of Code 2024",
+ "What is hot on the OpenPrinting mailing list"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/tL4DBSSdBHU/hqdefault.jpg",
+ "snippet": "Fax?!, New Architecture under Windows, from Ubuntu Summit 2023 into YouTube and Podcasts, FOSDEM 2024, GSoC 2024, Mailing list moving",
+ "content": "2023 is coming to an end and this is the last news post of this busy year. 8 conferences, an attempt to switch Ubuntu 23.10 to use the CUPS Snap, 4 GSoC contributors doing amazing work ... And it will all go on in 2024, not only Ubuntu 24.04 LTS, but also Ubuntu Core Desktop as the first distribution where the CUPS Snap is used for printing by default. And after that, if we get good desktop integration (print dialogs with CPDB, printer setup tools) of the New Architecture covering all Ubuntu flavors, I will aim for a switchover to the CUPS Snap in classically installed Ubuntu again ... Also next year we will have the releases of CUPS 2.5.x of which I will be the release manager. CUPS 2.5.x is mainly to introduce OAuth2 support into CUPS 2.x, to not require the much more impactful switchover to CUPS 3.x only to get OAuth2 support for printing. The components of CUPS 3.x are about to be released throughout the year 2024, starting with libcups3 end-January and then later on at first the local CUPS server and finally the sharing server, allowing the switchover to CUPS 3.x from Ubuntu 25.04 on, but requiring the same desktop integration as needed for the CUPS Snap, to not make the flavors angry again ... The libcups3 release end of January is also important to allow the release of PAPPL 2.0 with Akarshan Kapoor's scanning support end-February in time for Ubuntu Core Desktop. Google is rolling out the 20th Google Summer of Code in 2024 and for us it will be all about desktop integration, both for the New Architecture and also for OAuth2 use in printing. I am also eager to know how the Mentor Summit will look like then. But also under Windows a new printing architecture is on the way, also all-IPP, driverless-only printing ... aiming mainly for improved security, very similar to our New Architecture. They call it Windows Protected Print. And while we are all going into the New Architecture, we still have some stone-aged technology in use, at least in some countries, and that is Fax, a way to transmit documents through analog phone lines. Often preferred by authorities for privacy reasons it is probably much easier to intercept than any modern, encrypted communication on the internet. But the security issue shown here is not about spying on your faxes, but making use of that nowadays faxes are usually recived by multi-function printer/scanner devices. Sending forged faxes could gain access the computers in the recipient's local network. See this amazing talk from the Chaos Communication Congress 2018 (35C3) detailing how this works! So now send your Christmas faxes to your loved ones and happy holidays! And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Please also note that our mailing list is moving. Last month I was citing Michael Tunnell from TuxDigital: There is no such thing like a pain-free experience of printing under Windows ... Linux printing is ridiculously good ... and on every conference where I am I get a lot of kudos, ...: Printing under Linux works much better than under Windows or macOS Did the people at Microsoft hear this? Or did they just read/hear Michael Sweet's and my talking about the New Architecture in the last few years and now they want to have the New Architecture themselves. Microsoft is introducing a new printing architecture for Windows, with mainly security in mind, called Windows Protected Print and like our New Architecture with CUPS it going all-IPP only supporting driverless IPP printers and not classic printer drivers any more. By the way, I have participated in the blog article's discussion. They do away with their classic printer drivers because they run with system (highest) privileges, like the print spooler itself and many come from third parties. This makes fixing security vulnerabilities especially challanging, and even worse if there are decade-old drivers installed for which the issuing printer manufacturer has already ceased support. Microsoft did not present any concept to support non-drierless legacy printers, considering all these printers obsolete. But in reality, at least the ones for which there are drivers under Linux can be continued to be used, thanks to WSL and Printer Applications. Here is how to do this. Windows Protected Print can already be tested, in the Insider Preview of Windows 11, as described on How-To Geek and also by Microsoft itself. Note that Print Support Apps (PSA) under Windows are not the same as Printer Applications under Linux. The latter are emulations of driverless IPP printers serving as printer drivers under Linux and the former are printer-specific software extensions for driverless printers under Windows, which is printer-model-specific software again, defeating the driverless model ... The Ubuntu Summit 2023 in Riga was not only successful due to the talks and hallway sessions but also in terms of YouTube videos and podcasts with me. So together with the two recordings from the Engineering Sprint in Riga which I already mentioned last month you have even more nice alternatives to boring holiday TV programs. In less than 2 weeks 4 new videos/shows got released: Ubuntu Summit recordings The recording of my third Snap workshop has been published on Ubuntu OnAir on December 13: Improving Snap maintenance: Automating tag updates on new upstream releases of the app - Interactive workshop Ask Noah podcast Noah J. Chelliah met me on the hallway and asked me for an interview for his \"Ask Noah\" podcast. So we immediately went to an unused conference room for a \"Noah asks\" and we recorded the interview, me telling him about OpenPrinting, how it started and what were the problems we have solved with it. The interview is part of episode 368, released on Tuesday, December 19. It starts at 47:17 min. Destination Linux When leaving the closing plenary, Michael Tunnell from TuxDigital and one of the hosts of Destination Linux grabbed me in the crowd leaving the plenary room and invited me for an interview for a Destination Linux episode. The interview got onto the road as episode 351, \"These guys made Linux printing great\", on Monday, December 18. The show is available both as video and as podcast. This episode is something special in several points: First, being invited to talk about OpenPrinting I have invited Mike Sweet, author of CUPS and creator of driverless IPP printing, into the show in addition, like in the Indaba 2 years ago. Second, the interview with Mike and me got 1:20 hours long, nearly as a full movie and so this episode is appropriately long and dedicated to the interview! Third, Monica Ayhens-Madon has bought a little penguin in Riga, a gift for co-host Jill (see last month), and taken photos with it and several important people on the conference, including me (Mastodon), so I have asked Michael to make my episode the first where Jill has received the penguin and put me into the scene where she presents it. So this episode consists of the \"Community Feedback\" section where Jill & Till present the penguin and of the interview, nothing more, nothing less. The Destination Linux team is eager to attend the Ubuntu Summit 2024. I suggested them to produce an episode there. Linux Saloon Also after the Summit I continued following the Ubuntu Summit channel on Telegram, and suddenly, on Saturday, December 9, Nathan Wolf, @CubicleNate on Telegram and other platforms, and host of the Linux Saloon live show series, announced his episode about Snap inviting people to participate live in the show, something like 2 hours before the show started. So I thought it would be great to have a Snap expert on the show and I joined, ending up with it being mainly a near 2-hour-long interview with me, about OpenPrinting, Snap, and Ubuntu Core Desktop, and especially how I got into Snap and how I got the Snap enthusiast of today. The production of the Destination Linux episode got scheduled on Sunday, Dec 10, after Jill's penguin has arrived and Mike Sweet having time to join, and the Linux Saloon happened to be the Saturday before, so I have produced 2 practically movie-length shows on one weekend. And if you also want to see many more people doing great things with free software, on the Ubuntu Summit Advent Calendar nearly all the doors are open now, only a few sessions are still missing. Find the recordings of the individual sessions in all rooms on the Ubuntu Summit 2023 playlist on Ubuntu OnAir. I have also updated my Ubuntu Summit report from last month with links to all videos and shows which got released. Complete playlist of all sesions Mastodon: #UbuntuSummit, #UbuntuSummit2023 FOSDEM is coming closer, my flights to Brussels are booked, on Telegram we are already talking a lot about who attends and that we will all meet there, several of the DevRoom organizers have already selected the talks. On the Schedules page follow the links to the schedules of each room, full schedules for each day, in which room is which track, ... Of my 6 proposals which I have submitted one is accepted now, 2 are rejected and 3 still pending. The 2 rejected ones are the report about the Opportunity Open Source conference which I have organized in India, as full-size talk for the Community DevRoom and my workshop about packaging applications as Snaps (snapping) in the Distributions DevRoom. There was a really high amount of propoals submitted for these rooms, 89 for Community! And each DevRoom takes place on only one single day. My proposal \"Desktop Linux, as easy as a smartphone! Just in a Snap!\", about Snap, Ubuntu Core, and Ubuntu Core Desktop, in the Distributions DevRoom got accepted, but only as a short 25-min talk, instead of the originally proposed 55 min. It got scheduled for Sunday, Feb 4, 13:30 - 13:55. Not having gotten the Ubuntu/Canonical booth accepted we have this way at least one representation of Snap and Ubuntu Core Desktop on the conference. I and some colleagues will also demo Ubuntu Core Desktop in the DevRoom and in the hallways. The other 3 proposals, 2 lightning talks, about the Opportunity Open Source and about saving legacy printers under Windows with WSL and Printer Applications, and the full-size talk about OpenPrinting (in the main track) are still pending. OpenPrinting will get represented well on FOSDEM, in addition to me Zdenek Dohnal from Red Hat will also attend, and if my talk \"OpenPrinting - We make printing just work!\" will get accepted, he will be my co-speaker. And with the lightning talk about saving old printers we can have two OpenPrinting talks on the confernce. And, to follow the newest development, I will mention Microsoft's new Windows Protected Print in both talks, in the main OpenPrinting talk as a possible answer of Microsoft to the CUPS-based all-IPP printing on the other operating systems and in the lightning talk telling that Microsoft has completely given up on legacy printers and WSL will be the only solution to save them. The proposals are already appropriately updated. Last but not least, several people from Red Hat's office in Brno will attend FOSDEM, and some of them fly from Vienna Airport to Brussels, so I can have some inflight sessions ... (Brussels Airlines SN2902 VIE - BRU 9:15am - 11:00am, on Fri, Feb 2, if you want to join ...) The preparations for our participation at the 20th GSoC have started. We have already our first contributor candidates learning about OpenPrinting and doing assignments. There will be a lot of interesting projects again, like: Desktop integration: CPDB support for the print dialogs of Mozilla (Thunderbird/Firefox) and LibreOffice Desktop Integration: Update system-config-printer for the New Architecture of printing Desktop Integration: User interfaces for using OAuth2 with printers and scanners Replace QPDF by PDFio as PDF manipulation library in libcupsfilters (cfFilterPDFToPDF() filter function and others) CPDB backend for IPP infrastructure/cloud printers Turn cups-browsed into a Printer Application Printer Application for Braille embossers Note that for general acceptance of CUPS 3.x and of the CUPS Snap we need to have a desktop integration for all desktops, not only for GNOME. Suggestions for any further project ideas are more than welcome. And if you like to be a GSoC contributor next year, please contact me (till AT linux DOT com). Current interesting discussions Update: Links updated to point into the new archive We had some interesting discussions in the last weeks. See the mailing list archives. The following links are to the initial posting of each thread: PDFio: Replace QPDF by PDFio in libcupsfilters as GSoC project?: Should we replace the C++ PDF manipulation library QPDF by the standard-C PDFio written by Mike Sweet? RFC: Pantum M7300FDW and similar: Alexander Pevzner has discovered a firmware bug in Pantum printers which breaks their driverless IPP printing support. Should one implement a workaround here? github.com/OpenPrinting/goipp 1.1.0 and ipp-usb 0.9.24 announce: Alexander Pevzner resumes development of our IPP-over-USB implementation ipp-usb and goipp If you want to participate and you are not subscribed, please subscribe after the migration. Mailing list moving Update: The move has been completed: e-mail: printing-architecture AT lists DOT linux DOT dev Archive: https://lore.kernel.org/printing-architecture/ Subscribing/Unsubscribing instructions The OpenPrinting mailing list, printing-architecture AT lists.linuxfoundation DOT org, is getting moved to a new system. The old e-mail address stays working and all subscribers and also the list archives are automatically migrated to the new list. See the announcement from Konstantin Ryabitsev, Linux Foundation:"
+ },
+ {
+ "id": "post:OpenPrinting-News-February-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - February 2020",
+ "url": "/OpenPrinting-News-February-2020",
+ "headings": [
+ "We will be presenting on the Linux Foundation Member Summit 2020!",
+ "Google Summer of Code 2020",
+ "Avahi local service support",
+ "New projects on the OpenPrinting GitHub",
+ "ipp-usb",
+ "goipp",
+ "printer-application-framework",
+ "pyppd",
+ "Driverless scanning",
+ "Printing Stack Snap",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "OpenPrinting on LF Member Summit 2020, GSoC 2020 preliminary mentors, Avahi localhost support finally accepted, projects moved to OpenPrinting GitHub, driverless scanning, cups-filters 1.27.1 released, IPP-over-USB improvements",
+ "content": "The talk proposal by Aveek Basu and me, \"Revitalizing an Open Source Community - Nurturing the New Contributors to Carry on the Baton\" got accepted for the Linux Foundation Member Summit 2020, Lake Tahoe, California. It will get presented on Wednesday, March 11, 2020, 11:50am local time. Abstract: As a matter of fact, there are many technologies and Open Source software that the world uses daily without valuing the need for the same. As a result, contributors feel it to be less lucrative to work on these projects since these are very less talked about topics. One such classic example is printing. Even though we know that however digitized we may be, we can not live without printing but on the technological front there are very few contributors in this space. This session is to talk about how we can nurture potential candidates when they are in their schools, train and develop them to make them efficient contributors for carrying the baton forward. Open Source is not only about great technical contributions. Leadership and people management is also an important aspect to make and bond a community together. Forming and building the community is very essential for the long term sustainability of an Open Source Organisation. The application period for mentoring organizations has ended on Feb 5 and we are now waiting for whether the Linux Foundation will get accepted as mentoring organization. The publication of the accepted organizations will occur on Feb 20. Now we also have preliminarily lined up the mentors for our projects. See the updated project ideas list. We could find 9 mentors for now. Some of them are former GSoC students. We continue looking for students for this yaer and some are already working on assignments. Several assignments got already solved by the students, reducing the number of issues of cups-filters by 6. Alexander Pevzner, author of the Go-based ippusbxd alternative ipp-usb and the \"airscan\" eSCL SANE backend, reached out to Trent Lloyd in an e-mail thread about Debian packaging of his work and Trent answered that he will sort it and do a new release of Avahi before Feature Freeze of Ubuntu 20.04 (this would be Feb 27). Update: Finally, Trent has merged the patch! Due to the importance for the free software printing stack and for the future directions of development 4 new projects got added to OpenPrinting: This is a Go-based alternative for ippusbxd from Alexander Pevzner, who I discovered through his \"airscan\" eSCL SANE backend and when discussing the support of these scanners via IPP-over-USB with him he started this great project, a better, more reliable implementation of the IPP-over-USB standard in Go. The ippusbxd project will get continued though as not all OS distributions accept Go projects. This is an implementation of IPP in Go, needed for ipp-usb. The future of printer drivers is supplying them as Printer Applications, running CUPS in a Snap even requires this, and Ubuntu is also on the way to have all the printer drivers packageed as Snaps. This project provides the base for snapping legacy printer drivers consisting of filters and PPDs. pyppd was created as a GSoC project many years ago with the intention to make the thousands of PPD files included in a Linux distribution as compact as possible, as uncompressed the made up a substantial part of the size of a typical Linux distribution. PPDs get xz-compressed in a self-extracting archive from which CUPS can automatically list them and grab the desired PPDs as needed. Nowadays in the age of Printer Application this project gets useful again, to make the Snaps for legacy drivers with thousands of PPDs (Foomatic, PostScript, ...) as compact as possible. I have followed the work of Alexander Pevzner (\"airscan\" eSCL SANE backend) and Thierry Hucahrd (maintainer of Nathan Touboul's \"escl\" eSCL SANE backend), tested a lot on my HP OfficeJet Pro 8730, reported bugs, ... and so the backends got reliably working (personally I use \"airscan\" now and not HPLIP any more). \"escl\" made it into SANE 1.0.29 and so eSCL scanning support will get readily available in the Linux distributions soon, making the scanners in most modern multi-function printers work out-of-the-box. I have prepared SANE 1.0.29 packages for Debian and Ubuntu. They only need to get uploaded by persons with appropriate rights. For \"airscan\" there is also a request for inclusion into upstream SANE. I hope this will stop people from messing around with HPLIP in Linux distributions. Aakash Lahoti, 2019 GSoC student on \"ipptool test suite for IPP System Service\", wants to do the IPP Scan implementation in this year's GSoC. I have given him an introduction on how to do this work and re-using the code of the new SANE eSCL backends and of AirSANE, an eSCL scanner emulation for any SANE-supported scanner. There is still no new release but the work on it is going on (on the GitHub repository). Here is what got done since the last News post: cups-filters 1.27.0: cups-browsed working reliably with CUPS on non-631 port CUPS: Added AirPrint server functionality (patch of the Debian package) Fixed password authentication for administrative tasks Added shutdown and reload scripts for the daemons Do not re-create the configuration files on every start, this way allow user configurability Do not use Python script during startup Fixed Ghostscript's font access Started re-organization of the directories The snap is working well now, including the integrated cups-browsed. Note that when running CUPS in a snap one cannot add classic drivers consisting of filters and PPDs. Drivers can only get added in the form of Printer Applications. Creating Printer Applications of the legacy drivers is on the way. No further releases. No commits on the CUPS GitHub since Dec 18, 2019. CUPS is mangling IPP attribute names when generating them from PPD names, breaking some functionality, like input tray selection. I have reported a bug on this. The patch already got into the Debian package of CUPS and will get synced into the Ubuntu package in the next days. Currently released is 1.27.1. 1.27.1: Bug fix release: All filters support zero-page jobs now, option and choice names in PPDs are changed to work around a bug in CUPS when generating IPP attributes, cups-browsed creates queues for all emote IPP printers by default, and several smaller fixes in the filters 1.27.0: In this release cups-browsed does not need to know the port number of the CUPS daemon it is attached to any more when it connects via domain socket and many additional filters support zero-page jobs now Alexander Pevzner, author of the \"airscan\" eSCL SANE backend, has continued on his ipp-usb project and all seem to work perfectly now with it: DNS-SD advertising of the printer part, scanner part, and web admin interface with data actually polled from the device via HTTP and IPP (not hard-coded records) and the USB communication, also with high-resolution scans and the web interface correctly working with both Chromium and Firefox. He also created a Debian package of ipp-usb, with automatic starting and stopping of the daemon via UDEV and systemd. Thierry Hucahrd, maintainer of the other eSCL SANE backend, \"escl\", dedicated himself to improving the classic ippusbxd: He especially fixed the DNS-SD advertising of the device, to not be a mainly hard-coded but also USB-device-ID-based record for the printer part but now being records for both printer and scanner part generated by polling the device via HTTP and IPP. The version 1.34 containing these improvements will get released soon."
+ },
+ {
+ "id": "post:OpenPrinting-News-February-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - February 2021",
+ "url": "/OpenPrinting-News-February-2021",
+ "headings": [
+ "Google Summer of Code 2021",
+ "IPP Scan in PAPPL",
+ "PostScript Printer Application",
+ "CUPS Driver Retro-fit library",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "PostScript Printer Application, Driver retro-fit library, GSoC 2021 project ideas, IPP Scan, CUPS 2.3.3op2",
+ "content": "The time window for the mentoring organizations to apply has opened and the deadline is Feb 19, 2021 (Timeline). We are applying again for the Linux Foundation as mentoring organization, as in the previous years, OpenPrinting being one of the sub groups. OpenPrinting's project ideas are posted, but further ideas are still welcome. Note that the projects are half-length this year, 175 hours instead of 350 hours (see our October news. Larger projects we should run in the under the Linux Foundation Mentoring Program instead of GSoC. The students of our IPP Scan LFMP project did not do all points needed to complete the IPP Scan server support, but are still working on the missing points. Michael Sweet posted on the PAPPL GitHub what is still needs to be done. The PostScript Printer Application got complete as far as it is possible with the current state of PAPPL. The PostScript Printer Application got also tested running in a Snap package. The new features added after the January news post are: User PPD file upload When auto-selecting the driver (model) we prefer user-added PPDs (the user added them because he wants to use them) now and also prefer English PPDs if there are several languages available. For manual selection clearly we mark the user-added PPD files in the driver list with \"USER-ADDED\". Added a \"Refresh\" button to update the driver list after manually (not via the Printer Applications web interface) copying PPDs into the user PPD directory. The results of a PPD upload are now displayed. Errors, warnings, successful uploads, ... We issue a warning for PPDs with *cupsFilter(2): ... lines as they are potentially non-PostScript PPDs (CUPS drivers). We do not reject them as sometimes PostScript PPDs also use a CUPS filter, often only for a few non-essential options. All user-added PPD files are displayed in a list now, with checkboxes for deleting them. So the user can easily manage the extra PPDs he is using. Options in the PPD files which do not have PostScript or PJL code snippets for their choices are ignored now, as without code being inserted into the job data these options have no effect to the job. Such options usually appear in PPDs with a *cupsFilter(2): ... and the filter does the needed (usually more complex) modifications in the job data stream. If the PageSize option does not provide code to insert in the job data stream we reject the PPD, as the PageSize option is the only absolutely required option in a PPD file. Running the PostScript Printer Application in a Snap The state file path can be supplied via environment variable now, so in the Snap a suitable path can easily be used. The Snap auto-starts the server now. Set TMPDIR environment variable so that the filter functions used by the Printer Application work correctly in the Snap. The code is tested and some fixes in the Snap packaging done so that it correctly runs as root in the Snap and clients can access it correctly, especially one can print with CUPS now. Important bug fix The Printer Application was not able to load state files of more than 4096 bytes and we assumed that this was a PAPPL bug, but in fact the state got already save again before loading it was completed. This is fixed now. Also several further bug fixes got done. With appropriate features added to PAPPL we will be able to also add the following: Make the Printer Application set up USB printers automatically when they get connected (needs support in PAPPL. Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. I will soon put it into the Snap Store. As other retro-fitting Printer Applications also use most of what we have in the PostScript Printer Application now (as PPDs are used) I will create a new library for retro-fitting printer drivers into PAPPL-based Printer Applications (perhaps called libpappl-retrofit?). I will then move functions of the PostScript Printer Application which are useful also in other driver-retro-fitting Printer Applications into the new library, here I am especially thinking about PPD-file-related functions and PostScript-related functions. The idea of renaming the \"ps-printer-app\" project into \"retro-fit-printer-app\" and adding conditional compiling I have dropped now. Currently released is 2.3.3op2. This release contains a security fix and several other bug fixes. It made it already into Debian. Currently released is 1.28.7. On the way towards 2.0.0 and driven by the further development of the PostScript Printer Application I have added the following new features: libcupsfilters: When normalizing printer model name replace '+' by \"plus\" (the + sign appears often in printer model names but gets dropped in IPP-style strings) libppd: In the ppdPwgUnppdizeName() function support negative numbers (straight conversion to IPP style drops the negative sign). I have also posted several GSoC 2021 project ideas for cups-filters 2.x. Bug fix, applied to both 1.x and 2.x: In the PPD generator for setting up driverless IPP printers with CUPS prefer Apple Raster instead of PDF due to compatibility problems with some printers. This time it really works as a cost value oversight is fixed now. Currently released is 1.0.1. PAPPL development has continued, approaching 1.0.2, mainly bug fixes this time. See also the currently open and closed issues of PAPPL. Michael Sweet posted on the PAPPL GitHub what still needs to be done for IPP Scan support in PAPPL. PAPPL 1.0.1 is in Debian Unstable now and got auto-synced into Ubuntu Hirsute (upcoming 21.04)."
+ },
+ {
+ "id": "post:OpenPrinting-News-February-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - February 2022",
+ "url": "/OpenPrinting-News-February-2022",
+ "headings": [
+ "Google Summer of Code 2022",
+ "GUI: Printer setup tool and Print dialog - Essential for user experience",
+ "Printer Setup Tool",
+ "The Print Dialogs",
+ "CUPS Snap and snapd printing interface",
+ "Approaching cups-filters 2.0",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/5KogjLb1Hb4/hqdefault.jpg",
+ "snippet": "GSoC 2022 projects posted, printer setup tool and print dialog, CUPS Snap integration, approaching cups-filters 2.x, CUPS 2.4.1",
+ "content": "We have posted everything you need to know for participating and our project ideas: GUI for discovering non-driverless printers and finding suitable Printer Applications for them Scanning support in PAPPL Converting Braille embosser support into a Printer Application cups-filters: In filter functions call Ghostscript via libgs and not as external executable cups-filters: Add Avahi calls for discovering and resolving driverless IPP printers to API and optimize the processes cups-filters: Create OCR filter to deliver scans as searchable PDFs Turn the scp-dbus-service methods - GetBestDrivers and MissingExecutables - of system-config-printer into C We also have already submitted the organization application for the Linux Foundation. The organizations accepted by Google will get announced on March 6, 2022. Here is the full timeline for GSoC 2022. We continue looking for contributor candidates and as part of our community onboarding program we have assigned GitHub issues, mainly of cups-filters to them. Several are investigating the issues and working on fixes and so helping us towards the cups-filters 2.0 release. The New Architecture of printing needs GUI work, printer setup tools handle IPP services and install Printer Applications for non-driverless printers, and print dialogs should support CUPS' temporary print queues and should not directly handle PPDs of print queues any more. We cannot switch a Linux distribution over to the New Architecture, using the CUPS Snap as its printing infrastructure and removing all classic driver packages from it, but stay with the classic GUI tools doing their work based on static CUPS queues and PPD files. So work on the GUI is required to switch over without losing the good user experience. Here is an overview of what we already have and what we still need. First, we need a new printer setup tool. The existing ones, the printing part of GNOME Control Center and also system-config-printer, are based on static CUPS queues with PPD files. We need a tool to manage the available IPP services (CUPS auto-creates queues for each of them) and to find non-driverless printers so that we can install Printer Applications for them (and not install static CUPS queues with PPDs). So the main window (GNOME-Control-Center page) shows a list of IPP services with a list of print, scan, and fax services within them, buttons for opening their web config interfaces and also their IPP System Service config/status panels. The “Add Printer” part searches for non-driverless printers on USB and on the network, checks for suitable, already installed Printer Applications, queries the OpenPrinting web server for suitable Printer Applications available from the Snap Store. Buttons to install Printer Applications and to setup printers withing Printer Applications should be available. Work needed There are already implementations from GSoC 2020 and 2021 for the main window/panel with the list of IPP services and the IPP System Service config/status panel, all written with G-C-C in mind. They probably need only small adaptations and optimizations. Main work item will be the “Add Printer” part. Another important piece of work is to integrate the 3 with each other and to get them upstream into GNOME Control Center. UI design work is needed for the “Add Printer” part and perhaps on improving and optimizing the UI for the other parts for integration in GNOME Control Center. Links See below the links to the OpenPrinting Micro-Conference on the Linux Plumbers Conference 2021, especially the presentation about the Print Management GUI, which shows more in-depth how the new printer setup tool should look like. Also see the links to OpenPrinting discussion, GSoC 2020/2021 projects, and Frederik Feichtmeier’s Flutter counerpart to G-C-C. OpenPrinting Micro-Conference on the Linux Plumbers Conference 2021 Session about printer setup tool on Linux Plumbers Conference 2021 Session about print dialog on Linux Plumbers Conference 2021 Recording of the OpenPrinting Micro-Conference on Linux Plumbers Conference 2021 First thoughts and discussions on a printer setup tool for the New Architecture IPP System Service config/status panel (GSoC 2020) Main window/panel to list and manage IPP services (GSoC 2021) GNOME-Control-Center fork with new printer setup tool (at least main panel) Flutter alternative to GNOME-Control-Center, printer part is planned to be done following the New Architecture Service on OpenPrinting web server for finding the correct Printer Application for a given, non-driverless printer Most print jobs are sent via the print dialog of a desktop application, like evince, Chrome, LibreOffice, DarkTable, … Print dialogs are usually, like “Open …” or “Save as …” dialogs, provided by the GUI toolkits, in most cases GTK or Qt, sometimes applications come also with their own creations, like LibreOffice or Chrome. Problem here is usually not the design of the dialog itself, most are actually easy to use (except Qt’s which is really not cute, seems to be untouched for near 2 decades), but the way how they connect to CUPS (and also to other print technologies) and how well this connection code is maintained and kept up-to-date. GUI toolkit projects are large projects, often with long release cycles and all with a certain inertia, and there are things which many people are eager to work on, and others, like print dialogs, which have to be there but no one is really motivated to push their development forward and do the needed maintenance work. An important part of the maintenance of a GUI toolkit is that it interfaces well and correctly with the underlying operating system, graphics, sound, storage, …, and printing! The OS is under continuous development, things are changing all the time, components get replaced by others, printing is CUPS for 22 years, but within CUPS we have also changes, and they need to be taken care of in the print dialogs. Several years back, CUPS started to create temporary queues for driverless IPP network printers (or remote CUPS printers, which are emulations of IPP printers), which are only physically available when they are accessed (capabilities are polled or job printed). Print dialogs used an old API which did not support this, the temporary queues did not appear in the dialog, a helper daemon, cups-browsed had to convert the temporary queues into physical queues as a workaround. The correct solution had been to change the print dialogs to a newer CUPS API which supports these queues, but no one at the GUI toolkit projects has felt reponsible and taken the time for this update for many years. Only recently this got fixed. This made me introducing the Common Print Dialog Backends (CPDB), a de-coupling of the print technology (CUPS, print-to-file, back in 2017 also Google Cloud Print) from the GUI. The GUI projects have to adopt the CPDB support only once and then OpenPrinting (or any upcoming cloud printing projects) takes care of the CPDB backend for the print technologies to be up-to-date with any changes. This way print technology projects can react quickly and are not dependent any more on the GUI toolkit’s inertia. As far as I know the GTK, Qt, and LibreOffice print dialogs support temporary print queues now (but only recently, there are many old dialog versions around), but now we are at the next challenge as we have to assure that the print dialogs use CUPS APIs which do not handle PPDs on the dialog side, so that if the system switched to PPD-less CUPS 3.x that the dialog continues to work. If we get the dialogs using CPDB, these changes happen (if actually needed) only in the CUPS CPDB backend, not in each print dialog individually. Work needed What we need here is to get CPDB into the print dialogs upstream, the UI of them does not need to be changed (perhaps the one of Qt’s dialog). Dialogs to be treated are GTK, Qt, (LibreOffice has already CPDB support AFAIR), Chrome, and perhaps others. Also important are backports, as there are many apps based on old toolkit versions around in the distributions (Firefox? Thunderbird?). For the CPDB integration we do not need UI design work, only perhaps to improve the Qt print dialog. Links The original Common Print Dialog Backends GSoC project, back in 2017 Some coding work towards a Qt dialog OpenPrinting project of the CPDB libraries CPDB support work added to GTK Some coding work towards a Qt dialog Red Hat bug report about the lack of temporary CUPS queue support in the GTK print dialog CUPS Snap in the Snap Store The \"cups\" interface with its security concept got finally merged into snapd now! With this the most important part for allowing easy, fully automatic Snap Store upload of applications which print is done. Now only some smaller steps need to get done, which are tracked and discussed in this snapcraft.io thread which I have started. What is still needed is this: snapd 2.55 release: The new snapd with the included cups interface needs to get released to the stable channel of the Snap Store. This will happen in 2-3 weeks from now. Snap Store permissions: Request permissions from the Snap Store team for the CUPS Snap to use the cups-socket-directory attribute and for auto-connection of any Snap’s cups plug to the cups slot of the CUPS Snap. I have already posted the request on the snapcraft.io forum. /var/snap in base Snaps: Ian Johnson will post PRs on the base Snaps to create the /var/snap directory. Ian Johnson: There are some other PR’s I will file to the base snaps which will behind the scenes make using the cups interface more efficient, but that will not change how it is used at all (it will just change the mount namespace setup by creating the /var/cups directory there so we do not have to do lots of mount tricks) CUPS Snap auto-installation: When an application Snap plugging cups gets installed from the Snap Store and the CUPS Snap is not installed (or a too old version), the CUPS Snap gets automatically installed in addition to the application Snap, like a package dependency. Ian Johnson plans to adapt the default-provider setting to also work for the cups interface here: We have to either manually enable this using a transitional placeholder content interface or adapt the default-provider setting to also work for the cups interface. I plan on doing the latter at some point soon so I do not think that the former needs to be implemented. Changes in CUPS Snap: The CUPS Snap needs to have the correct cups slot definition with the “cups-socket-directory: $SNAP_COMMON/run” line added and also in the beginning of the snapcraft.yaml a line “assumes: [snapd2.55]” added as then the Snap will not work with older snapd versions any more. This I only will do when snapd 2.55 gets actually released to the stable channel, to make sure that the CUPS Snap can always be downloaded and used. When all these steps are done, the snapper of an application which prints (but does not do CUPS management) only needs to let the application(s) in the Snap plug the cups interface (in snapcraft.yaml in the apps: section add cups to the plugs: list of the appropriate application) and submit to the Snap Store, nothing more. Who has already used the cups-control interface, can simply search-and-replace cups-control by cups in his snapcraft.yaml. When a user installs this application Snap, first it is checked whether the CUPS Snap is installed and if not, it gets installed, after that the application's cups plug gets auto-connected to the CUPS Snap's cups slot. Also the CUPS Snap's CUPS domain socket gets mounted from the CUPS Snap's sandbox into the application Snap's sandbox, and the application gets pointed to it by the CUPS_SERVER environment variable bein auto-set. This way all printing-related requests of the application always got to the CUPS Snap. Now, if the user has the usual, classic CUPS installation (DEB, RPM, ...), with print queues, using classic drivers, perhaps even proprietary, ..., this is now problem, as the CUPS Snap goes into proxy mode and replicates the user's print queues (by passing the jobs through to the classic CUPS). This way application's attempts to do administrative operations are blocked by the CUPS Snap. The classic CUPS does not need to have the new functionality to block administrative requests from Snaps (Snap mediation). If the user has no CUPS classically installed, the CUPS Snap goes into stand-alone mode and so it will be the user's print environment. He can print on driverles IPP printers right away (as users of classic CUPS installations can naturally do, too) and for printers which need drivers he has to install Printer Applications. And this way of blocking administrative requests on CUPS coming from the application Snaps plugging cups (NOT cups-control) is our security concept which allows us to let the cups` interface get auto-connected and so applications which print can be easily uploaded into the Snap Store, without needing to ask for any manual permission. Thanks to Ian Johnson, James Henstridge, Samuele Pedroni, Alex Murray, Alberto Mardegan, and Michael Sweet for all their work on this. For the Snap itself, the included QPDF got updated to version 10.5.0. Main TODOs are: Complete the cups interface in snapd (we are close now). Testing Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap Currently, I am continuing the testing, bug-fixing, cleaning-up, polishing, ... to prepare the release of cups-filters 2.0. Unfortunately, there is not enough time left to get it released before Feature Freeze of Ubuntu 22.04 LTS (Jammy Jellyfish) on February 24. Therefore I have backported many of my fixes into the 1.x branch and will do another release in it in the next days. In the last weeks I have especially tested filter chains for PPD files auto-generated by cups-filters for driverless printers (driverless utility and cups-browsed). These PPD files do not use pseudo-PostScript code to set the desired color space and depth in their \"ColorModel\" option any more, but instead, copies of the printer IPP attributes telling about supported color spaces and depths for Apple Raster and PWG Raster. This made the ppdRasterInterpretPPD() ceasing to work and I had to replace it with the cupsRasterPrepareHeader() function in the imagetoraster(), mupdftoraster(), and pdftoraster() filter functions. ghostscript() was already switched over. I checked high-color-depth Raster output (16 bit per color, auto-selected by cupsRasterPrepareHeader() when high print quality is requested, via print-quality=5) and found out that it was broken in both pdftoraster() and pwgtoraster() and found a simple fix for a bug in both, introduced still before the transition of pdftoraster() to a filter function. imagetoraster() and mupdftoraster() do not support high color depths at all, so I blocked using high color depth with these filter functions. I also checked the print-scaling attribute on the imageto...() filter functions and found that print-scaling=none had the same bug on all the three filter functions and fixed it. Dimensions in PostScript points (1/72 inch) were compared with dimensions in pixels. I also made print-scaling=none being applied when requested and not falling back to fit on ver small or very large input images. Also the default resolution of image files without embedded resolution info got moved to 200 dpi (standard for shipping labels) from 128 dpi. All these fixes are applied in this commit and in this commit. I also fixed a lot of log message leaking into stderr by changing it to proper loging via log function. This is a remainder of the architecture where each filter was a separate external executable. With the switchover of the implicitclass backend of cups-browsed the support for legacy IPP (1.x) network printers got dropped. This I have recovered now, letting the implicitclass backend use the queue's PPD file if the get-printer-attributes IPP request to the printer fails (commit). Many smaller bugs and glitches got also fixed. Another backport series to the 1.x branch is planned. Some time ago I have started a discussion thread on the OpenPrinting mailing list and, after not getting any answer, posted a copy in the January news. Now I got some remarks from Zdenek Dohnal and answered with clarifications. Again, I am inviting everyone to discuss on the OpenPrintingmailing list (subscription required for posting), either answering to the existing thread or starting a new one. HPLIP 3.21.12 in all Printer Applications The HPLIP Printer Application (Snap Store) got its first update of the underlying HPLIP version. It is now HPLIP 3.21.12. We continue using the Debian package sources to include more than 80 bug fixes not adopted upstream. Sorry for the delayed updates due to this. The update adds explicit support for the new HP printer models which got released near the end of 2021. Note that most of those printers should also work as driverless IPP printers and therefore also work without the HPLIP Printer Application. The update worked out smoothly. If you have installed an HPLIP Printer Application version which still uses HPLIP 3.21.8 and have the proprietary plugin installed, the plugin gets updated right after the installation of the new version of the Printer Application. Note that this can take some minutes and that during this time your printer will perhaps not work. Not caused by the update, I got a bug report that the automatic loading of the firmware into printers which need it everytime when they are turned on did not work. As I do not have such a printer I had to do some tricky workaround for testing when I developed this mechanism. Unfortunately, in the real situation this did not work out (or at least not for the user who reported tha problem). Fortunately, the reporter of the problem, M. Parker, was very enthusiastic and cooperative, investigating the problem with the help of my mentorship. I told him how to debug a Snap, as rebuilding it with some debug echo commands added to the script which controls the firmware upload, and putting the script into debug mode. Before this, he also did some Snap debugging already, and finally solved the problem! Thanks a lot for your great cooperation, M. Parker! You have made the automatic firmware upload working! After that, I have updated also the HPLIP used in the PostScript Printer Application (PostScript PPD files for HP printers, Snap Store) and in the Ghostscript Printer Application (HPIJS for non-HP PCL-5c/e lasers, Snap Store) to the Debian package source of HPLIP 3.21.12. All the OpenPrinting Snaps are updated to use QPDF 10.5.0 now. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|3987| |ipp-usb|ipp-usb|1485| |ps-printer-app|PostScript Printer Application|2202| |ghostscript-printer-app|Ghostscript Printer Application|1011| |hplip-printer-app|HPLIP Printer Application|3436| |gutenprint-printer-app|Gutenprint Printer Application|2789| Currently released is 2.4.1. CUPS 2.4.1 got released, adding several bug fixes, especially that the ColorModel default in generated PPD files for driverless printers is taken from the printer and also configurable which I told about last month. Michael Sweet is also already working on the libcups of CUPS 3.x (Michael's personal libcups repo). Ubuntu Jammy Jellyfish (22.04 LTS) will come with CUPS 2.4.x, most probably 2.4.1. It will still come as classic Debian package and all the drivers, too. The full snapd integration of the CUPS Snap is only happening right now (see above) and we also did not succeed to release cups-filters 2.x and pappl-retrofit 1.x (for the Legacy Printer Application). More important even, we need the changes in the GUI tools (see above). The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.11. We are continuing to polish and to fix bugs for the 2.0.0 release. I have especially tested all the filter functions with the new generated PPD files for driverless IPP printing and for cups-browsed-based printer clusters, fixed 16-bit-per-color output, fixed the imageto..() filter functions, and also removed a lot of \"log message leaking\" to stderr (see above). I have also backported many of the fixes already to cups-filters 1.x, as 2.x will still take some time to get released. Do not use high color depth (16 bits per color) with all filter functions (commit). Many fixes on the filter functions: Select correct color space/depth for Raster output with cups-filters-generated PPDs, 16-bit-per-color output of pdftoraster() and pwgtoraster(), print-scaling=mone with imageto...() filter functions (commit). Support all color spaces supported by PWG Raster and Apple Raster for auto-selection by the cups-filters-generated PPD files or printer IPP attributes (commit). Do not call cupsRasterParseIPPOptions() if we have a PPD file, as it guesses the meaning of option/attribute names and this can lead to settings not supported by the PPD/the printer (commit). Added new input-page-ranges option to the pdftopdf() and pstops() filter functions. It takes the same syntax as page-ranges but selection of pages is done on the input document before applying N-up, booklet, ... So it allows selecting pages from the input document, whereas page-ranges selects from the print job (commits: pdftopdf(), pstops()). If for a printer in a cups-browsed cluster a get-printer-attributes IPP request by the implicitclass backend fails, for example because the printer is a legacy IPP (1.x) printer, fall back to using the queue's/cluster's PPD file, to not drop cups-browsed's support for legacy IPP printers (commit). In mupdftoraster() direct output to outputfd instead of directly to stdout and logging to the log function instead of stderr (commit). In pdftopdf() add 2% tolerance for input sizes larger output page when doing fit-to-page, as otherwise sometimes pages get fit into the sheet and sometimes into the printable area due to small rounding errors (commit). For images without resolution in metadata changed the default ppi from 128 to 200 for printing in \"original size\" with imageto...() filter functions, as this is the standard resolution of shipping labels, and other images you usually print scaled to the page (commit). In the serial CUPS backend add a 10-msec sleep and at the end add a tcdrain() call to make serial printers more reliably working (commit). Also fixed a lot of \"log message leaking\" by re-directing to the log function or dropping the messages. Ubuntu Jammy Jellyfish (22.04 LTS) will most probably come with cups-filters 1.28.12 as 2.x will not get released in time for Feature Freeze pn February 24. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.1.0. The principal change up to now in the upcoming 1.2.0 release will be IPP notifications support, enabling/disabling printers, and more media-ready entries than trays possible (so of a tray is use used sometimes for one paper, sometimes for another, it can have extra media-ready entries). All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-February-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - February 2023",
+ "url": "/OpenPrinting-News-February-2023",
+ "headings": [
+ "Google Summer of Code 2023 - We are in!!",
+ "Linux App Summit 2023",
+ "Common Print Dialog Backends support accepted into GTK",
+ "libcups 3.0b1 - The first piece of CUPS 3.x!",
+ "The New Architecture is going into Ubuntu and Red Hat",
+ "Private bug reports for security issues",
+ "CUPS",
+ "cups-filters",
+ "Braille Printer Application",
+ "Common Print Dialog Backends",
+ "PAPPL Scanning Support",
+ "pappl-retrofit"
+ ],
+ "tags": [],
+ "snippet": "Linux Foundation accepted as GSoC 2023 org, LAS 2023 in Brno, CPDB accepted into GTK 4.9.4, libcups 3.0b1, New Architecture going into Ubuntu and Red Hat, cups-filters 2.0b4, pappl-retrofit 1.0b4, CPDB 2.0b2",
+ "content": "Sorry, we are late this month, there was a lot of work getting the new generations of cups-filters and CPDB into Ubuntu. But we have a lot of good and exciting news! Not only that we got accepted as mentoring organization in the Google Summer of Code 2023 but also Common Print Dialog Backends support got merged into GTK, and we have the first beta release on the way to CUPS 3.x, libcups 3.0b1! Some of you were perhaps wondering how to report security issues and therefore hesitated to do so, now I succeeded in getting an intuitive way. And Kurt Pfeifle, who made me know about CUPS back in mid-2000 by a magazine article and so made out of me what I am now has retired and now wants to contribute to the documentation on OpenPrinting! Welcome back in the team!! First off, the Linux Foundation got accepted as mentoring organization. So we are again looking for amazing contributors to do projects with us and improve the printing and scanning experience with Linux. Our selection process has already started some months ago and we already got some promising candidates. If you want to participate, too, have a look at our project ideas list. Please contact us as soon as possible and not only when Google's application time window opens (March 20 - April 4). Please send us your resume/CV and tell us what you like to work on, either on one of the project ideas or you can also provide your own project idea. Also have a look what we are doing via the links on our About Us and News and Events pages. A nice side effect of having the contributors working on GitHub issues as part of the process is that we get several bugs fixed or feature requests implemented. For example we have completely overlooked to transfer the handy utility cupstestppd into libppd. Now, thanks to a contributor candidate we have it even as library function, ppdTest(), in addition to the new command line utility testppdfile. Also several bugs in the print filters got fixed. Thanks a lot to all contributor candidates who helped us fixing bugs and accomplishing other tasks. The Linux App Summit 2023 in Brno in the Czech Republic is coming closer. The conference will actually take place on Saturday, April 22 and Sunday April 23. On Friday, April 21 there will be a pre-registration. Here is some info about the venue, the location, and how to get there. The Call for Proposals has closed and we got a lot of great abstracts, for talks, lightning talks, workshops, and BoFs, 44 in total. So now we have the hard work of selecting the best ones to accommodate in the two rooms we have, like last year in Rovereto an auditorium for the talks and lightning talks and a classroom for the workshops and BoFs. Provided that it gets accepted I will give a talk about the Printing GUI work to support the New Architecture, on the GNOME Control Center and on the print dialogs, especially the GTK one, and perhaps also give a short demo. I will leave plenty of time in the end for an AMA (Ask Me Anything) and for further Q&A and discussion I will also run an OpenPrinting BoF session afterwards. On my two printing sessions you will also have the chance to meet Marek Kasik (GTK/GNOME printing maintainer) Zdenek Dohnal (Red Hat printing maintainer, great contributor to CUPS and OpenPrinting) Albert Astals Cid (Qt print dialog) Harald Sitter (KDE developer, wants to improve Qt print dialog UI) They will be in the rooms to answer questions and participate in the discussion. I will also make use of the fact that this year we will for the first time offer workshops and give a workshop to learn how to snap (= package as a Snap) applications for distributing them via the Snap Store. So anyone who has missed my Snap workshop series on the Ubuntu Summit, here is another chance. There is only this one workshop for the basics, but I have also seen some talks about advanced topics under the submissions and have given good reviews to them. Accepted contributions will get announced on March 1. Gaurav Guleria's GSoC 2022 work on CPDB support for GTK got finally merged into GTK upstream! Gaurav posted the merge request during his GSoC time back in August 2022. Now, half a year later, after a lot of extra work after the GsOC, mainly during the winter break of his college, and after a lot of discuassion of him and me with the upstream maintainers Matthias Clasen and Marek Kasik, the code got finally merged. Compared to Gaurav's initially posted code a lot of changes were needed to fulfill the requirements of the upstream maintainers for the print dialog. Especially many changes required also the addition of important features to CPDB, especially synchronous and asynchronous polling of information, keeping the list of available printers up-to-date, human-readable option, choice, and option group names and translations, ... All this Gaurav completed, mentored by Marek Kasik and me. With this, the Common Print Dialog Backends concept made it for the first time into real life, and especially into the most common of the print dialogs, the one of GTK. This way the print dialog is prepared for any change in the print technologies, especially the switchover of CUPS into the New Architecture without PPDs. Now Gaurav is working on getting the merge request for the CPDB support in the Qt print dialog accepted ... On LAS 2023 end-April, in my printing GUI talk I will report about this work, and if possible, also present a demo of it. And Marek Kasik will be with me in the room, for questions and answers. Gaurav, thanks for your amazing work on both the GTK print dialog itself and also on the 2nd generation of the CPDB and the backends! Marek Kasik and Matthias Clasen, thanks a lot for guiding Gaurav to get his work accepted into GTK! Michael Sweet has released the first beta of libcups 3.0! This is the first of the new split components of CUPS 3.x. It will not only have deprecated features removed, like PPD file and classic driver support, but also a lot of new functionality, like for example: DNS-SD API JSON API Localization API Vast improvements on ipptool More consistent APIs New PWG media sizes, ... A lot more ... So we will not only get a streamlined all-IPP CUPS without the PPD burden, but also several nice new APIs to make the development of all kinds of printing-related software easier. Now we need to test and adapt everything at OpenPrinting which is using libcups to the new library version: libcupsfilters, libppd, cups-filters, cups-browsed, pappl-retrofit, cpdb-backend-cups, ... This should not be so complicated as we have transfered all PPD file support into libppd already. And there is already a GSoC contributor candidate on it to start the adaptation. Ubuntu I have continued the Ubuntu integration work. See also my report on it from last month, where I have especially talked about the concepts and requirements. Of all the packages libcupsfilters, libppd, cups-filters. cups-browsed, pappl, pappl-retrofit, cpdb-libs, cpdb-backend-cups, and cpdb-backend-file, the current versions are uploaded. The first challenge is that they build on the 6 supported processor architectiures. and pass two levels of automatic tests which get performed with every package upload, also on each of the 6 architectures. Libraries must in addition have a complete list of symbols (API function and variable names) used for automatic package dependency resolution. Only with this fulfilled, the package passes from proposed status to released status (\"migrates\"). Only packages with released status are visible for users who are searching for packages to install and replace the previous package version in the distro. This process is independent of whether the package is in Universe or in Main. The two levels of tests are the build test which is performed when one runs make check after one has run make, so the freshly compiled, not yet installed programs are tested. The second level is the so-called autopkgtest which is performed with the software and all its dependencies installed on a virtual machine. This is to check whether the software runs in the actual system environment of the current Ubuntu. On each upload of a package not only the autopkgtest of the package itself is performed but also the autopkgtests of each package which depends on the uploaded package. Now one could think why do I not simply upload packages which do not contain any tests and they get simply accepted when they just build. For Universe this is fine, but to get a package promoted from Universe to Main, it does not only need to fulfill the criteria of stability, security, being well maintained, ... but also actually contain non-trivial tests for both the build test and the autopkgtest. So this meant a lot of work, first, symbol lists are easily auto-created for libraries which do not contain C++, but for C++ code in libraries it gets crazy, as there are entries which differ between the different processor architectures in the auto-created lists and then manual merging is required, and usually several uploads of the package, checking the auto-generated symbol lists and doing several merging iterations. This was the case for licupsfilters and libppd, the other library packages are all free of C++. So a reason to avoid C++ at OpenPrinting .... Thanks a lot to Sebastien Bacher and Jeremy Bicha for all the valuable help on this! Next step are the tests: libcupsfilters and libppd (MIR) have have build tests (make check actually does something) but the new Debian/Ubuntu packages also need autopkgtests. Also the old cups-filters 1.x package did not have autopkgtest allowing to transfer the appropriate part to libcupsfilters. To avoid having to design autopkgtests I simply added optionally installable binary packages to install the test programs of the build test into the system so that they can be used as autopkgtests and the problem was solved. But cups-browsed (MIR) has no tests at all and cpdb-libs (MIR), cpdb-backend-cups (MIR), and cpdb-backend-file (MIR) lack build tests. Therefore we need, not only for our own QA, a good test infrastructure for all the software we produce. This is already on our roadmap and we will let two GSoC contributors work on it. In cups-filters (2.0b4) I have also eliminated warnings about deprecated QPDF functions by making everything using the current QPDF 11 API, as having that many warnings was not much liked by the MIR approval team. Of the Common Print Dialog Backends I released the second and the third beta, to have a CPDB release with which GTK 4.9.4 actually builds and to get the improvements in translation support in, all in time for Lunar's Feature Freeze. All 3 packages (cpdb-libs, cpdb-backend-cups, cpdb-backend-file) already did the migration from -proposed into the release in Universe. For PAPPL I posted the MIR. The package (1.3.1) synced already from Debian. For the first Debian/Ubuntu package of pappl-retrofit I have released the second beta upstream. It especially includes the systemd *.service file for auto-starting the Legacy Printer Application as system service. The Debian package contains a binary package of the Legacy Printer Application for making classically installed (also proprietary) printer drivers available for the CUPS Snap and for CUPS 3.x. Red Hat The new packages, for now at least libcupsfilters, libppd, cups-filters, and cups-browsed will replace the old cups-filters package also in Red Hat and Fedora Linux. Therefore Red Hat's printing maintainer Zdenek Dohnal did a lot of fixes and clean-up on the upstream source code and build systems of these packages. He removed some unnecessary dependencies (Avahi, GLib, zlib, Freetype) from libcupsfilters which got overlooked during the separation. He also removed overlooked dependencies in the other packages, especially on C++ in cups-filters and cups-browsed and added explanations for the actual dependencies to the INSTALL files. These changes are in my release of the third beta. Zdenek ran also Coverity on libcupsfilters (PR) and libppd (PR), discovering several bugs (memory leaks, possible buffer overflows, ...) and fixed those. This fixes are available in the forth beta now. Thank you very much, Zdenek for all this amazing work! Some of you were probably thinking about how to report a security vulnerability in OpenPrinting's software, how to do an appropriate private bug report. Perhaps some even gave up on the report because they did not find the right place for it. I have now investigated and found out how to get this done with GitHub repositories. First, the support for private bug reports needs to get activated in the security section, and second, to have the link to actually report such a bug not hidden under security, create at least one template for regular bug reports so that initiating a regular bug report lands the user on a template selection page, and here, in addition to the defined templates, a button for a private security bug report appears. So to start somewhere I have added templates for issue submissions to the CUPS and cups-filters repositories. This adds said selection page when the \"New Issue\" button gets clicked, not only allowing to select the template (\"Bug report\", \"Feature Request\") but also providing a button for a private security bug report. Shortly after, Zdenek Dohnal already refined the one of CUPS and added a REPORTING_ISSUES.md file. We will soon add this on the remaining repositories of OpenPrinting. In addition to the release of libcups 3.0b1 maintenance work on CUPS 2.x continued, as this version will be with us still for some time. While assigning issue reports to GSoC contributor candidates and them investigating the reports and working on the bugs we get several fixes done. On CUPS the following problems got solved: If the get-printer-attributes IPP request on attributes all,media-col-databse fails, we poll all and media-col-database separately and several printers work this way (PR). Without this in some cases printer features, like borderless printing, get overlooked (Issue on cups-filters). snapd-glib got a new API snapd-glib-2, and the CUPS package in Ubuntu got updated by a patch. Now I have added support for the new API upstream (commit). We fixed also a long-standing bug which broke printing on several monochrome driverless IPP printers due to the PPD file generator setting (the not available) RGB as default color mode. It is now fixed by this commit. Ubuntu 23.04 (Lunar Lobster) will most probably come with CUPS 2.4.2, perhaps with 2.4.3 if it gets released in time for Final Freeze (April 13). In the course of the integration of the new generation of cups-filters in Ubuntu I have done two more beta releases to include general bug fixes and also fulfill requirements for Ubuntu. Also several of the bug fixes were done in cooperation with GSoC contributor candidates to whom we have given issue reports as assignments. Third beta Monochrome PXL-XL printing (Ghostscript, output device pxlmono) did not work due to the cfFilterGhostscript() filter function using the sRGB instead of the sGray color profile, which makes Ghostscript erroring out (commit). As in CUPS we have also added the separated polling of the all and media-col-database attributes from driverless printers to cups-filters (commit, issue) We parse also media-col-ready in the get-printer-attributes IPP responses now, to more reliably find all media properties (commit, issue). Removed the public cfPDFOut...() API (cupsfilters/pdfutils.h). This API only makes sense if the API of fontembed is also public, but this we made private earlier (commit). Removed unnecessary dependencies, especially on C++ in cups-filters and cups-browsed. Thanks, Zdenek Dohnal. Many fixes in the build system and the source code documentation. Forth beta of libcupsfilters and libppd Zdenek Dohnal from Red Hat has run all the components of the new generation of cups-filters through Coverity and found several bugs: Memory leaks, files not closed, possible string overflows, ... He fixed all these bugs in the upstream code. This assures reliability and security of all the new components, especially if being part of permanently running daemons (PR libcupsfilters, PR libppd). Thanks a lot, Zdenek! Updated libcupsfilters to work with the latest version of QPDF (11) as building it showed a lot of warnings about the use of deprecated functions in QPDF. Now it should be even ready for the upcoming QPDF 12. After GSoC candidate Biswadeep Purkayastha having gotten assigned a bug report about the PostScript Printer Application not preventing the use of malformed, user-supplied PPD files, we realized that we did not transfer CUPS’ valuable command line tool cupstestppd into libppd. This Biswadeep has done now), as the library function ppdTest(), easily callable from a PPD-retrofitting Printer Application. He also created the wrapper executable testppdfile to replace cupstestppd. Thanks a lot for this excellent work! As in CUPS, we fixed the bug of PPD files for monochrome driverless IPP printers having RGB as default color mode choice in their PPD file and therefore the printer not printing also in the PPD generator of libppd. And we fixed a crash in the cfFilterImageToRaster() filter function, PNG images coming out blank, crash on PPD files with \"Unknown\" default page size, and a possible crash in the build test (make check) of libppd. cups-filters 1.28.17 For distributions which do not switch the second generation of cups-filters yet, like Debian Bookworm, we have again backported important fixes to the 1.x series of cups-filters: Let the PPD generator for driverless IPP printers only put the one, most desirable *cupsFilter2: ... line into the PPD, usually the one for Apple Raster. Poll all and media-col-database attributes separately in get-printer-attributes IPP request if needed. Let PPD generator also parse media-col-ready IPP attribute. Actually read all margin sizes in the media-{left,right,top,bottom}-margin-supported IPP attributes and do not skip the first value which is often borderless. I continued working with Chandresh Soni on the PR for getting the Braille Printer Application upstream. Unfortunately it is not in a working condition yet. For now, we will simply use the classic CUPS driver as it is contained in the repository, like Zdenek Dohnal for Red Hat. Zdenek Dohnal also improved the privilege dropping of the cups-brf CUPS backend. Thanks a lot. For the requirements of the CPDB support in the GTK print dialog Gaurav Guleria needed to do a lot of enhancements on CPDB itself, and when his merge request got accepted into GTK, CPDB 2.0b1 was already 2 months old and after that a lot of changes have been done, ending up with GTK's CPDB support not building with any released version of CPDB. Therefore we have now released version 2.0b2 of all the three components (cpdb-libs, cpdb-backend-cups, cpdb-backend-file) of the CPDB to allow easy building of the first CPDB-supporting GTK. Features added are Options groups: This allows better structuring of options in print dialogs. Common options are categorized in groups, like media, print quality, color, finishing, ... Initial printer list: When opening the dialog, in one synchronous function call the initial printer lists are polled from all installed backends. Update printer list continuously: Backends will automatically signal any print queue updates to the frontend to keep the displayed list up to date. Translation support: For option, choice, and group names translations can be provided, both from backends and from frontend libraries. Allow re-establishing the D-Bus connections between frontend and backend. CUPS backend makes use of the new features: It subscribes to CUPS notifications on print queue changes and passes the changes on to the frontend and it provides option/choice/group name translations from both CUPS' message catalogs and polling via IPP from CUPS queues and printers. Also several bugs got corrected and work on the documentation done. And there are now three source code download formats: *.tar.gz, *.tar.bz2, and *.tar.xz Shortly before Feature Freeze for Ubuntu 23.04 I have released the third beta with improvements in translation support, now having functions to load translations synchronously and asynchronously. One of our GSoC contributor candidates is preparing for working on the GSoC project idea \"Scanning support in PAPPL\". He has compared the printing-related and scanning-related API functions, added header comments for automatic generation of developer documentation, implemented missing functions, and we had a video meeting to plan his work on the project (Pull request on PAPPL). I have released the second beta. It especially includes the systemd *.service file for auto-starting the Legacy Printer Application as system service, so that it can easily be used for making classically installed (also proprietary) printer drivers available for the CUPS Snap and for CUPS 3.x. As an example case for the Legacy Printer Application we can take this bug where it turns out that a printer designed to be driverless does not work correctly when used as such and the manufacturer worked around the bug with their proprietary driver, defeating the original driverless design of the printer. In the end of the bug's discussion thread I discussed with Zdenek Dohnal (Red Hat) and Brian Potkin (Debian) about how to use legacy CUPS drivers with the Legacy Printer Application in the era of the New Architecture/CUPS 3.x."
+ },
+ {
+ "id": "post:OpenPrinting-News-February-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - February 2024",
+ "url": "/OpenPrinting-News-February-2024",
+ "headings": [
+ "CUPS Snap on Ubuntu Touch",
+ "FOSDEM 2024",
+ "OpenPrinting Summit/PWG Meeting is only online again",
+ "GUADEC 2024",
+ "Open Source Summit and Plumbers in Vienna",
+ "Google Summer of Code 2024",
+ "Printer Applications - New releases"
+ ],
+ "tags": [],
+ "teaserImage": "/assets/images/news-202402/fosdem-2002-till-printing-talk.jpg",
+ "snippet": "CUPS Snap on Ubuntu Touch, FOSDEM 2024, OpenPrinting Summit/PWG online, GUADEC 2024, OSS & Plumbers in Vienna, GSoC 2024, Updates of Printer Applications",
+ "content": "Good News! The CUPS Snap works with Ubuntu Touch, the smartphone operating system formerly created, maintained, and discontinued by Canonical and continued by the community organization UBPorts. So the CUPS Snap has a good chance to get the official printing stack for this system. And generally the world of Linux will get more snappy in 2024: Zygmunt Krynicki (the one in yellow in the middle of the Ubuntu Summit 2022 Snap panel) is returning to Canonical to make Snap working better with all distros especially non-Ubuntu ones (Phoronix). So snapping your apps will make them available for all distros (including Ubuntu Core Desktop but also most of the others). Especially we at OpenPrinting can easily distribute printer and scanner drivers as Printer/Scanner Application Snaps then! So on Mastodon I already posted a little feature request: Zygmunt, I did not test it by myself, but distros derived from RedHat/Fedora use SELinux instead of AppArmor and as of now Snap only supports AppArmor, making Smaps running on those distros only partially protected. My feature request for snapd would be to not only map the rules of Snap's interfaces to AppArmor rules but also to SELinux rules, so that one gets the same level of security on both. Highlight of this month was the FOSDEM 2024 in Brussels, unfortunately without Zdenek as he got sick, but I have given my 2 talks with great success, one even made it to Phoronix, and I met my former Canonical colleague Heather Ellsworth together with the other Thunderbirdies, and many others ... Many have already seen on these pages that I live in Vienna in Austria and with this I will have a home game for this year's Open Source Summit Europe and Linux Plumbers. And as OpenPrinting is part of the Linux Foundation, I share here a nice article about the LinuxFoundation on ZDNet. So let us see what happened at OpenPrinting in February ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Many of you know that a complete CUPS printing stack (CUPS, cups-filters, Ghostscript, QPDF, cups-browsed, ...) is available as a Snap in the Snap Store, the CUPS Snap, an immutable system component for a wide range of Linux distributions, the latest and greatest right from upstream, from OpenPrinting. And this Snap will be used in the immutable all-Snap distro Ubuntu Core Desktop, and will also, later on, be used in standard Ubuntu. But Snap made it also into Ubuntu Touch, the smartphone operating system which Canonical has given up on and which got continued by the community. Alfred E. Neumayer (beidl, fredldotme, Codemaster Freders) from UBPorts did not only succeed to make Snap in general working on Ubuntu Touch but especially also succeeded to make the CUPS Snap work and this way introduce print functionality to the system. I got note of it when I met Rudra Saraswat on the FOSDEM 2024. He is not only leading the Ubuntu Unity and BlendOS projects but also contributing to UBPorts, and so he took me to the booth of UBPorts where Alfred proudly told me that he made the CUPS Snap working. I asked him to write some 10-15 lines about it for this news post but he never did. So I googled for more information and found the thread in the Snapcraft forum which I linked above. I also found the Ubuntu Touch Q&A episode 131, where, according to the summary, as an answer to a user asking about the state of printing Alfred has told in the live-streamed Q&A session that he has made the CUPS Snap working. The recording of the session is available on YouTube and the relevant part is at 45:30 min -> 48:45 min and here Alfred does not only explain how he did it but also shouted out the people who made the CUPS Snap possible, without explicitly mentioning their names. and Diogo Constantino from the Podcast Ubuntu Portugal, wrote into the live chat: 46:45 Podcast Ubuntu Portugal Til rocks! Now let us hope that the CUPS Snap will actually get the official printing stack of Ubuntu Touch. FOSDEM was a great experience. It has grown a lot compared to the early 2000s, now having 32 rooms in ~10 different buildings vs. the plenary room plus some rooms in another building back in 2002. So it was often not easy to find the desired building, room, or booth on the conference. And sorry, I have told something wrong in my previous news posts here, I have actually given a talk on a FOSDEM already before, in 2002! It was about my first one and a half years of printing work at MandrakeSoft. I have compared different printing systems, like LPD, LPRng, CUPS, PDQ, PPR, ..., especially I told what is better in CUPS, I also talked about Foomatic, printer drivers, the printing working group at freestandards.org, ... FOSDEM-2002 My talk on my first FOSDEM, back in 2002. The slide shows a summary about my first 1.5 years of printing work. And now, 22 more years have passed and a lot has changed, which I have reflected in my second FOSDEM talk about printing: OpenPrinting - We make printing just work! (Video, Slides) The talk has taken place in the second room of the Main Track, in the ~800-seat \"La Fontaine\" lecture hall in the K building, the building where also most of the booths were located. The room was perhaps filled to 1/3. And people were interested. I had the last 8 minutes for Q&A (starting at 40:50 min) and got 3 questions, about restrictions against unauthorized printing in a school network, about scanning standards, and also about why Microsocft did not use CUPS/OpenPrinting for Windows. Had been great if they had used CUPS ... Harald König, an old friend from the LinuxTag times in the early 2000s, attended my talk and came up to me afterwards. Also my second talk, Desktop Linux, as easy as a smartphone! Just in a Snap! (Video, Slides), in the Distributions Track, was successful. I did not have time left for Q&A right after the talk in the room, as the person showing me these \"XX minutes left\" cards was aiming for the end of the full 25-min slot, not for some minutes earlier for the questions. But afterwards some of the attendees went with me and Philipp Kewisch to ask some questions on the hallway and I showed to them Ubuntu Core Desktop running in a virtual machine on my laptop. I also told a person about how is it to work at Canonical. And the talk got mentioned in Phoronix: Snaps & Ubuntu Core Desktop Talked Up At FOSDEM 2024 As usual, the people complaining about Snap in the comments. But there were not only my two talks but a lot of other things happened ... It started with meeting Petr Mensik from Red Hat, who is taking care of Avahi, on the plane from Vienna to Brussels and also getting around with him in the city after arriving, having lunch with him (mussels with fries, a typical dish) and going with him to the CentOS Connect conference (at least for some hours) which happend in the same hotel (Radisson Collection Grand Place) where the Canonical-internal Engineering Sprint happened in the fall of 2018. Petr does great work on Avahi (GitHub), which was practically abandoned by its former maintainer Trent Lloyd. He is continuing maintaining it and is releasing 0.9.0 (Announcement of 0.9-rc1. Friday evening I met with a lot friends and colleagues: Heather Ellsworth, Alan Pope (\"Popey\"), Iain Lane, Marco Trevisan, Olivier Tilloy, ... On Saturday the event started. I was not able to attend the opening plenary, as on the conference with ~8000 attendees it took place in the \"tiny\" plenary room with only ~1400 seats. So at first I visited the booth of Thunderbird, to meet Heather Ellsworth with her new colleagues. It was great to see my former Canonical colleague Heather as a happy Thunderbirdie, working for the best e-mail client. The booth was in the K building, where there was the largest group of booths. There were many smaller groups in other buildings, so it was easy to miss some of the booths. Other booths I visited were especially the ones from the Google Summer of Code, Linux Foundation, UBports (see above), and Prusa 3D printing. Only Ubuntu/Canonical was not successful to get selected for a booth. There were 3 times as many proposals as there were booth spaces and no booth spaces reserved for sponsors of the event and also no possibility to rent space for a commercial booth. But Philipp Kewisch, Community Team manager of Canonical, and Michal Kohútek created a \"mobile booth\" walking around with a box of Ubuntu swag and with QR codes pointing to Ubuntu-related activities: Ubuntu Summit, Ubuntu local communities, and jobs at Canonical. And both were wearing orange Ubuntu beanies. Philipp also interviewed some people (including me) for producing content for a video for the 20th-anniversary of Ubuntu. The booth of Prusa was really impressive where they demonstrated some of their 3D printers live, especially one with an automatic tool changer to be able to print objects composed of up to 5 materials. Did I not say above that there are no commercial or sponsor booths? But what makes Prusa having gotten there is that their 3D printers are open-source hardware, meaning that everything needed to reproduce the devices, all their design, 3d-print models of the parts, PCBs, firmware, software, ... is available under a free license, in case of Prusa on GitHub. This motivated me to invite them to the Ubuntu Summit 2024 (where I am in the organization team again), to give a talk and a workshop, so that attendees try out 3D printing by themselves. There were also great evening events after the conference days. On Saturday, Google has invited the participants of the Google Summer of Code for the FOSDEM GSoC Meetup with free food and drinks. I met several fellow mentors there and also Stephanie Taylor, organization lead of the GSoC. I invited her to the Ubuntu Summit 2024, for a GSoC panel and other sessions, but unfortunately, due to the Ubuntu Summit being shortly after the Mentor Summit, the last major piece of work for the GSoC organizers, she is usually on (a well-deserved) vacation at that time. After that I went on to the GNOMEbeers, the social event of GNOME. And on Sunday evening we had a joint dinner of Thunderbird and OpenPrinting, 13 Thunderbirdies and me ... I will come back next year for sure ... Due to lack of willingness to travel to the Lexmark facilities in Lexington, Kentucky in the US, and most probably also due to lack of funding by employers, this year's annual meeting will be totally online again. It will take place on May 6-8. In July we have a GUADEC again! And so it is at the time to mention it here in the News. This time the GNOMies and friends will meet in Denver, Colorado, in the US (1 hour drive from Heather Ellsworth's home)! I will also be there (I will soon book my flights) and I have rushed in a talk submission before the (very early) deadline of February 18 which they announced first. They have extended the deadline to March 24 afterwards, so I will perhaps submit another talk. The talk already submitted is a talk about Snap and Ubuntu Core Desktop, similar to the one I have given on the FOSDEM. But now there will be a 40-min slot, and I am aiming for leaving 10 minutes for Q&A. I will perhaps submit another one with an OpenPrinting subject. If you have a look into my news posts of the 2 post-pandemic years 2022 and 2023 you see that I have been on many conferences, so I had a lot of trips, sometimes also long ones, to another continent, as for GUADEC 2022, Opportunity Open Source/DebConf 2023 and the GSoC Mentor Summit 2023, but I also had a short 2-hour train trip to Brno for the Linux App Summit 2023. Yes, that conference was really close by, compared to all the others, but it was not really that close, as for this year's Open Source Summit Europe and Linux Plumbers it gets even closer. They both take place in Vienna in Austria! This is the city where I live, and so for me it is the loooong trip from my home to the Austria Center by Vienna's subway. So you have the chance to visit this nice city, and you wiil meet me there, as I will attend the conferences, too. To make it even easer for you and to give you the chance to enjoy Vienna for a longer time, the 2 conferences are in the same week and at the same venue: Open Source Summit Europe: September 16-18, 2024 (Mon-Wed) Linux Plumbers Conference: September 18-20, 2024 (Wed-Fri) Both take place in the Austria Center in Vienna, so we have one week of conferences there and on Wednesday one can even hop between the two. The Linux Foundation got accepted as mentoring organization in the 20th GSoC! So we are again looking for amazing contributors to do projects with us and improve the printing and scanning experience with Linux. Our selection process has already started some months ago and we already got some promising candidates. If you want to participate, too, have a look at our project ideas list. Please contact us as soon as possible and not only when Google's application time window opens (March 18 - April 2). Please send us your resume/CV and tell us what you like to work on, either on one of the project ideas or you can also provide your own project idea. Also have a look what we are doing via the introduction on the project ideas list page (there are also a lot of videos) and the links on our About Us and News and Events pages. A nice side effect of having the contributors working on assignments we give them is that we get several bugs fixed and smaller features implemented. This year, the candidate Rudra Pratap Singh even landed an improvement on an external project. As I told already last month here I gave him the assignment of applying Snap update automation on the CUPS Snap and on the Printer Application Snaps. He ran into some problems with the GitHub action provided for that by Ubuntu and did some improvements on it. He also made the Snap versioniung automation which I had implemented in a scriptlet in the CUPS Snap available for everyone by adding it to Ubuntu's GitHub action. All his pull requests got accepted now! Biswadeep Purkayastha applied as contributor already last year on CI testing for OpenPrinting but we did not get enough slots from Google to accommodate his project. So he picked up some tasks at OpenPrinting voluntarily. He attended my Snap workshop on the Opportunity Open Source in Mandi, India, and I asked him, already back in October, to snap the CPDB backend for CUPS (see October 2023), and he worked on that. We ran into some problems, have discussed them on snapcraft.io, and he is currently working on the snappability of the code of the CPDB backend. When he got stuck inbetween, he also added support for CUPS 3.x's libcups3 to libcupsfilters, libppd, and pappl-retrofit (see also October 2023). Akarshan Kapoor did great work on scanning support in PAPPL and he wants to continue working on it in this year's GSoC. So we have already 3 great candidates, but we need more. Unfortunately, many of those to whom we have given GitHub issues as assignments did not report back and seem to have given up. Since last month I have also added 2 new project ideas: Integrating C-based OpenPrinting projects in OSS-Fuzz testing Official OCI containers (Docker, ROCKs, podman, ...) of CUPS and Printer Applications Please contact us as soon as possible if you are interested in being a GSoC contributor for OpenPrinting on one of these projects or on your own project idea. Michael Sweet has issued new feature releases of his 2 Printer Applications, the HP Printer Application and LPrint. HP Printer Application 1.3.0 Adds support for snap server configuration settings and updates the builds. LPrint 1.3.0 Adds a new dithering algorithm, support for new printers, support for configuration files, and fixes a number of bugs. LPrint 1.3.1 Bug fix release. Also PAPPL got new releases, 1.4.5 and 1.4.6, both bug fix releases. These releases especially remind me to update our retro-fitting Printer Applications to support the newest features of PAPPL 1.4.x, especially support for server configuration settings and configuration files."
+ },
+ {
+ "id": "post:OpenPrinting-News-Flash-Michael-Sweet-is-Google-Open-Source-Peer-Bonus-winner-for-CUPS",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News Flash - Michael Sweet is Google Open Source Peer Bonus winner for CUPS",
+ "url": "/OpenPrinting-News-Flash-Michael-Sweet-is-Google-Open-Source-Peer-Bonus-winner-for-CUPS",
+ "headings": [],
+ "tags": [],
+ "snippet": "Google recognizes Michael Sweet's exceptional work with his CUPS project!",
+ "content": "Yesterday Google has announced the winners of their Google Open Source Peer Bonus program and under them is Michael Sweet for his exceptional work with his CUPS project. CUPS solved a lot of problems of the former LPD/LPRng printing platforms and quickly turned the standard for easy printing with Linux, MacOS, and many other Posix-style operating systems. Congratulations, Mike!!"
+ },
+ {
+ "id": "post:OpenPrinting-News-Flash-OpenPrinting-and-Ubuntu-on-the-Linux-App-Summit-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News Flash - OpenPrinting and Ubuntu on the Linux App Summit 2022",
+ "url": "/OpenPrinting-News-Flash-OpenPrinting-and-Ubuntu-on-the-Linux-App-Summit-2022",
+ "headings": [],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/CBPefa0Ckq8/hqdefault.jpg",
+ "snippet": "LAS 2022 in Rovereto, Italy - OpenPrinting talk and Ubuntu 22.04 LTS Release parties",
+ "content": "I will be on this year's Linux Application Summit on April 29 and 30 in Rovereto, Italy, near the Lake Garda! Update: YouTube links for all the announced presentations! Recordings of the full event on YouTube (only Auditorium, not BoFs): Friday, Saturday, Channel Update: Survey results available! After the event a survey was taken and a summary of the results is posted now. Thanks, Heather Ellsworth, for this nice summary! Ubuntu 22.04 LTS (Jammy Jellyfish) Release Parties Last week, Ubuntu 22.04 LTS was released, and therefore we have organized release parties on the LAS 2022. There will be a virtual release party for everyone who is not able to come to this great event in person. It will be a special edition of the Ubuntu Office Hours produced live in the Auditorium on Fri, April 29 at 14:05 - 14:50 CEST. Recording on YouTube And for everyone who will actually be in Rovereto this weekend we will have a release party in-person, with the 5 of us from Canonical and everyone who is on the LAS 2022! It will take place on Sat, April 30 at 19:00 - 21:30 CEST at the venue of the conference, right before the final party with the DJ. OpenPrinting Talk about the New Architecture There I will give a talk about the New Architecture of printing and scanning and what is important for developers of desktop applications. I will give a summary of the changes and tell what needs to be changed in the desktop world, the new printer setup tool, print dialog requirements and CPDB, snaboxed/distribution-independent packaging, like Snap, Flatpak, ... This should help application and GUI/desktop developers to get print and scan functionality of their software just work. The talk will take place on Sat, April 30 at 15:35 - 16:15 CEST in the Auditorium. Recording on YouTube Getting Good: Gaming on Linux And for the gamers under you, Heather Ellsworth of the Ubuntu Desktop Team will give a talk: Join Canonical as we explore ways to level up the Ubuntu gaming experience. Building on the great work of WINE, Proton, and the Steam stack, we look at ways to build on that success by tackling the fundamental issues of drivers and dependencies in a non-rolling release. Does it really take a computer science degree to get a good gaming setup on Linux? We say no, find out why. Heather loves tinkering with hardware, software, and games. On a recent Canonical meeting she brought along an nice Raspberry Pi emulating several of the good old gaming consoles and we in the Desktop Team loved playing these old games. The talk will take place on Fri, April 29 at 16:25 - 17:05 CEST in the Auditorium. Recording on YouTube Snapcraft Secrets: The hidden power of desktop extensions If you are a Snapper or if you want to provide resources to make the Snapper's lifes easier, Igor Ljubuncic from Canonical will introduce you into the secrets of the Snapcraft desktop extensions with his talk: There are two ways one can develop snaps: the hard way or the elegant way. Packaging applications as snaps isn't always easy, especially when it comes to graphical desktop applications. Developers need to figure out a fair deal of components and settings for their software to function perfectly. Runtime libraries, environment variables, icons, themes, desktop integration... the list goes on. What if there was a way to have these automagically happen? Well, there is! Snapcraft Extensions are a powerful, flexible set of tweaks and options designed specifically to make life easier for snap developers. In this session, we will talk about what the extensions can do, how they work behind the scenes, and the different ways they can contribute to faster, more streamlined, and more consistent snaps. The talk will take place on Fri, April 29 at 15:30 - 16:10 CEST in the Auditorium. Recording on YouTube Canonical Booth There will also be a Canonical booth with a Canonical gang of 5 people (including me). The orange polo shirts are already on the way to me. Canonical Announcement And on Fri, April 29, at the end of the lightning talk session an old, gray-bearded, long-time Canonical employee (nearly from the beginning on) will do an important announcement! Recording on YouTube Thanks Thanks, Heather Ellsworth, for participating in the organization of the event and making me aware of it! Thanks, Britt Yazel for MC-ing (Master of the Ceremony) the sessions in the Auditorium! Thanks, Heather Ellsworth, Monica Ayhens-Madon, Britt Yazel, Aniss, Kristi Progri, Dani, Caroline Henriksen for the great collaboration on the organization of the Ubuntu release parties. Thanks, Igor Ljubuncic for providing to me with the YouTube links, and especially with the time marks for each of our presentations!"
+ },
+ {
+ "id": "post:OpenPrinting-News-Flash-Ubuntu-Indaba-and-Ghostscript-Printer-Application",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News Flash - Ubuntu Indaba, Ghostscript Printer Application, and the Special Ubuntu 21.10 Feature",
+ "url": "/OpenPrinting-News-Flash-Ubuntu-Indaba-and-Ghostscript-Printer-Application",
+ "headings": [
+ "The first News Flash",
+ "The Ubuntu Desktop Indabas and OpenPrinting - The Recording",
+ "Ghostscript Printer Application",
+ "Ubuntu 21.10 (Impish Indri) - The Special Feature"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/P22DOu_ahBo/hqdefault.jpg",
+ "snippet": "Ubuntu Indaba with Michael Sweet and me, Recording on YouTube, Ghostscript Printer Application, Ubuntu 21.10 IPP Printing",
+ "content": "A lot of new things to talk about, so I do not want tolet you wait until the September News Post here. So here we go, the first News Flash between the months! Today's episode of the monthly Ubuntu Indabas was all about printing, with Michael Sweet (author of CUPS an PAPPL, one of the founders of IPP) and me as speakers, as announced 2 weeks ago here in the August news and on the Ubuntu Discourse. The Ubuntu Indabas are live events to present features of Ubuntu Linux to the users and give them the possibilty to ask questions to the developers. The event got streamed live on YouTube and Twitch, both with live chat. And here is the recording on YouTube! Michael Sweet and me, we gave an insight into the history of printing with free software operating systems like Linux, how we slipped into the printing world and made CUPS the standard printing environment of most non-Windows operating systems (principally Linux and Mac OS). Then we showed how CUPS is working for 21 years now, using the PPD file concept whose development by Adobe stopped in 1984(!) (George Orwell, why did you not tell us that it is over with PPDs?). We revealed that the death of the PPD file is near and CUPS will switch to a new PPD-less architecture, continuing in pure IPP. After that we told how CUPS is working with modern, driverless IPP printers and how we emulate driverless IPP printers with Printer Applications so that non-driverless printers can also print on the CUPS of the future, not using PPD files and being encapsulated in a sandbox (like a Snap), where no filters or other files can be added. Thanks a lot to Michael Sweet for the participation, providing a lot of valuable background information, Heather Ellsworth of the Canonical/Ubuntu Desktop team for organizing and presenting the show, creating the info graphics of the print workflows (with Inkscape), Monica Ayhens-Madon, Canonical/Ubuntu community lead, also for organizing and presenting, and Rhys Davies, also from the Canonical/Ubuntu Desktop team as broadcast director. Next live event: OpenPrinting Micro-Conference on the Linux Plumbers 2021 on Sep, 20 Ghostscript Printer Application in the Snap Store, more than ?? installations via Snap Store Freshly uploaded to the GitHub and to the Snap Store today, less than 24 hours ago (therefore no \"incidence numbers\" as for the other Snaps in my monthly news posts) we have the second Printer Application which retro-fits classic CUPS drivers now: The Ghostscript Printer Application! If you want to use an (older) printer which is not a modern driverless IPP printer and is also not a PostScript printer (which would be supported by the PostScript Printer Application then) Then this is the right Printer Application for you. It supports ~5000 different printer models, mainly with drivers from the well-known Ghostscript but also some others. The printer model support is based on OpenPrinting's printer support database (Foomatic). Especially many standard laser (PCL 6/XL, PCL 5c/e, PCL4) and dot matrix (ESC/P, OKI, IBM, ...) but also many printers with proprietary print data formats are supported. There are not only model-specific entries to choose from, but also generic entries for the common formats for the case your printer is not explicitly listed. The Printer Application gives access to all the options of the former PPD files inside its web interface (\"Device Settings\", \"Media\", \"Printing Defaults\" but can be easily used from any IPP-compliant client application or device. The standard IPP attributes are automatically converted to the best-fitting PPD option settings, espoecially for color, quality, and content optimization. These drivers already ship for many years with most common Linux distributions (Ubuntu, Debian, Fedora, SUSE, ...) and have made many user's printers work and these printers will continue to work in environments where only Printer Applications (and no classic printer driver packages) are supported. This Printer Application and the PostScript Printer Application have a lot in common and share most of their code. Therefore I have continued the development of the code of the PostScript Printer Application by generalizing it for any type of classic CUPS printer driver and put it up on the OpenPrinting GitHub on Monday this week as the PAPPL Retro-Fit Library. This library will also be the start of several other CUPS driver retro fits making all the drivers from the last (even more than) 21 years available for the new all-IPP, PPD-less printing architecture. 21 years ago I migrated all printer drivers into CUPS, now I am migrating them into the next architecture. Right before Feature Freeze of Ubuntu 21.10 I came to the idea to improve the printing experience on it by porting the algorithm to convert standard IPP attributes of print jobs into the best-fitting PPD option settings from my CUPS driver retro-fit work right into CUPS. Michael Sweet has already thought about the mapping of the IPP attributes print-color mode (settings color and monochrome) and print-quality (settings draft (3), normal (4), and high (5)) to PPD option settings and introduced a PPD file extension, the so-called \"presets\" for this. The creators of PPD files were supposed to add 6 presets, 1 for each combination of these two IPP attributes and each preset containing one or more PPD option settings as key/value pairs. If a job is received by CUPS with said IPP attributes set, CUPS sets the option settings of the appropriate preset. I have tested that and it actually works. Problem is that there are ~10000 PPD files and none of them has such presets defined. What to do? Let a student edit all these files? That is modern slavery. So I created an algorithm to automatically generate presets, based on the names of the options and the choices (fortunately they are in human-understandable English) and the PostScript or PJL code embedded in the PPD files to control the printing resolution. To certain option and choice names or fragments of them and also to the resolutions I assign weights on how much it enhances or lowers the print quality and whether it sets the output to color or monochrome, resulting in PPD option settings for the 6 presets. And I did not stop here, I added preset support also for the print-content-optimize (settings auto, text, graphics, text-and-graphics, photo) IPP attribute. I did this in libppd in cups-filters (upcoming 2.x) which is a copy of all PPD-related functions of libcups, to keep the retro-fitted printer drivers in Printer Applications working when CUPS does away with PPD files. This way the Printer Applications which are retro-fitting printer drivers with PPD files automatically apply the best-fitting PPD option settings according to the IPP attributes a job comes with, giving always the best possible printing results even if the user has a client which does not know about PPDs and/or CUPS' APIs to poll the queue's PPD options. Also users can use one standard set of options/attributes for all their different printers. Now, a day before Ubuntu's Feature Freeze I was merging changes of Debian into Ubuntu's CUPS package and came to the idea of why not porting this feature of libppd back into libcups. So I did so, because of not having time to do it the \"right\" way before the Feature Freeze simply as a patch on trhe Ubuntu package (a so-called \"distro patch\"). I will commit it upstream soon, but had more urgent stuff to do (see this News Flash). This means that the CUPS in Ubuntu 21.10 (Impish Indri to be released on October 14) does the same as the Printer Applications. You can send a job from your phone (or any other mobile or IoT device) to a shared CUPS queue and the standard options of the simple print dialog get taken care of. Or you can print from the command line, not knowing the PPD options, supplying the above-mentioned IPP attributes on the command line instead: Note that the print quality has to be supplied as a number, 3 for draft, 4 for normal and 5 for high quality. Content optimization is only fully applied for high print quality (so set also -o print-quality=5). The first line simply prints in color and high quality, the second monochrome (grayscale) in draft quality and the last one gives the best optimization for color photos. So please test it and enjoy printing with Ubuntu 21.10. Any feedback is welcome. I can easily correct the algorithm where needed."
+ },
+ {
+ "id": "post:OpenPrinting-News-Flash-cups-browsed-Remote-Code-Execution-vulnerability",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News Flash - cups-browsed Remote Code Execution vulnerability",
+ "url": "/OpenPrinting-News-Flash-cups-browsed-Remote-Code-Execution-vulnerability",
+ "headings": [
+ "What happened?",
+ "Overhyped",
+ "The bugs and fixes are the following",
+ "What we still will fix/improve",
+ "What should you do to get protected?",
+ "Coverage",
+ "Contact us"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/TPVUeURmOEo/hqdefault.jpg",
+ "snippet": "Exploit of a combination of several bugs - Overhyped but not that severe - Fixes already available",
+ "content": "Update: Legacy CUPS browsing now removed in cups-browsed 2.x and 1.x, report about DoS vulnerability of legacy CUPS browsing in cups-browsed, blog/podcast/video coverage On September 5 we got a GitHub security advisory (GHSA) on cups-browsed about a remote code execution. It is possible to create an emulation of an IPP printer with forged metadata to make cups-browsed auto-generate a print queue and the PPD generator of libcups or libppd create a PPD with added lines so that the foomatic-rip filter gets used and the PPD defines a filter command line for foomatic-rip which is supplied by the attacker. So we have a remote code execution (RCE) vulnerability. The reporter, Simone Margaritelli (aka evilsocket), started investigating when he discovered that cups-browsed accepts UDP packets on port 631 from any source to trigger a get-printer-attributes IPP request. He then found further bugs leading up to the remote code execution. He posted on X (formerly Twitter) on September 23 that he recently reported a severe security issue, an \"Unauthorized RCE on all GNU/Linux systems) with a CVSSv3 score (agreed on with Canonical and Red Hat) of 9.9 of 10, but not telling anything about that it was his report about cups-browsed. He also told in the post that he has spent 3 weeks on the investigations, and that a disclosure date was agreed on with the developers. The message got hidden shortly after, but one can still read it on some archiving sites. Seth Arnold of Canonical's security team made me aware of this X message on Tuesday, September 24 and this started continues conversation of me with the security team on the Canonical-internal chat, along with already ongoing conversation on GitHub and VINCE. On Thursday, September 26 I read on VINCE that the vulnerability has leaked and so we had to agree on a quick disclosure. Instead of on the originally planned disclosure on October 6 we agreed to disclose still on September 26, at 20:00 UTC. Canonical's security team has acted immediately to quickly apply the patches which Michael Sweet (author and maintainer of CUPS) had already prepared for CUPS, cups-browsed, libcups-filters, libppd, and cups-filters (in the time from the first report until then I was some days off and I was also on the Open Source Summit Europe, thanks, Michael Sweet, for stepping in, also thanks to Zdenek Dohnal from Red Hat) to the appropriate in all supported Ubuntu versions, so that at the time of disclosure most fixes were already in place. They also reported in an Ubuntu blog. They tell users what to do, from turning off cups-browsed or at least its legacy CUPS browsing support to updating their systems as the fixes were already available. Thanks a lot to Seth Arnold, Marc Deslauriers, Diogo Sousa, Mark Esler, Luci Stanescu, and more. At the time of disclosure there appeared tons of posts on Mastodon about this subject matter and I have given several answers. A good and detailed description of the vulnerability comes from Simone himself in his blog. Thanks to Simone Margaritelli for the detailed investigation and also the detailed description about how the vulnerability works. Investigators of this kind are really needed to keep free software on a high security level. This vulnerability could never have been found by automated methods like fuzzing or code analysis. Some days later, Peter van Dijk (aka Habbie, also thanks for your report) has reported another vulnerability of the legacy CUPS browsing support as a GHSA on cups-filters. It was possible to send a well-formed CUPS broadcast packet to UDP port 631 of cups-browsed, but with a port 80 URL of a web site which redirects on the port and then cups-browsed falls into an infinite loop sending HTTP requests which can only be stopped by kill -9. This vulnerability got independently discovered and treated in detail by Akamai and posted in their blog. The X post by Simone really overhyped the vulnerability. Attacks from the internet are not very probable due to the fact that servers on the internet do not have cups-browsed and CUPS installed and CUPS/cups-browsed setups are there usually only in NAT-protected local networks with desktop machines and print servers. And the remote code execution is also rather restricted, as CUPS filters are not running as root, but as the system user \"lp\" which cannot even read user's home directories. In addition, the remote code execution only happens when a user actually prints a job on the fake printer. Actually assigned scores ended up between 8.4 and 9.1. CVE-2024-47176: cups-browsed binds on UDP INADDR_ANY:631 trusting any packet from any source to trigger a get-printer-attributes IPP request to an attacker-controlled URL (GHSA) Preliminary fix cups-browsed: Turn off CUPS browsing in configuration file Preliminary fix cups-filters 1.x: Turn off CUPS browsing in configuration file Final fix cups-browsed: Remove CUPS browsing and LDAP support Final fix cups-filters 1.x: Remove CUPS browsing and LDAP support CVE-2024-47076: cfGetPrinterAttributes5() (libcupsfilters 2.x) and get_printer_attributes5() (cups-filters 1.x) does not validate or sanitize the IPP attributes returned from an IPP server, providing attacker-controlled data to the rest of the CUPS system (GHSA) Fix libcupsfilters 2.x Fix cups-filters 1.x CVE-2024-47175: In libppd ppdCreatePPDFromIPP2() does not validate or sanitize the IPP attributes when writing them to the PPD file, allowing the injection of attacker-controlled data into the resulting PPD (GHSA) Fix libppd Fix CUPS: Validate IPP attributes in PPD generator Fix CUPS: Refactor make-and-model code Fix CUPS: PPDize preset and template names Fix CUPS: Quote PPD localized strings Fix CUPS: Fix warnings for unused variables CVE-2024-47177: cups-filters <= 2.0.1 foomatic-rip allows arbitrary command execution via the FoomaticRIPCommandLine PPD parameter (GHSA, Issue) CVE-2024-47850: cups-browsed (before 2.5b1?) will send an HTTP POST request to an arbitrary destination and port in response to a single IPP UDP packet requesting a printer to be added. The request is meant to probe the new printer but can be used to create DDoS amplification attacks (on non-printer devices). This is a different vulnerability than CVE-2024-47176 mentioned above but the remedy is the same, turning off or removing legacy CUPS browsing support in cups-browsed (GHSA) Preliminary fix cups-browsed: Turn off CUPS browsing in configuration file Preliminary fix cups-filters 1.x: Turn off CUPS browsing in configuration file Final fix cups-browsed: Remove CUPS browsing and LDAP support Final fix cups-filters 1.x: Remove CUPS browsing and LDAP support The already available fixes are sufficient to prevent both exploits. cups-filters: Create hash tables for each package with Foomatic PPD files, with a hash for each command line prototype string or strings to be inserted into the prototype depending on option settings. When printing a job, foomatic-rip generates the hash of each string and checks against the table. Issues an error in log file if hash not found, telling user they would need to create hash table for their PPD. For official packages hash tables are generated during build and included in the package. This fix is still discussed. Update your system, especially take care that the packages cups, libcups, cups-browsed, libcupsfilters, libppd, and cups-filters packages get updated. Most Linux distributions should already have fixed packages available. Restart cups-browsed after the update In addition, especially if you did not yet get updates for your distro, do: Turn off CUPS browsing in cups-browsed.conf: Edit /etc/cups/cups-browsed.conf Search for the BrowseRemoteProtocols configuration option Set the option to dnssd or to none (the default value is dnssd cups) Restart cups-browsed Simone Margaritelli's blog describing the RCE vulnerability in detail Ubuntu blog from Canonical's security team, published on the day of discolsure Brodie Robertson on YouTube about the overhyped security advisory ThePrimeTime live session about Simone's blog Ubuntu Security Podcast #238 Akamai blog about DDoS vulnerability of cups-browsed Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Google-Summer-of-Code-2025-Contributors-selected-and-projects-started",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Google Summer of Code 2025 - Contributors selected and projects started",
+ "url": "/OpenPrinting-News-Google-Summer-of-Code-2025-Contributors-selected-and-projects-started",
+ "headings": [
+ "The selection process",
+ "The contributors and their work",
+ "KDE Print Manager vs. CUPS 3.x, by Tarun Srivastava",
+ "Porting pyCUPS to CUPS 3.x API and implementing it in system config printer, by Soumyadeep Ghosh",
+ "GNOME Control Center: Finalizing the New Printing Architecture for GNOME, by Kaushik Vishwakarma",
+ "Porting Printing to Zephyr, by Hubert Guan",
+ "OpenPrinting Image Output Verification Framework, by Sanskar Yaduka",
+ "Rust bindings for libcups2/3, by Mintu Gogoi",
+ "Rust bindings for cpdb-libs, by Titiksha Bansal",
+ "Utilizing OSS-Fuzz-Gen to Improve Fuzz Testing for OpenPrinting Projects, by Zixuan Liu",
+ "GTK Print Dialog: Modern dialog with built-in preview in main view, by Yash Kumar Kasaudhan",
+ "Integrating OSS-Fuzz for Go-Based and Python-Based OpenPrinting Projects, by Mohammed Imaduddin",
+ "Modernize OpenPrinting Website with Next.js, by Rudra Pratap Singh"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/S0IyScIRzb8/hqdefault.jpg",
+ "snippet": "11 Contributors on CUPS 3.x desktop integration, fuzz testing, visual analysis of print filter output, Rust support, and more ...",
+ "content": "A lot of things happened since my last post about this year's GSoC. We got a lot of applications and had to make a way to find the best candidates, we needed to line up a vast amount of mentors, we needed to rank our projects mixed with other projects of the Linux Foundation to not step on anybody's toes, we needed to get around with the actual contributor slot count we got, we needed to agree on an individual coding period with each contributors and set final submission deadlines accordingly, ... A lot of things to do to get the best out of the GSoC ... And even that we did not get as many contributor slots as we wanted to get, we are working on a wide variety of subject matters: Desktop integration of CUPS 3.x, modernizing the GTK print dialog, Rust bindings for easy printing from desktop apps written in Rust, more fuzz testing, visual analysis of print filter output for automated functional testing, not only crashes and errors, and a new web site. In this post I will go through all that journey, and also post some first reports of our contributors. And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and (new) on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Already before the Linux Foundation got selected as a mentoring organization we have started to look for contributors for this year. The first candidates appeared already in 2024, and also some contributors of last year decided to do a project with OpenPrinting this year again. In total, we got a lot of people interested in being a GSoC contributor approaching us. Many had attended one of our Opportunity Open Source conferences, 2024 in the IIT Kanpur in India and 2023 in the IIT Mandi in India and got motivated by that. We had originally posted 16 project ideas and got more than 50 candidates, with some of them also bringing their own project ideas. By average, we had 2-3 candidates per project idea, a completely new situation for us. Before, we found more or less 1 good candidate for each posted project idea and so we assigned the ideas to the candidates and had the line-up. Now we had to select from competing candidates for the projects, especially for the fuzz-testing-related ones, the OpenPrinting port to Zephyr, the GTK print dialog modernization, and the visual analysis of print filter output. Here my special thanks to the mentors, Jiongchi Yu (TTfish) and George-Andrei Iosif for fuzz testing, Iuliana Prodan for Zephyr, Alexander Pevzner for visual analysis, and Michael Weghorn, Gaurav Guleria, Kushagra Sharma, and Mohit Verma for the GTK print dialog modernization for giving additional, subject-specific assignments and doing interviews. Generally, we have let all new candidates read and watch videos about OpenPrinting and then let them build CUPS and do a modification in it so that it adds additional log lines to the log file. Passed that, we have assigned issue reports from our GitHub repos to them, or given them other coding-related tasks. We made exceptions on people we already knew, if they did GSoC with us already in a previous year or if they contributed to us another way, like voluntary work or participating in other mentorship programs with us, as in the Winter of Code. In order to assign contributor slots to each mentoring organization, Google wants the organizations to list all worthwhile proposals and rank them: 1st place, 2nd place, ... Also each ranked proposal needs to have at least 1 mentor assigned to it. And Google also asks for having a total of 2*n mentors when ranking n contributors, but does not enforce that. Google assigns a certain number of slots to each organization, but usually less than the number of proposals they lined up. The proposals then getting accepted are the ones ranked highest. For OpenPrinting we succeeded to find 33 persons registering as mentor (thanks to all of them!), and so we were good for 16 projects. We lined up all the 19 we found worthwhile running though. As we are a not a mentoring organization by ourselves, but a sub-organization of the Linux Foundation (where I am doing the org application for every year since 2008, and where I am one of the org admins) we need to add our proposals to the overall ranking. For this each of the sub-organizations ranks their proposals by themselves and also lines up mentors for their contributors. We have OpenPrinting (19 proposals, 33 mentors), Automotive Grade Linux AGL (4 proposals, 8 mentors), SPDX (2 proposals, 4 mentors), Industrial IO IIO (4 proposals, 4 mentors), Sound Open Firmware SOF (2 proposals, 2 mentors), Zephyr (1 proposal, 2 mentors), and KWorkflow (1 proposal, 2 mentors). Then I had to interweave all these individual rankings into one overall ranking in a round-robin manner, but taking into account the very different total numbers of proposals in each sub-organization. So I have taken the first of each group first, starting with the strongest (most proposals) group (OpenPrinting) and ending with the weakest (KWorkflow). After that I have picked further proposals, more often from the stronger groups less often from the weaker groups. Until I had ranked for each groups the mentor-covered number of proposals (half the number of mentors), so that if Google had given us as number of slots half the number of registered mentors, each group has full mentor coverage by itself. Only after that I have ranked the remaining ones. In total we have ranked 33 for the Linux Foundation, including 19 for OpenPrinting, with 55 mentors (33 for OpenPrinting), but, unfortunately, we got a rather low amount of slots, 21 in total, and with this we got 11 of OpenPrinting's proposals accepted. We have taken into account both importance of the subject matter for OpenPrinting and the free software ecosystem and also how well the contributor was doing during and before the selection process, like previous GSoC project, assignments, familiarization with the code base, and interaction with the developers, ... and also the proposal, naturally. Here one has also to consider whether one better gives a chance to a new contributor or whether one bets on the experience of a returning one (a person can be contributor in up to 2 GSoCs). All-in-all we got good coverage with the 11 projects which we will be running now, but on the other side there were also really good contributors under those who did not get a slot, and also disappointment by them. Unfortunately we cannot do anything about Google's decision here. Sorry if you got selected by us but not by Google's slot count. As in 2024, we got 11 contributor slots for OpenPrinting, despite having ranked 19 contributors, compared to the 13 of last year. Here is Google's announcement, with the slot counts assigned to each of the mentoring organizations and the accepted projects. This time the the Linux Foundation got again 21 contributor slots, but now with 33 ranked proposals. Thanks to all candidates for applying and providing their excellent proposals. And sorry for those who did not get selected. You all did great work and it was really difficult for us to decide, and in addition, we got less slots than expected. Also, thanks a lot to everybody who stepped up as a mentor for us. Without your valuable help we are not able to do all these great projects. And here are the accepted proposals for OpenPrinting, and also status of the contributor's work so far (in the order as we had ranked them, mentor names in bold are the principal, most active mentors): Mentors: Mike Noe, Till Kamppeter, Nicolas Fella, Zdenek Dohnal Description from proposal: The KDE Print Manager, a critical component of the KDE desktop environment, requires updates to support the advancements introduced in CUPS 3.x. This project aims to modernize the Print Manager by enabling compatibility with CUPS 3.x while maintaining backward compatibility with CUPS 2.x. The focus will be on incorporating support for IPP (Internet Printing Protocol) print destinations, which allow users to print to driverless network printers, IPP-over-USB printers, and Printer Applications without the need for traditional CUPS queues or PPD files. Tarun had already volunteered for this project for some time and is now finishing it as a GSoC project. Mentors: Bhavanishankar Ravindra, Callahan Kovacs, Till Kamppeter, Zdenek Dohnal, Kushagra Sharma Description from proposal: Currently, PyCups supports up to libcups 2.4.x. PyCups being written using the C extensions for Python, is very tough to maintain, and to implement new features in. Also, there is a very small scope of implementing automation for creating the python bindings of libcups. After PyCups is ported to libcups 3.x, I'll implement the same API for system-config-printer. So, that distros still shipping old libcups 2.4.x can slowly stop shipping the library. And libcups 2.4.x can be deprecated. Immensely helping the printing APIs and libraries. Soumyadeep has started his work ~2 weeks ago. He did first bindings for libcups3, mentored by Bhavanishankar Ravindra (Bhavi) and Callahan Kovacs. His work you find in the \"libcups3\" branch of his copy of the pycups repository. Mentors: Mohit Verma, Till Kamppeter, Zdenek Dohnal, KushagraSharma, Bhavanishankar Ravindra Description from proposal: The latest CUPS 3.x versions support only driverless printing through the new IPP Everywhere architecture. Modern printers predominantly use driverless technology, supporting IPP printing and automatically configuring themselves via CUPS. Unlike traditional setups, these IPP printers do not require a permanent print queue. However, many printers still rely on drivers (PPD + filter). To address this, the Genome Control Center (GCC) must be adapted to support both driver-based and driverless printers. While significant progress has been made, substantial work remains before this new approach can be fully integrated into GCC. The project aims to complete all remaining tasks, ensuring a seamless user experience for GCC printers while refining all aspects for the final release. Kaushik has created this GitHub repository. Mentors: Iuliana Prodan, Akarshan Kapoor, Benjamin Cabé, Till Kamppeter, Ira McDonald Description from proposal: Current driverless print servers can be complex and resource-demanding in large part since they only run on full-scale operating systems like Linux. This project aims to port the different elements of OpenPrinting's printing stack (CUPS, libcupsfilters, etc.) to the Zephyr OS for simple future print server development on embedded devices. This will consist of systematically adding Zephyr modules and commits to the OS itself for each part of the printing stack. Importantly, Zephyr replacements and ports must also be used instead of the current Linux dependencies. This leads to further investigation into the capabilities of the Zephyr OS to support technologies such as Ghostscript and print buffering. Lastly, the stack must be tested on hardware to verify functionality and view benchmarks such as power consumption. This project is a collaboration between the OpenPrinting and Zephyr sub-groups of the Linux Foundation. Hubert is progressing well with his work an he documents it in blog posts. He has also a GitHub repository with his work. Mentors: Till Kamppeter, Zdenek Dohnal, Pratyush Ranjan, Mohit Verma, Bhavanishankar Ravindra Description from proposal: Currently, OpenPrinting's testing only looks for errors or crashes; it does not automatically verify the content of print or scan output. This project uses OpenCV to create an automated tool that fills this gap. By analyzing controlled test images, the tool will verify key output characteristics essential for print quality: page completeness and order, correct orientation and scaling, expected color properties, and appropriate density/sharpness. Deliverables include the verification tool designed for integration into OpenPrinting's CI pipeline, a methodology for defining suitable test images, and comprehensive documentation. This project will significantly enhance the reliability and quality assurance of open-source printing solutions. Inspired by an openQA BoF on the GUADEC 2024 in Denver, where I learned how the GNOMies are testing the correct behavior of GUI applications in automated (CI, ...) tests, I came to the idea of doing the same with print filter output for automated testing of the print job processing. Alexander Pevzner, author of ipp-usb and sane-airscan, is also working on a behavior-accurate simulator of an IPP multi-function printer for testing print workflows and here he also suggests visual analysis of the simulator's print output, which matched my original idea somehow and so we joined our thoughts and posted this project. Sanskar got selected as contributor on this project and is enthusiastically on it. Here is his GitHub repository. It has a detailed description of his work. Mentors: Jynn Nelson, Michael Murphy, Till Kamppeter Description from proposal: This project will create comprehensive Rust bindings and idiomatic wrappers for CUPS (Common UNIX Printing System), enabling Rust applications to fully interact with printers. We'll develop a layered architecture with low-level FFI bindings, safe Rust abstractions, and a DBus/zbus service layer for secure application integration. The implementation will balance leveraging existing C code in libcups while providing memory safety and ergonomic APIs. Key deliverables include core libcups bindings, an idiomatic Rust API, async support through tokio, a secure DBus service, and integration with the Common Print Dialog Backend (CPDB) for COSMIC desktop environment compatibility Here is Mintu's work in his GitHub repository. Mentors: Jynn Nelson, Michael Murphy, Till Kamppeter, Chandresh Soni, Pratyush Ranjan, Bhavanishankar Ravindra Description from proposal: The Common Print Dialog Backends (cpdb-libs) library from OpenPrinting serves as a bridge between application print dialogs (like GTK, Qt, LibreOffice, Firefox, Chromium, etc.) and diverse print technologies (such as CUPS/IPP and cloud printing services). It decouples application UIs from backend print systems, enabling more flexible and rapid integration of new print technologies across all platforms. While it's natively written in C, bindings are required for other languages. Rust, known for its safety and concurrency advantages, currently lacks such bindings. This project aims to develop safe and idiomatic Rust bindings for cpdb-libs, enabling seamless integration of modern print backend capabilities in Rust-based applications. Titiksha's report for the first month: Project Progress Project Setup Created Rust project structure with bindgen integration Successfully generated FFI bindings for cpdb-libs (v2.3) Implemented safe Rust wrappers for core printer management functions Key Implementations Printer discovery and job submission workflows Memory-safe resource handling with proper RAII patterns Async callback translation (C → Rust) for printer updates Challenges Faced FFI Compatibility Issue: Rust 2024's stricter unsafe extern requirements Solution: Added build.rs post-processing to modify generated bindings Function Naming Issue: Mismatch between C (camelCase) and Rust (snake_case) conventions Solution: Standardized on exact C function names in FFI calls Memory Safety Issue: Proper cleanup of C-allocated resources Solution: Implemented Drop traits with null checks for all wrapper types Areas Needing Guidance Advanced Features Help needed with media/margin handling implementations Clarification on translation table management Here is Titiksha's work in her GitHub repository. Mentors: Jiongchi Yu, George-Andrei Iosif, Dongge Liu, Till Kamppeter, Shivam Mishra, Akarshan Kapoor Description from proposal: This project aims to improve fuzz testing for OpenPrinting’s C/C++ codebases by leveraging OSS-Fuzz-Gen, a new framework that uses Large Language Models (LLMs) to assist fuzz testing. While some OpenPrinting projects are already integrated into Google’s OSS-Fuzz, current fuzzing efforts achieve limited runtime coverage (e.g., only 11.84% for cups), leaving many functions untested. To address this, the project will (1) refine existing fuzzers, (2) improve corpus and dictionary quality using LLMs, and (3) generate additional fuzz harnesses with OSS-Fuzz-Gen to improve the coverage. This will enhance test depth, uncover hidden vulnerabilities, and strengthen the security of OpenPrinting projects. Our OSS-Fuzz team, consisting of Jiongchi Yu (TTfish) and George-Andrei Iosif from last year's GSoC (Report, Ubuntu Summit workshop), and now with this year's contributors Zixuan Liu and Mohammed Imaduddin (see below) added, is continuing to do great work. Zixuan has posted the following summaries of his work in the OSS-Fuzz team's Telegram group: May 26, 2025: Hi. This is a quick update on my GSoC progress this week. I’ve submitted a PR to the OpenPrinting/fuzzing repository to support oss-fuzz-gen although it is a simple modification: https://github.com/OpenPrinting/fuzzing/pull/9 If you have any suggestions or feedback, please leave a comment in the doc or in this group. Thank you! June 5, 2025: Each time oss-buzz-gen is run, several rounds of harness generation will be performed for every target function until a usable harness is generated. Each round may generate around 500~1500 prompt tokens and around 1000 completion tokens. Using my API (gpt-4o) only costs about $0.02 per round, which is not a lot, so it's alright June 16, 2025: Firstly, fuzz_ppd_gen_1, the fuzzer I added last week has achieved higher coverage: directly increasing CUPS coverage to 20%. This fuzzer has achieved good results. Based on last week's goal, I generated a total of 5 new fuzzers using my own developed tool. Three of these fuzzers have already submitted by PR. These three fuzzers are related to conflicts, options, and cache related functions, and have discovered crash related to heap overflow. However, some problems have arisen. Firstly, if I add all the new fuzzers, it will cause a decrease in the coverage of the previously effective fuzz_ppd_gen_1 (locally test). This may be related to the corpus variation rules of OSS Fuzz, or it may be related to my testing time. So @ttfish suggested that I could first submit the fuzzer to OSS Fuzz for long-term running and testing, and then analyze it if any problems arise. The second problem is that I don't know why I have called the _ppdCacheCreateWithPPD function in fuzz_ppd_gen_cache, but it has not generated coverage. I want to know how to trigger these functions. Next is my plan for next week. I plan to fix the issues in fuzz_ppd_gen_cache and start analyzing the bugs discovered by fuzzing, especially heap-buffer-overflow. June 23, 2025: I have mainly completed two tasks. The first is to fix fuzz_ppd_gen_cache. Due to the design problem of fuzzer, crashes appeared before executing more possible paths, and these crashes are actually false positives. Therefore, the fuzzers added last week did not generate effective coverage. I tried to let LLM refer to the cachebench.c file in cups to generate a new fuzz_ppd_gen_cache, which has submitted to oss-fuzz. The second is to analyze the crashes. Taking heap-buffer-overflow as an example, tracing the function call stack, I find it that this is an error sample caused by problems in the fuzzer implementation(details in the doc). So I deleted fuzz_ppd_gen_options because it has hardly help for coverage. Maybe we can also modify the source code of string.c to improve robustness (I don't know if it is necessary, because normally target functions will not get illegal strings.). Zixuan's work is going as pull requests into OpenPrinting's \"fuzzing\" repository. Here are the pull requests which are already merged. Zixuan's user name on GitHub is \"pushinl\". Mentors: Michael Weghorn, KushagraSharma, Till Kamppeter, Zdenek Dohnal, Shivam Mishra Description from proposal: We are trying to solve the problem of print dialogs in the gtk. The actual gtk contains a very simplistic approach regarding the print dialogs which need to be improved. As gtk is a parent library for most of the softwares. So its print dialogs need to be updated, as its affecting the most of the softwares relying on them. So, I am determined to solve the process of print dialog and provide it a modern look of print dialog which contains the print preview and print dialog in same pane. The steps i choose to work on came from the great research i did on the software that have this modern dialog. Especially i got attracted with the approach of the libreoffice. below are the steps : 1. Add the return button to the print preview pane in gtk. 2. Sync the print dialog setting with the print preview pane in gtk. 3. Extend the class of print preview so that other softwares could write there own algorithm for it. 4. Combine the print preview pane and print dialog into one. Here is Yash's write-up about his work so far: As for my progress, I’ve completed the second part of the timeline as outlined in the proposal. From June 1 to June 15, I focused on research and studying GTK. During this time, I discovered the dynamic nature of the print preview, confirmed by this post from the GTK community: 🔗 https://discourse.gnome.org/t/print-preview-missing-in-gtk-print-dialog-on-fresh-kali-linux-appears-after-installing-evince/29520 This helped me a lot — I found out that GTK doesn’t include a built-in PDF viewer, and instead relies on the system’s default PDF viewer. So if there’s no viewer installed, the print dialog won’t show the preview button. But once a viewer (like Evince) is installed, the preview button appears. From June 16 to 29 (second phase), I had three possible approaches: Follow the proposal and add a Return button. But the issue (🔗 https://gitlab.gnome.org/GNOME/xdg-desktop-portal-gnome/-/issues/161) shows that users don’t want extra steps. They expect the dialog and preview behavior to match other software — one dialog, one preview, no return button. Implement what the issue suggests — one preview per print dialog. Build a new UI and try integrating the logic there. I went with option 2 and successfully implemented it (video shared). Now print dialog don't get close when print preview is opened. And only one Print preview dialog can be created for that dialog. But there are still a few issues: After closing the preview pane, the preview button sometimes works and sometimes doesn’t. On Windows, the GTK dialogs are handled differently (separate files from UNIX), so I need a separate setup for that platform. From June 30 to July 14 (third phase), my focus is on synchronization. To begin, I started working on the new UI, as it might help in visualizing and debugging things side-by-side. If it doesn’t work out initially, I’ll leave the UI aside and shift my focus to fixing the core logic first. By the time the mid-evaluation starts (from July 14), I’m confident I’ll be able to fix the remaining issues and present the new UI as planned. Mentors: Jiongchi Yu, George-Andrei Iosif, Dongge Liu, Till Kamppeter, Ira McDonald, Shivam Mishra Description from proposal: The OpenPrinting ecosystem includes several utilities for driverless printing, protocol implementation, and printer management, including projects written in Go and Python. These polyglot projects currently lack fuzz testing, making them prone to undetected bugs and security issues. This project proposes integrating such polyglot OpenPrinting projects, namely ipp-usb, goipp, pycups, and pyppd, into OSS-Fuzz to enable continuous, large-scale fuzzing. The work will include evaluating current unit tests, improving coverage where lacking, identifying suitable fuzzing targets based on test coverage and risk, developing fuzz harnesses, and integrating the projects into OSS-Fuzz. This effort will help expand OSS-Fuzz coverage across OpenPrinting projects, further strengthening their overall security and reliability. Mohammed has posted the following summaries of his work in the OSS-Fuzz team's Telegram group: May 26, 2025: Summarizing the tasks that I have done so far, I have completed setting up the goipp project in the oss-fuzz repo locally with its harness located in a fork of the openprinting/fuzzing repo on my github. I have also built and ran the initial fuzzer, which can be considered as a primary fuzzing target, the harness for the Message.DecodeBytes() function. I have also identified other key target areas for fuzzing in the goipp project, which I plan to discuss with alexander in the coming week and write fuzzing harnesses for the same. Later, when the coding period begins, I plan to prepare a pr for the goipp project to integrate into oss-fuzz (this will include harnesses of the key target areas located in the openprinting/fuzzing repo along with dockerfile, build scripts and project.yaml). If I face any issues or have any doubts, I'll text in this group. Thank you June 15, 2025: Last week, as I mentioned in the meet, I discussed with Alexander, for the goipp project, finalized the fuzzing harnesses and created the pr to OSS-Fuzz. Then i started with the ipp-usb project and identified the key fuzzing areas and also created fuzzing harness for a core function that extracts string values from ipp. This week, I wrote another fuzzing harness for the xml parsing logic and wrote the build script and the dockerfile for the integration into OSS-Fuzz completing the fuzzing pipeline for the ipp-usb project. Before creating a pr to the OpenPrinting/fuzzing repo I tested and tried building the fuzzers on OSS-Fuzz locally, which failed and the reason to it was that ipp-usb is a program and cannot be imported. I couldn't figure that out yet as I was in bangalore and I'll try to resolve it as said by @ttfish this week and once fixed, I will create the initial integration PR for the ipp-usb into OpenPrinting/fuzzing. As far as the goipp initial integration PR in the OSS-Fuzz is concerned, I rebased and squashed the commits as said by @ttfish and thank you so much @iosifache for texting the maintainers and one more thing, as @iosifache said, I have also replaced with a description of what the pr does. Thank you and sorry I might not be able to attend the meeting tomorrow. And I'll get back to work as soon as I reach Hyderabad and complete the pipeline of the ipp-usb project with no build errors. June 23, 2025: I continued working on writing the harnesses of ipp-usb. Working on the not importable issue, I tried the local copy approach (copying all files source files into the fuzzing repo and using the go mod edit -replace to make it importable locally using the build file). I wrote fuzzing harness for the internal config loader, another fuzz harness that targets the IPP attribute helper to fuzz attribute value parsing logic. I also experimented with FuzzHTTPProxy to fuzz HTTP request handling by mocking the usb transport. When trying to build these fuzzing harnesses using OSS-Fuzz, the build failed each time. Issues like broken internal imports, go.mod conflicts and dependency problems were causing the build to fail. After all these struggles, I planned to switch to a (hopefully) cleaner approach by forking ipp-usb and changing package main to package usb, and using this fork in OSS-Fuzz. Another issue, regarding the introspector build fail is still un-understandable. Also, It'd be of great help if Alexander helps in better understanding of the ipp-usb project. I texted him about 6 days back but didn't get a reply back Mohammed's work is going as pull requests into OpenPrinting's \"fuzzing\" repository. Here are the pull requests which are already merged. Mohammed's user name on GitHub is \"mdimado\". Mentors: Till Kamppeter, Zdenek Dohnal, Deepak Patankar, Bhavanishankar Ravindra Description from proposal: The OpenPrinting website is an essential platform for Linux printing resources. The current system lacks modern UI enhancements and optimized SEO. Additionally, the existing Foomatic lookup page relies on SQL and dynamic web technologies, which I will be migrating to a fully static implementation. This transition will eliminate dependencies on an SQL server and a web server, with everything being managed exclusively on GitHub. This project aims to modernize the OpenPrinting website by migrating it to Next.js, a powerful React framework that ensures scalability, performance optimization, and maintainability. The transition will include: - Rebuilding the site with a modular, component-based Next.js architecture. - Migrating the Foomatic lookup page to a static page for improved efficiency. - Implementing Server-Side Rendering (SSR) and Static Site Generation (SSG) to optimize performance. - Deploying the new website with a CI/CD pipeline for automated updates and maintenance. Rudra still had exams in June and an internship afterwards. He has already done some initial work (\"... including markdown rendering for static sites, slug generation and with toc.\") but will actually start his GSoC work mid-August when his internship is done. His final submission deadline is moved to November."
+ },
+ {
+ "id": "post:OpenPrinting-News-Google-Summer-of-Code-2025-Our-most-successful-one",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Google Summer of Code 2025 - Our most successful one!",
+ "url": "/OpenPrinting-News-Google-Summer-of-Code-2025-Our-most-successful-one",
+ "headings": [
+ "The contributors and their work",
+ "KDE Print Manager vs. CUPS 3.x, by Tarun Srivastava",
+ "Porting pyCUPS to CUPS 3.x API and implementing it in system config printer, by Soumyadeep Ghosh",
+ "GNOME Control Center: Finalizing the New Printing Architecture for GNOME, by Kaushik Vishwakarma",
+ "Porting Printing to Zephyr, by Hubert Guan",
+ "OpenPrinting Image Output Verification Framework, by Sanskar Yaduka",
+ "Rust bindings for libcups2/3, by Mintu Gogoi",
+ "Rust bindings for cpdb-libs, by Titiksha Bansal",
+ "Utilizing OSS-Fuzz-Gen to Improve Fuzz Testing for OpenPrinting Projects, by Zixuan Liu",
+ "libpdfrip - a PDFio-based PDF renderer, C++-free with permissive license by Yash Kumar Kasaudhan",
+ "Integrating OSS-Fuzz for Go-Based and Python-Based OpenPrinting Projects, by Mohammed Imaduddin",
+ "Modernize OpenPrinting Website with Next.js, by Rudra Pratap Singh"
+ ],
+ "tags": [],
+ "snippet": "That's a wrap! All the 11 contributors have made it!",
+ "content": "The Google Summer of Code 2025 has come to its end! And since we started participating back in 2008 this edition was the best one for us, with 11 contributors having delivered amazing work, nobody has failed this time. What especially helped us were the Opportunity Open Source conferences (OOSC) which we are organizing in India since 2023 (IIT Mandi) and especially last year's one in the IIT Kanpur. Mandi helped us already to get 11 contributors for OpenPrinting last year, but last year's OOSC caused even more momentum. We got ~60 inquiries of interested candidates, let 40 write a proposal after passing our selection and onboarding process, and we finally selected 19 proposals to rank and ask slots for from the GSoC organizers. Unfortunately, we got only 11 contributor slots, so the 11 highest ranked got our GSoC contributors. This means that after all this effort we did not get more contributors than last year, but we could for the first time select from several candidates for many of our posted project ideas. And with this we ended up with even more excellent contributors than last year, especially nobody failed in midterm or final evaluations. They all have done all or at least most of their project work and now they are finishing off some parts or working on their code getting merged upstream. See also the details about our selection process. This is the fifth post about this year's Google Summer of Code, after the presentation of our project ideas, the Linux Foundation being accepted as mentoring organization, and the first reports from the contributors and the second reports of most contributors. In this post I will post new write-ups from the GSoC contributors, links to their official final reports and anything else interesting around their work. Thanks a lot to all the contributors who brought the development of printing with FOSS forward, mentors who stepped up voluntarily for selecting the best contributors for their area, introducing and guiding them through their project work, and to the organizers of the Google Summer of Code at Google, especially Stephanie Taylor, for their tireless work on running the program. By the way, 17 candidates have already shown their interest to get a GSoC contributor for OpenPrinting in 2026. We are already doing the onboarding and give them assignments. So it seems that we are getting more known and especially we were also successful with the OOSC 3.0 this year. And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and (new) on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions And here are the links to their final reports/work products (with links to their code) and the last write-ups about their work after the first and second news post, of all our contributors. Mentors: Mike Noe, Till Kamppeter, Nicolas Fella, Zdenek Dohnal Work product PASSED Tarun's feedback of his final evaluation: I would like to thank you all for providing the support and direction needed. OpenPrinting and KDE, mentors of both the organizations are really helpful in solving any kind of issue arising. So, what we did till last write-up? Yeah right, we had update the KDE framework for CUPS 3.x, but it couldn't be released yet because we had decided to take a little longer path. So, now we are to establish a automatic testing setup (autotests) and then include it with the CI/CD pipeline. This will reduce the hectic work of manually testing each and every function which will get updated with CUPS 3.x inclusion. Now, with the recent work done on this, we have preliminary autotests in place. I will not go into detail but I can see a pile of work that could be done for KDE on autotest, but we will first finish up the autotest part required for CUPS v3. I have done all of the part which we were supposed to do in this year's gsoc. Now we wait for the reviewers to review the PR. Once they review and I answer to their comments, only after that the KDE software will be able to move to CUPS v3. Now I am not sure how much time will they take to review, So merging the PR will take some time. Since, I am not leaving this work behind anytime soon. I am sure that if reviewing is done on time we can finish this project till year's end or before next GSOC. Only in cases that more work comes up with KDE devs deciding to change something, the work will get extended. Since, I will continue to work on this even after GSOC's end. so if the PR not get reviewed before this year's GSOC end, we will still have plenty of time to fix it. Tarun had already volunteered for this project for some time and is now finishing it as a GSoC project. Mentors: Bhavanishankar Ravindra, Callahan Kovacs, Till Kamppeter, Zdenek Dohnal, Kushagra Sharma Work product PASSED Soumyadeep's feedback of his final evaluation: Callahan, without your continuous support, I could've never been able to complete this project. All those brainstorming sessions, all those Eureka moments, all those jokes on hilarious APIs during the weekly calls, I'll surely miss them. I hope, I can continue working with you, even in future. Bhavani bhaiyaa, your support and push was one of my biggest motivators. All those sleepless nights, you calming me down, giving me a bigger picture about everything we were doing, ಧನ್ಯವಾದಗಳು ಅಣ್ಣ Till, thank you for picking me up. I'm sure, you picking me up randomly at UbuCon Asia 2024 and suggesting me the idea and then I pitching my solution, or our discussions during the night before UbuCon Asia 2025, will have a great impact in Open Printing. Soumyadeep has continued presenting his GSoC work in his blog: GSOC: PyCups3 is intelligent? GSOC: PyCups3 is Abstracting! Regarding the recent works, it was plain implementation. I went ahead and implementing more APIs related to http. Creating classes to represet c structures like http_t, http_field_t, http_addr_t etc and various enums like http_encoding_t, http_state_t etc. There was also a bit of research around simplifying initializers of these classes and getting almost true method overloading in python. This includes looking into custom modules like https://multiple-dispatch.readthedocs.io/en/latest/ and at the end getting a very simple implementation with the singledispatch apis from the functools standard library. I'll soon write a blog post elaborating this, as this goes into the fundamental concepts of object oriented programming His work you find in the \"libcups3\" branch of his copy of the pycups repository. And his final report ends with the words: So, take up cups and Stay caffeinated! ☕ Cheers Till! Mentors: Mohit Verma, Till Kamppeter, Zdenek Dohnal, KushagraSharma, Bhavanishankar Ravindra Work product PASSED Kaushik's feedback of his final evaluation: My mentor, Till Kamppeter, was incredibly helpful throughout the project. He provided clear guidance, quick feedback on merge requests, and deep technical insights into CUPS and GNOME printing architecture. His approach of encouraging exploration while providing just the right amount of direction made this experience both challenging and rewarding. In the future, mentors could perhaps organize a short weekly sync call (even 15 minutes) early in the program to ensure alignment and faster onboarding for new contributors. I’m happy to share that we’ve created our first merge request (MR) in the GNOME Control Center (GCC)! 🎉 This MR has been selected for inclusion in the upcoming GCC 50 major update, scheduled for release next year. Our contribution adds support for driverless IPP printers and printer applications, grouping associated printers in a more intuitive GUI layout. ? During development, we encountered an issue with duplicate printer entries, as the same printer could be discovered both via CUPS and DNS-SD records due to asynchronous discovery in GCC. To resolve this, we updated the GCC printer discovery API from using cupsGetDests() to cupsEnumDests(), which gives us greater flexibility and control over duplicate detection and management. Next, we plan to submit another merge request that will allow users to add printers directly within the Printer Application — without needing to open the web interface — restoring the classic CUPS-like behavior in GCC. A huge thanks to Till Kamppeter for his guidance, testing, and help in identifying edge cases throughout this process. 🔗 Merge Request Link: [Link] Mentors: Iuliana Prodan, Akarshan Kapoor, Benjamin Cabé, Till Kamppeter, Ira McDonald Work product PASSED Hubert's feedback of his final evaluation: I have had a great time working with my mentors and Org Admins, as you have always helped me with my questions on different aspects of the project and encouraged me through all the highs and lows of this extended journey. I liked that, even though there is a clear project deadline, you have been more understanding of all the changes that happen over time with the project timeline. In other words, I didn't have to necessarily be completely swamped during the last weeks like some of the PhD students I know before a paper deadline. I also like how GSoC and projects like mine have been more focused on the actual code and the journey rather than trying to show off to a conference. Hubert Provided excellent weekly summaries of his work in his blog posts. Hubert's GitHub repository of the project. I am extremely grateful for all the support I have received from my mentors in both OpenPrinting and the Zephyr Project as I continue porting the CUPS/PAPPL printing stack to Zephyr. I can now confirm that the main parts of libcups, such as the HTTP, IPP, and array APIs, are operational on Zephyr. I have been able to sort out the issues with these APIs in large part thanks to large external memory modules. However, this does mean that only microcontrollers that have extra MBs of external memory will be able to use libcups without memory issues. I have also done a bunch of testing with ippeveprinter, which is a simple print server emulator. Although I was not able to get it to process jobs correctly, I did figure out how to use Zephyr’s version of mDNS Responder to advertise the server and accept user requests. However, this does mean all mDNS functionality has to be switched to Zephyr’s API since this API and libcups’ API are incompatible as Zephyr’s API requires everything to be statically declared and linked before run time. I am currently working on using these libcups APIs and modifying PAPPL to run a simulated print server. Since there is not much time left for the project, I will have to leave some things like TLS out of the picture for now and aim to get a basic version of PAPPL that can process jobs appropriately. I have also documented my progress and what still needs to be done in my project proposal below, so that others can pick up on ironing out the remaining issues and port remaining software like ippusb_bridge. You can also look through what I have done in my blog linked below. Overall, this project has been a great learning experience for me in managing embedded devices and large software projects, and I can’t wait to see how this will be continued and adopted in the future! Proposal: https://docs.google.com/document/d/1cYL6S2JSkzY0ln1w_s3qwpm85-keB9jaVjGSwyPg5NM/edit?usp=drivesdk Blog: https://hubertyguan.github.io/GSoC-2025 Mentors: Till Kamppeter, Zdenek Dohnal, Pratyush Ranjan, Mohit Verma, Bhavanishankar Ravindra Work product PASSED Since my last update, I've significantly improved the robustness and usability of the testing framework. The biggest technical achievement was adding a dedicated filter chain testing pipeline that isolates CUPS filter processing from hardware, letting us test what gets sent to the printer without actually printing - solving the scanning/hardware confusion. I implemented error handling for edge cases that were crashing the system. The OpenCV feature matching now gracefully handles images with insufficient key points (like solid colors or simple gradients), and the texture analysis got a massive performance boost by optimizing the Local Binary Pattern calculation from pixel-by-pixel loops to vectorized operations with intelligent downsampling. I also fixed pycups integration issues that were breaking printer capability discovery across different distributions. The system now properly detects filter chains, printer modes, and PPD configurations on both Ubuntu and Fedora, with fallback mechanisms when direct CUPS API calls fail. Added a four-tier HOWTO system that progressively demonstrates capabilities: basic quality analysis (15-20 min), fast filter chain testing (5 min), comprehensive document validation, and individual algorithm exploration. Each is self-contained and verifiable. The verification infrastructure now includes automated setup checks, dependency validation, and example testing scripts that confirm everything works before users invest time. The framework handles real-world variability: different printer queue names, missing dependencies, and various CUPS configurations across distros, making it production-ready for CI/CD integration and actual print driver development workflows. Here is Sanskar's GitHub repository. It has a detailed description of his work. Mentors: Jynn Nelson, Michael Murphy, Till Kamppeter Work product PASSED During GSoC 2025, I developed cups-rs, a safe Rust wrapper for the CUPS printing system, covering most of the C API. The library provides complete printer discovery, job management with multi-document support, and advanced print options (color, duplex, quality, media). Key enterprise features include authentication callbacks for GUI applications, SSL/TLS certificate management, destination management with conflict detection, server configuration for multi-server environments, and localization support for internationalized UIs. All unsafe C FFI operations are wrapped in safe abstractions following RAII patterns for automatic cleanup. The implementation includes low-level IPP request handling, direct connection management with timeouts, and comprehensive error handling with recovery suggestions. I provided 7 working examples, integration tests, and extensive documentation. The project progressed through three versions (0.1.0 → 0.3.0), with each release adding production-ready features. The library supports all common document formats and provides type-safe enums throughout. cups-rs enables Rust developers to build printing applications and enterprise tools without unsafe C bindings, demonstrating that complex system APIs can be made safely accessible to the Rust ecosystem. The codebase uses minimal dependencies with automatic bindgen FFI generation and pkg-config integration. This work establishes a solid foundation for future async/await support and enhanced builder patterns. The library - https://docs.rs/crate/cups_rs/0.3.0 The docs in - https://docs.rs/cups_rs/latest/cups_rs/ and the code in - https://github.com/Gmin2/cups-rs Here is Mintu's work in his GitHub repository. Mentors: Jynn Nelson, Michael Murphy, Till Kamppeter, Chandresh Soni, Pratyush Ranjan, Bhavanishankar Ravindra Work product PASSED Titiksha's feedback of her final evaluation: My mentor was very supportive and approachable throughout the program. They provided timely feedback on my code, explained design decisions clearly, and encouraged me to think through problems instead of just giving direct answers. This helped me build confidence in my problem-solving and debugging skills. Overall, I’m very grateful for the mentorship—I learned a lot not only technically but also about open-source collaboration and best practices. Over the course of the Google Summer of Code 2025 program, I successfully completed the development of safe and idiomatic Rust bindings for the Common Print Dialog Backends (cpdb-libs) library under OpenPrinting (The Linux Foundation). Key Achievements Binding Generation: Generated and refined raw Rust bindings for cpdb-libs using bindgen, ensuring compatibility with cpdb-libs v2.3 and the latest Rust 2024 standards. Safe Rust Wrappers: Designed and implemented memory-safe, idiomatic Rust abstractions for core cpdb-libs functionalities, including printer discovery, job submission, and queue management. Error Handling & Resource Management: Introduced structured error handling using custom Result types and enums, and implemented RAII-based resource cleanup through Drop traits to eliminate memory leaks. Async Callbacks & Data Mapping: Translated asynchronous C callbacks into safe Rust equivalents, ensuring seamless communication between Rust and C components. Mapped complex cpdb-libs data structures into strongly typed Rust representations, improving developer ergonomics. Testing & Validation: Wrote extensive unit and integration tests to verify API correctness and stability across Linux and macOS. Validated bindings with real print workflows using sample Rust applications. Documentation & Crate Packaging: Authored comprehensive documentation, including code examples and usage guides. Packaged the bindings into a Rust crate for future publication and community use. Outcome The completed project delivers a robust, safe, and developer-friendly Rust interface for cpdb-libs, enabling modern Rust applications to leverage CUPS-based printing functionality without unsafe memory operations. It lays the foundation for future expansion of OpenPrinting’s ecosystem into the Rust community. I am grateful to my mentor and the OpenPrinting community for their guidance throughout this journey. This project has been an invaluable experience, strengthening my expertise in systems programming, FFI integration, and open-source collaboration. Here is Titiksha's work in her GitHub repository. Mentors: Jiongchi Yu, George-Andrei Iosif, Dongge Liu, Till Kamppeter, Shivam Mishra, Akarshan Kapoor Work product PASSED Zixuan's work is going as pull requests into OpenPrinting's \"fuzzing\" repository. Here are the pull requests which are already merged. Zixuan's user name on GitHub is \"pushinl\". Mentors: Uddhav Phatak, Till Kamppeter Work product PASSED Yash's feedback of his final evaluation: I am very glad and thankful to my mentors who kept a lot of patience with me and believed that I can do things. Their constant support and kindness were very special. Every single time I had any doubts or problems, they were there for me and guiding me throughout. I honestly thank my mentors because if today I feel and can say that I am a software engineer or know engineering, it is because of them only. Before that, I never worked on these kinds of software and never thought about it either. If you had read the last news post about our GSoC progress you are probably wondering that Yash's project has a completely different title now. Yash was originally selected on his proposal to modernize the UI of GTK's print dialog, especially adding an embedded preview as we already have in the dialogs of LibreOffice, Mozilla (Firefox, Thunderbird), and the Chromium Browser. He also interacted with the upstream developers, starting a thread on GNOME's Discourse platform: \"Print Preview Missing in GTK Print Dialog on Fresh Kali Linux — Appears After Installing Evince\" and in a follow-up thread \"Print dialog for GTK provided by portal - Help from GSoC contributor\" In response to this I decided to pull back from this project and to re-assign Yash to something different. I offered him some alternatives and after he had quickly studied them he settled on working on a PDF interpreter based on Michael Sweet's PDFio PDF manipulation library. The reason for developing such a PDF interpreter is to be able to once, provide one under a permissive license (Apache in our case) and second, to have an interpreter in straight C, not C++. And he started very well on this project, according to the updates he gave me in the last days: I wanted to share a quick update on my progress with the PDF renderer for the pdfio parser. It's been a fantastic learning experience so far, and I'm following the project plan sequentially to ensure everything is built solidly from the ground up. I'm thrilled to let you know that a major foundational piece is now complete: the renderer can successfully process and display all shapes and vector graphics from a PDF document. This means lines, boxes, and other drawings are rendering perfectly, which is a huge milestone! My current focus is now on the next exciting challenge: rendering text. This part is proving to be a bit tricky, but I'm actively working through it and am confident I'll have it sorted out soon. I am keeping the project board updated with all my tasks and progress. You can follow along here: https://github.com/users/vididvidid/projects/5 https://github.com/vididvidid/pdfio/tree/feature/pdf2cairo: my pdf2cairo renderer code Text is rendering sir.. it was the first preference of mine.. all the fonts and text are being rendered image renderer is half completed but there is some bug that's why image is not able to draw .. i just have to fix that bug only.. He liked this project and his new mentors: I would like to express my sincere gratitude to Uddhav Sir for his invaluable guidance, and to Till Sir for believing in my capabilities and entrusting me with this opportunity. This achievement was possible only because of their constant support and confidence in me. So diverting him to the PDF renderer was a success, especially that I had a little doubt in the beginning as a PDF renderer is a big thing and we had only half a GSoC left. Yash is motivated and wants to finish the project post-GSoC: the things that i have work on in order is .. image renderer load encoded pdf. renderer multiple pages.. your task which is multi-page pdf to the formats pwg/cup/apple raster.. Mentors: Jiongchi Yu, George-Andrei Iosif, Dongge Liu, Till Kamppeter, Ira McDonald, Shivam Mishra Work product PASSED Mohammed's feedback of his final evaluation: I am very grateful to my mentors for their guidance throughout the project. Till Kamppeter provided deep domain knowledge in printing protocols and OpenPrinting architecture, George-Andrei Iosif shared valuable insights on fuzzing methodologies and OSS-Fuzz infrastructure, and Jiongchi Yu offered detailed, step-by-step technical advice building on his previous GSoC experience. Their mentorship was both technically enriching as well encouraged independence and problem-solving. With the complex Go projects now integrated into OSS-Fuzz, the focus shifted to completing the project by addressing the two Python-based components: pyppd and pycups. This phase marked the first time Python projects from OpenPrinting were successfully integrated into OSS-Fuzz, addressing a significant security gap in the printing ecosystem. First, for pyppd, the Python library for managing PostScript Printer Description (PPD) files, I implemented 7 comprehensive fuzz harnesses. These fuzzers targeted core file processing and compression logic, which is crucial for handling the legacy PPD format. Key areas included testing PPD file archiving (fuzz_archive.py) and ensuring the integrity of compression and decompression round-trips (fuzz_compress.py, fuzz_compressor.py). I also created fuzz_ppd.py to specifically test the parser's resilience when faced with corrupted or malicious PPD data. The successful integration required careful configuration of the Python build and dependencies within the OSS-Fuzz environment. Next, I tackled pycups, the official Python bindings to the CUPS API (libcups). This was a particularly demanding challenge due to the project’s dependence on the underlying C library, which necessitated rigorous testing of the binding layer for memory safety and input validation. I developed 7 specialized fuzz harnesses for critical CUPS operations. These included fuzzers for testing authentication callback handling (fuzz_auth_callback.py), buffer management (fuzz_buffer_handling.py), and the processing of IPP requests and responses (fuzz_ipp_io.py). A notable harness was fuzz_UTF8.py, designed to test string encoding and decoding across all functions, aiming to catch issues related to improper string handling at the C/Python boundary. With the successful creation and integration of these harnesses, the fuzzing pipeline for both Go and Python OpenPrinting projects is now complete and running on OSS-Fuzz. I would like to sincerely thank my mentors Till Kamppeter, George-Andrei Iosif, and Jiongchi Yu for their invaluable guidance throughout this project. Their insights on OpenPrinting architecture, fuzzing methodologies, and OSS-Fuzz integration were instrumental in completing this work. I’m also grateful to Alexander Pevzner for his assistance in understanding goipp and ipp-usb, and to the Google OSS-Fuzz maintainers for their prompt reviews and technical support. Finally, I thank the OpenPrinting community and the Linux Foundation for maintaining the projects and infrastructure that made this contribution possible. Mohammed's work is going as pull requests into OpenPrinting's \"fuzzing\" repository. Here are the pull requests which are already merged. Mohammed's user name on GitHub is \"mdimado\". Mentors: Till Kamppeter, Zdenek Dohnal, Deepak Patankar, Bhavanishankar Ravindra Work product PASSED Rudra's feedback of his final evaluation: My mentors have been incredibly supportive throughout GSoC. They provided clear guidance when needed, encouraged independent problem-solving, and always ensured that discussions stayed constructive and technically insightful. Their feedback helped me think more deeply about architecture and scalability, and I genuinely appreciate their time, patience, and trust in me while giving me room to explore solutions. I’m grateful for the collaborative environment they fostered and look forward to continuing to contribute to OpenPrinting (The Linux Foundation). Rudra has done an internship until Aug 22 and therefore started lately. Having extended his coding period to the maximum of 22 weeks he had 11 weeks remaining to do his project and he did great work in that time. I have built the Foomatic Lookup Site, which supports lazy loading of printer data, search functionality by name and manufacturer, and is fully statically deployed on GitHub Pages. The site fetches its data from JSON files generated by merging the actual Foomatic database. The project is still a work in progress, and several contributors have joined to help complete it — I’m currently mentoring them through the development process. Not having completed his project and having many candidates interested in web development under the applicants for GSoC 2026 we plan to run one web development project again and Rudra is now working together with the candidates, to onboard them and give them assignments, with the side effect that the project work is continuing by that."
+ },
+ {
+ "id": "post:OpenPrinting-News-Google-Summer-of-Code-2025-Project-Ideas-List-posted",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Google Summer of Code 2025 - Project Ideas List posted!",
+ "url": "/OpenPrinting-News-Google-Summer-of-Code-2025-Project-Ideas-List-posted",
+ "headings": [],
+ "tags": [],
+ "snippet": "15 amazing project ideas - Desktop, KDE, GNOME, Security, OSS-Fuzz, image content recognition ...",
+ "content": "At OpenPrinting we are full steam in the preparations for the Google Summer of Code 2025! Everybody in our team was looking for what we will do next and what can make up an exciting GSoC project ... We ended up with a list of 15 project ideas, of a wide variety of areas: Desktop, security, PDF rendering, and even the automated recognition of the graphical content of a rasterized page. We have already started looking for contributors end of last year, and many enthusiastic contributor candidates are already chatting with us, watching our videos, reading our introductions, studying our code, doing onboarding exercises ... ... and they are eagerly waiting for the project ideas we will post for this year. And here we go, with our official GSoC 2025 project idea list. And this is a quick overview of what we are offering: Qt Print Dialog: Modernize the user interface GTK Print Dialog: Modern dialog with built-in preview in main view KDE Print Manager vs. CUPS 3.x Port pyCUPS to CUPS 3.x API + Apply the new pyCUPS to system-config-printer Extend PDFio to be a PDF renderer/displayer Utilizing OSS-Fuzz-Gen to Improve Fuzz Testing for OpenPrinting Projects Integrating OSS-Fuzz for Multi-Lingual OpenPrinting Projects Fuzz-based testing of printing protocols Security Auditing for OpenPrinting Projects Behavior-accurate simulation of multi-function printers (printer + scanner) Image output evaluation for testing of print/scan job processing Rust bindings for libcups2/3 Error response pop-up support for CPDB CI Testing programs for libpappl-retrofit and libppd cups-filters: Create OCR filter to deliver scans as searchable PDFs And if you have your own idea, no problem. In any case, if you want to participate, please contact us immediately, do not wait for the official application time window at Google's GSoC site. Contact us and you will learn about OpenPrinting, our work, our projects, ... you will chat with our developer community, work on issues, ... and we will help you on writing your proposal. Let us all have a great Google Summer of Code this year! And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Google-Summer-of-Code-2025-The-Linux-Foundation-is-accepted-as-mentoring-organization",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Google Summer of Code 2025 - The Linux Foundation is accepted as mentoring organization",
+ "url": "/OpenPrinting-News-Google-Summer-of-Code-2025-The-Linux-Foundation-is-accepted-as-mentoring-organization",
+ "headings": [],
+ "tags": [],
+ "snippet": "The LF is in and so OpenPrinting as part of it will mentor again.",
+ "content": "Now it is official and we do not need to tell any more to any interested contributor candidate \"If we get accepted ...\". We welcome contributors for OpenPrinting for the 17th time now! Already near the end of 2024, well before applying as mentoring organization for 2025, even before all of our GSoC 2024 projects have been completed, we have already watched out for contributors for this year, giving them onboarding materials, first assignments, talked about our fields of work with them ... A month ago, before the application window for mentoring organizations opened, we published our project ideas list. This brought in another bunch of people contacting us to express that they want to get a GSoC contributor in our organization, some have even brought their own idea. If you like to participate in the GSoC as a contributor for OpenPrinting, please contact us ASAP (contact info below and on the project idea list) and do not wait for the official application window. We need to know you and your skills, we need to involve you in our developer community, we also will help you to write your proposal, ... If you just post a proposal without contacting us before, your chances to get selected are not very high ... We also need mentors, if you like to help us mentoring our contributors please tell us and also which projects/areas you want to mentor for. So please speak up and be a part of an amazing GSoC with us! And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Google-Summer-of-Code-2025-The-amazing-work-is-going-on",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Google Summer of Code 2025 - The amazing work is going on!",
+ "url": "/OpenPrinting-News-Google-Summer-of-Code-2025-The-amazing-work-is-going-on",
+ "headings": [
+ "Voluntary contributions",
+ "The contributors and their work",
+ "KDE Print Manager vs. CUPS 3.x, by Tarun Srivastava",
+ "Porting pyCUPS to CUPS 3.x API and implementing it in system config printer, by Soumyadeep Ghosh",
+ "GNOME Control Center: Finalizing the New Printing Architecture for GNOME, by Kaushik Vishwakarma",
+ "Porting Printing to Zephyr, by Hubert Guan",
+ "OpenPrinting Image Output Verification Framework, by Sanskar Yaduka",
+ "Rust bindings for libcups2/3, by Mintu Gogoi",
+ "Rust bindings for cpdb-libs, by Titiksha Bansal",
+ "Utilizing OSS-Fuzz-Gen to Improve Fuzz Testing for OpenPrinting Projects, by Zixuan Liu",
+ "GTK Print Dialog: Modern dialog with built-in preview in main view, by Yash Kumar Kasaudhan",
+ "Integrating OSS-Fuzz for Go-Based and Python-Based OpenPrinting Projects, by Mohammed Imaduddin",
+ "Modernize OpenPrinting Website with Next.js, by Rudra Pratap Singh"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/AAeUseU35Cc/hqdefault.jpg",
+ "snippet": "The contributors have passed the midterm evaluations and their projects are taking shape ... And we also have some volunteers!",
+ "content": "We are well in the middle of our journey now and everybody is doing great. This is the forth post about this year's Google Summer of Code, after the presentation of our project ideas, the Linux Foundation being accepted as mentoring organization, and the first reports from the contributors we present now the second reports of most contributors. In this post I will not only post write-ups of the actual GSoC contributors but also mention some valuable work contributed voluntarily. And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and (new) on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Unfortunately, we did not get many contributor slots compared to the number of proposals we have ranked, but fortunately, we got some voluntary contributors. Modernization of the UI of the Qt print dialog First, Abrar Nasir Jaffari, has done good work on the completion of the merge requests for the CPDB support in of the Qt print dialog GSoC project of Gaurav Guleria back in 2022 and created a pull request for the current code base of Qt. He plans to do the modernization of the UI of the Qt print dialog a GSoC project idea for which we did not get a contributor slot this year. He has also an eye in our Fuzz testing activity. He writes: Qt CPDB integration update: ✅ COMPLETED: Applied Gaurav's CPDB patch to Qt 6.8 All testing passed (printer enumeration, IPP communication) IPP emulator verified: \"Get-Printer-Attributes successful-ok\" PR created: https://github.com/qt/qtbase/pull/122 🔧 CURRENT STATUS: CLA signed ✅ Fixing merge conflicts (4 files in printsupport/) Should be ready for Qt maintainer review within hours 📊 TEST RESULTS: Printer discovery: ✅ Working IPP options (not PPD): ✅ Verified Print job submission: ✅ Success cpdb-text-frontend consistency: ✅ Confirmed 🔗 VIEW PR: https://github.com/qt/qtbase/pull/122 Next: Resolve conflicts → Qt maintainer review → Begin modernization phase Scanning support in PAPPL/Scanner Applications Akarshan Kapoor had worked on scanning support in PAPPL (to get Scanner Applications for sandboxed packaging of scanner drivers) in GSoC 2023 and 2024 and as he did already 2 GSoC with that he is not eligible as contributor any more. Kshiitij Sharma has stepped up as a volunteer to finish the project together with Akarshan. PDF renderer/displayer based on PDFio And Uddhav Phatak, contributor in the GSoC 2024, on Replace QPDF by PDFio as PDF manipulation library in libcupsfilters, after getting the Pull Request of his work merged, wants to create a PDF renderer/displayer based on PDFio voluntarily, a project he applied already for in this year's GSoC, but we did not get enough contributor slots from Google. This would be the first PDF renderer under a permissive license for easy inclusion of a PDF viewer for a preview in the print dialog GUI toolkit libraries. And here is the second round of write-ups from our GSoC contributors. The descriptions of the projects you find in the first round of contributor reports. Mentors: Mike Noe, Till Kamppeter, Nicolas Fella, Zdenek Dohnal The migration involved refactoring the KDE Print Manager codebase to adopt the updated CUPS 3.x interfaces. This includes replacing deprecated functions, updating to the new data types and enums, and adjusting function calls to align with the asynchronous and modernized APIs introduced in CUPS 3.x. By making these changes, the Print Manager can now seamlessly work with the latest version of CUPS while preserving backward compatibility with its existing features. This ensures that users will not experience any regression in functionality. Now, we have to add the unit test for all the previous and newer functionality of printer manager for automated testing before moving ahead with CUPS related changes. Tarun had already volunteered for this project for some time and is now finishing it as a GSoC project. Mentors: Bhavanishankar Ravindra, Callahan Kovacs, Till Kamppeter, Zdenek Dohnal, Kushagra Sharma Soumyadeep has presented the first half of his GSoC project work in his blog article \"GSoC: Until Midterm, August 2025\". He starts with a short historical background and the reasoning why he switched from the C extensions in the current pyCUPS to CFFI (C Foreign Function Interface): Back in the day (almost 15 years ago!), Tim Waugh wrote the first version of pycups as a C extension module for Python. That worked well, but like all old code, it aged… let’s just say, not like fine wine. After Tim, Zdenek took over as maintainer, but with multiple projects of OpenPrinting and other projects in the mix, there wasn’t much room to modernize PyCups2 for him. Fast forward to the release of libcups3 — OpenPrinting needed a shiny new pycups, but the old codebase was a bit too… tangled. It was all C extensions, hard to read, harder to extend, and basically a maintenance nightmare. That’s where I stepped in and pitched a hybrid solution: 👉 Use CFFI (C Foreign Function Interface) to call libcups APIs directly from Python. 👉 Keep the library written mostly in pure Python. Why? Because: Python code is easier to read. Easier to extend and manage. And let’s be honest — no one wants to debug a decade-old C extension unless they absolutely have to. After that he wrote how he exactly proceeded and he concluded with: And yes, the work is still ongoing. So stay tuned… or better yet, stay caffeinated. ☕ His work you find in the \"libcups3\" branch of his copy of the pycups repository. Mentors: Mohit Verma, Till Kamppeter, Zdenek Dohnal, KushagraSharma, Bhavanishankar Ravindra The main view of the \"Printers\" module of the GNOME Control Center is nearly completed and it needs only minor fixes and adjustments. As required by the GNOME developers for feature requests the new feature has to be presented on GNOME's Discourse and Kaushik has posted it here and naturally he also did a merge request. For his development work Kaushik is now using this GitLab repository and his current code is in the curr branch. Do not use his GitHub repository linked in my previous blog. And for testing, do not just directly use your system environment, but use a container with GNOME-dev Fedora 43 distro as defined build environment, following these instructions, but create the container with the command: Mentors: Iuliana Prodan, Akarshan Kapoor, Benjamin Cabé, Till Kamppeter, Ira McDonald Hubert continues to progress well with his work summarizes what he did in weekly blog posts. He has also a GitHub repository with his work. Mentors: Till Kamppeter, Zdenek Dohnal, Pratyush Ranjan, Mohit Verma, Bhavanishankar Ravindra Currently this is what I implemented test_document_pipeline.py Purpose: Document-focused testing pipeline for virtual printers Generates multiple test document types (text, images, mixed content) Sends documents to CUPS for processing Waits for processed files to appear in ~/gsoc/openprinting/PDF/ Converts both original and processed documents to PNG images Compares them using enhanced image analysis algorithms Generates HTML reports with visual comparisons and quality metrics
Used for: Testing document rendering quality and content preservation print_quality_pipeline.py Purpose: Complete automated print quality testing system
Takes only printer queue name as input parameter Automatically discovers printer capabilities, modes, and filter chains from PPD files Generates 37 comprehensive test images targeting specific quality aspects Processes each image through detected CUPS filter chains for each printer mode Key difference: Tests filter chain output directly (not physical printing) Compares original images with filter-processed results using 11+ algorithms
Used for: Complete printer driver validation and filter chain correctness testing Here is Sanskar's GitHub repository. It has a detailed description of his work. Mentors: Jynn Nelson, Michael Murphy, Till Kamppeter Here is Mintu's work in his GitHub repository. Mentors: Jynn Nelson, Michael Murphy, Till Kamppeter, Chandresh Soni, Pratyush Ranjan, Bhavanishankar Ravindra Since my last update, I have made steady progress on the Rust bindings. After completing the setup and generating the raw bindings, I moved forward with implementing safe Rust wrappers for the core cpdb-libs functions. These wrappers focus on providing idiomatic Rust abstractions while ensuring memory safety through Rust’s ownership and borrowing rules. I have implemented functionality for printer discovery, job submission, and queue management, all wrapped in a type-safe API to minimize unsafe blocks. Error handling mechanisms have been introduced using Result types and custom error enums to better integrate with Rust’s ecosystem. Additional wrapper functions have been developed to handle print job management and authentication, ensuring that key cpdb-libs features are exposed cleanly to Rust applications. I have also refined the API design to make it more developer-friendly, using strongly typed structures instead of raw pointers wherever possible. Currently, I am finalizing the type-safe API for common CUPS functionalities and ensuring that the abstractions are both safe and efficient. This includes careful mapping of C data structures to Rust equivalents while avoiding unnecessary performance overhead. The next steps will involve writing unit tests for the implemented modules to ensure stability and correctness before moving on to integration testing with sample Rust applications. I will also commit and push the updated code to GitHub shortly so that you can review it. Here is Titiksha's work in her GitHub repository. Mentors: Jiongchi Yu, George-Andrei Iosif, Dongge Liu, Till Kamppeter, Shivam Mishra, Akarshan Kapoor The initial goal was to integrate the OpenPrinting projects into OSS-Fuzz-Gen in order to generate more fuzzers and improve code coverage. However, during practice I identified some major limitations of OSS-Fuzz-Gen: The biggest flaw is that when a YAML defines multiple functions, OSS-Fuzz-Gen creates a separate fuzzer for each function. This makes it hard to capture the relationships of functions called —— which limits coverage. Besides, OSS-Fuzz-Gen is highly encapsulated and heavy. Even minor issues like network instability can cause the entire pipeline to fail. It also generates many redundant Docker images. To address these issues, I developed light-fuzz-gen (https://github.com/pushinl/light-fuzz-gen), with the aim of eventually integrating it back into OSS-Fuzz-Gen. (Since the workflow of OSS-Fuzz-Gen is overly complex at the moment, light-fuzz-gen is being used separately for now.) In addition, I experimented with combining OSS-Fuzz-Gen, light-fuzz-gen, and AI-assisted IDE tools. This approach allowed me to generate a large number of harnesses and seeds, which significantly improved the code coverage of the OpenPrinting project. So far, I have generated a large number of fuzzers and actually added 6 effective. In particular, coverage for cups increased from 11% to 30%, and coverage for libcups improved from 14% to 17%. (https://introspector.oss-fuzz.com/project-profile?project=cups) The biggest challenge remains ensuring that fuzzers generated by LLMs can pass compilation and linking successfully. At present, I am encountering difficulties with the Makefile build process of cups-filters, and I am actively working on resolving this issue. Zixuan's work is going as pull requests into OpenPrinting's \"fuzzing\" repository. Here are the pull requests which are already merged. Zixuan's user name on GitHub is \"pushinl\". Mentors: Michael Weghorn, KushagraSharma, Till Kamppeter, Zdenek Dohnal, Shivam Mishra With guidance from my mentors and Till Sir, I successfully developed a custom GTK-based preview pane using Poppler library for PDF rendering. This component is fully integrated into the application and functioning as intended. This update also resolved an earlier issue: previously, clicking the “Preview” button in the print dialog would close the dialog. Now, the print dialog behaves like a modal window — it remains active until the preview pane is closed. This means users no longer need to repeatedly reopen the print dialog when making preview changes. I have now begun developing a combined print dialog with an integrated print preview. Rather than creating a new print dialog from scratch, I’m embedding the custom preview pane into the existing GTK print dialog, using GTK’s native embedding capabilities. My current focus is on adapting the preview pane into an embeddable component fully compatible with the GTK print dialog. For now, the preview will only update when users click the “Preview” button, as it does not yet refresh automatically when settings change. Yash has posted about his work on the internet a few days ago, on Reddit and on LinkedIn. His work is available on Github, note that main is the original, unchanged code, and the other branches are Yash's changes. Discussion on GNOME's Discourse. Mentors: Jiongchi Yu, George-Andrei Iosif, Dongge Liu, Till Kamppeter, Ira McDonald, Shivam Mishra Following up from my last update, I continued my work on fuzzing ipp-usb but eventually moved away from the original “import as a library” approach. This approach had caused persistent build failures due to unexported types and methods, as well as libusb CGO linker errors, when attempting to fuzz functions like sanitizeIppResponse. Even after exporting the required methods and struct fields, importing the usb package still pulled in the USB I/O layer, which depended on hardware-specific libusb functions that were difficult to satisfy in the OSS-Fuzz container environment. After discussing this with Alexander, we agreed that turning ipp-usb into an importable Go package was not practical since it is architecturally a standalone program. The only realistic way to fuzz it would be through its external HTTP-over-USB interface, which normally requires a real IPP-over-USB device. The ideal solution would be to create a virtual IPP-over-USB device simulator, which would allow fuzzing without relying on actual hardware. I began working on this by experimenting with usbip and the VirtualUSBDevice project to simulate an IPP-over-USB device. The goal was to implement a black-box fuzzing setup in which the fuzzer feeds input to the simulated device, the ipp-usb daemon runs and connects to it, and the fuzzed data is injected into the communication loop for processing. This architecture would allow monitoring the entire interaction for crashes while avoiding direct hardware dependencies. As part of this setup, I successfully created the required build.sh and oss_fuzz_build.sh scripts to compile both the ipp-usb daemon and the emulator. With these changes, the build for both AFL++ and libFuzzer engines now completes successfully without the previous linker errors. At runtime, however, AFL++ failed because it expects a binary fuzz target, whereas my setup was driven by a shell script. My initial plan was to create a small C++ wrapper to bridge the gap, but instead I decided to switch to libFuzzer, which provided a cleaner and simpler implementation for the black-box approach. With libFuzzer, I was able to write Go-native fuzz drivers that directly launch the ipp-usb binary and communicate with it during fuzzing. I implemented three main drivers: daemon_fuzzer.go, which starts the ipp-usb binary and fuzzes its /ipp/print HTTP endpoint with malformed requests; usb_fuzzer.go, which targets USB protocol parsing logic; and http_client_fuzzer.go, which fuzzes the HTTP client against malformed printer responses. This new setup now runs without the earlier importability or linking issues and keeps the fuzzing pipeline entirely black-box while still targeting key functionality in ipp-usb. I have created a PR to OSS-Fuzz for this integration. Links: OSS-Fuzz PR: https://github.com/google/oss-fuzz/pull/13815 IPP-over-USB emulation: https://github.com/OpenPrinting/go-mfp/tree/master/proto/usbip Mohammed's work is going as pull requests into OpenPrinting's \"fuzzing\" repository. Here are the pull requests which are already merged. Mohammed's user name on GitHub is \"mdimado\". Mentors: Till Kamppeter, Zdenek Dohnal, Deepak Patankar, Bhavanishankar Ravindra Rudra is concluding his internship this week (Aug 22). He will actually start his GSoC work now. His final submission deadline is moved to November."
+ },
+ {
+ "id": "post:OpenPrinting-News-January-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - January 2020",
+ "url": "/OpenPrinting-News-January-2020",
+ "headings": [
+ "Google Summer of Code 2020",
+ "Google Summer of Code 2019",
+ "Avahi local service support",
+ "Driverless scanning",
+ "Printing Stack Snap",
+ "CUPS",
+ "cups-filters",
+ "ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "Driverless scanning and AirScan, ippusbxd problems solved, cups-filters 1.26.2 released, lots of bug fixes for cups-browsed, GSoC 2020 org application for the Linux Foundation submitted and project idea list posted",
+ "content": "The application period for mentoring organizations has started on Jan 14 and we have submitted our application for the Linux Foundation as mentoring organization. Along with this we have posted our project ideas list with a total of 16 projects and within these there are 10 dealing with Printer and Scanner Applications. We still need to (preliminarily) assign mentors to the projects. We are currently contacting former students to ask them whether they want to mentor and if yes, which projects. We have started looking for students for this yaer and some are already working on assignments. Tanmay Anand is working on the Common Print Dialog Backends (CPDB) support for the GTK print dialog which he did not finish withing the GSoC. Here is his GitHub repository. Trent Lloyd has given another sign of life in the localhost-support issue on GitHub. This time he tells that he will merge the patch but fix this issue first. This was on December 22, 2019, after that nothing more happened. There is no IPP Scan implemented yet but in December, during the holiday season there came up projects of Linux support for Apple AirScan, or eSCL. eSCL is the HTTP-based protocol which Apple uses for AirScan, which is available on all multi-function printers which also do AirPrint, intended to allow scanning from Apple's mobile devices with the iOS operating system. The specifications of eSCL are not published but as an HTTP-based protocol it was not that difficult to reverse-engineer for the authors of the eSCL-related software. There are two (independently developed) SANE backends for using these scanners: \"escl\" (small, light, basic, already included in SANE 1.0.29) and \"airscan\" (complete functionality). There is also an AirScan server, AirSane, which is a SANE frontend which emulates an AirScan scanner scanning on any physical scanner supported by SANE. I have worked a lot with the two maintainers of the backends to get my HP DeskJet 2540 Ink Advantage (a cheap multi-function device with AirPrint) scanning with them (and without need of HPLIP). I tested not only via network (Wi-Fi) but also via USB, using ippusbxd and also got it working this way. One must note that the IPP-over-USB standard is not strictly about IPP but actually defines an HTTP-over-USB connection, to allow for extra functionality like web administration interfaces. The maintainers of the backends also investigated ippusbxd and its shortcomings. Thierry Hucahrd, maintainer of the \"escl\" backend (originally created by Nathan Touboul under Thierry's mentorship) even contributed DNS-SD advertising of the scanner part to ippusbxd and Alexander Pevzner, author of the \"airscan\" backend replaced ippusbxd altogether in a few hours. His ipp-usb, written in Go, fixes paractically all the problems of ippusbxd (Issues #9, #14, and #15). Currently he is working on doing the DNS-SD advertising correctly (Issue #11) in his ipp-usb project. Even if AirScan/eSCL is not PWG's IPP Scan, the code of the mentioned software can be a good base for implementing IPP Scan both as a client (SANE backend) and a server (Scanner Application). We are contacting the authors for a possible GSoC participation. Also good news is that 100s (1000s ?) of scanners in modern multi-function devices will soon \"just work\" with regular Linux distributions. There is no new release but I have done a bigger overhaul (on the GitHub repository): CUPS 2.3.1 cups-filters 1.26.2 QPDF 9.1.0 Added Ghostscript (9.50) as main PDF renderer, kept Poppler as backup Now based on Ubuntu Core 18 More debugging options Bug fixes The snap is working well now, including the integrated cups-browsed. Note that when running CUPS in a snap one cannot add classic drivers consisting of filters and PPDs. Drivers can only get added in the form of Printer Applications. No further releases. By the way, I have it currently working well in the printing-stack-snap. Currently released is 1.26.2. 1.26.2: Bug fix release mainly to make cups-browsed correctly working with a CUPS daemon on a non-standard port, and also for cups-filters smoothly building with GCC 10 1.26.1: Bug fix release, to make the cups-browsed-generated local print queues actually work on all OS distributions and to get legacy (not actually designed for driverless IPP) printers better working Good news! As already told earlier here in the section about driverless scanning we did intensive tests of ippusbxd with scanning (Apple AirScan) found several problem and Alexander Pevzner, author of the \"airscan\" SANE backend, wrote a complete replacement for ippusbxd in Go in a few hours, named ipp-usb. It fixes most long-standing issues (#9, #14, and #15) and Alexander is currently working on correct DNS-SD advertising, based on polling the device via HTTP/IPP and not only on the USB device ID (Issue #11). ippusbxd received some pull requests from Thierry Hucahrd, maintainer of the \"escl\" backend, DNS-SD advertising of the scanner part."
+ },
+ {
+ "id": "post:OpenPrinting-News-January-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - January 2021",
+ "url": "/OpenPrinting-News-January-2021",
+ "headings": [
+ "Google Summer of Code 2021",
+ "Linux Foundation Mentorship Program",
+ "PostScript Printer Application",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "PAPPL 1.0.1, PostScript Printer Application, GSoC 2021, LFMP projects ended, CUPS, cups-filters",
+ "content": "The time window for the mentoring organizations to apply will be Jan 29 - Feb 19, 2021. See also the complete timeline. We will again apply for the Linux Foundation as mentoring organization, as in the previous years, OpenPrinting being one of the sub groups. We are still looking for project ideas to get a good number lined up before applying. As mentioned already in October student projects will only be half the time (6 weeks). So this has to be taken into account and larger projects we should consider to run under the Linux Foundation Mentoring Program instead of GSoC. Our IPP Scan LFMP project has ended, with both Abhik Chakraborty and Rishabh Arya having completed their work successfully and preparing their final reports. Their work of adding IPP Scan as a server to PAPPL is currently available in Abhik's GitHub repository and Rishabh's earlier work on sane-airscan in the IPP Scan repository of sane-airscan. The development of the PostScript Printer Application is going on and has driven the development of PAPPL forward. The PostScript Printer Application got several new features: Extra per-printer web interface page \"Device Settings\" for configuration of which optional hardware add-ons are actually installed (\"Installable Options\" group in the PPD files). The user selects which add-ons (extra trays, duplex unit, finishers, ...) are installed and the options and choices on the \"Printing Defaults\" page and also the capabilities reported as response to a get-printer-attributes IPP request from a client get appropriately adapted. Polling add-on setup and option defaults from the printer, triggered by buttons on the \"Device Settings\" web interface page. New \"Add PPDs\" web interface page for the user to add extra PPD files to the Printer Application, to use PostScript printers not supported by the already included PPDs. Especially important when the PPD for a printer is not available under a free license. Support for collated copies (PDF or PostScript input only) Support for custom page sizes (but currently the size can only be set in inches). Made \"Identify Printer\" work, simply by sending a zero-page job with a certain delay between beginning and end, to make the printer light up its display and make noise (and perhaps also show job info on the display). Next steps will be: When auto-selecting driver prefer user-added PPDs (the user added them because he wants to use them) and also prefer PPDs in the system's language or at least in English. Display results of PPD upload: Errors, warnings, successful uploads, issue a warning also for PPDs with *cupsFilter(2): ... lines. Display all user-added PPD files with checkboxes for deleting them. Ignore PPD options which do not have PostScript or PJL code snippets for the option choices. With appropriate features added to PAPPL we will be able to also add the following: Make Snap fire up Printer Application automatically as daemon and Printer Application set up USB printers automatically when they get connected (needs support in PAPPL. Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. As other retro-fitting Printer Applications also use most of what we have in the PostScript Printer Application now (as PPDs are used) I am thinking about renaming the \"ps-printer-app\" project into \"retro-fit-printer-app\", and adding conditional compiling to activate and de-activate the appropriate pieces of code for the actual Printer Applications: PostScript, Foomatic, Ricoh, HPLIP, ... and create appropriately named projects (like \"ps-printer-app\") on the GitHub only for the snapping and putting into the Snap Store. Currently released is 2.3.3op1. This release made it already into Debian and Ubuntu. Fedora/Red Hat is using the OpenPrinting fork of CUPS, too, and we already have some contributions from Zdenek Dohnal from Red Hat, meaning that the patches of the different distributions get merged in the fork. Currently released is 1.28.7. On the way towards 2.0.0 and driven by the further development of the PostScript Printer Application I have added the following new feature: Let the filter functions not load the PPD and not mark options in the PPD files to make them better usable with Printer Applications and to avoid race conditions in filter chains. Important bug fixes, applied to both 1.x and 2.x are The driverless utility does not check the printers for driverless support quality any more. Each printer got polled with up to 3 get-printer-attributes IPP requests and this takes significant time, especially when there are many printers, making CUPS timing out and do not show any available driver at all. In the PPD generator for setting up driverless IPP printers with CUPS prefer Apple Raster instead of PDF due to compatibility problems with some printers. 1.28.7: Bug fix release to remove the support quality check from the \"driverless\" utility to do not break CUPS' PPD listing facility and several fixes for generating PPDs for driverless printers Currently released is 1.0.1. Michael Sweet has now issued a first bug fix update of PAPPL, version 1.0.1. Many bug fixes are resulting from Coverity and also from my further development of the PostScript Printer Application. See also the currently open and closed issues of PAPPL. Didier Raboud, printing maintainer at Debian, is already starting on packaging PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-January-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - January 2022",
+ "url": "/OpenPrinting-News-January-2022",
+ "headings": [
+ "Google Summer of Code 2022",
+ "Approaching cups-filters 2.0",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "CUPS Snap",
+ "LPrint",
+ "PDFio",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "GSoC 2022 timeline, approaching cups-filters 2.x, PAPPL 1.1.0, LPrint 1.1.0 PAPPL_based, PDFio 1.0.0, cups-filters 1.28.11",
+ "content": "Save the dates! The timeline for 2022 is out! Mentoring organizations can submit their applications in the time from February 7 to February 21. We will apply again with the Linux Foundation. Code contributor (not only students) applications are accepted from April 4 on, up to April 19, and coding starts on June 13, and either ends on September 4 if the work was done in the standard period, or on November 13 if the extended period was made use of. Now we need to write up our project ideas for the organization application. Main work areas for 2022 are: Complete the scanning support in PAPPL and create a retro-fit framework to convert SANE drivers into Scanner Applications Create a GUI to find Printer Applications for discovered non-driverless printers and set them up Common Print Dialog Backends in GTK, QT, ... print dialogs Get Braille embosser support of cups-filters into a Printer Application Switchover of pdftopdf() and bannertopdf() to from QPDF to PDFio (?) We are also already looking for contributor candidates and as part of our community onboarding program we have assigned GitHub issues, mainly of cups-filters to them. Several are investigating the issues and working on fixes and so helping us towards the cups-filters 2.0 release. Currently, I am doing a lot of testing, bug-fixing, cleaning-up, polishing, ... to prepare the release of cups-filters 2.0. Before doing this release, the second generation of cups-filters, I still want to discuss some points in order to optimize the release. I have tried to initiate this discussion with a post on the OpenPrinting mailing list but, unfortunately, did not get a single answer. So I am re-posting the text here: With the background of CUPS 3.x, planned to get released 2 years from now, not supporting PPD files any more and only considering driverless IPP printers, I have changed the architecture of cups-filters, converting filter executables (CUPS filters) into filter functions (library functions doing a filter's task, with standardized call scheme/interface) so that the code of the filters is preserved but they get more universally usable. In addition I have created some auxiliary functions (partially filter functions by themselves) to call filter functions in a chain, feed data into a filter function through a pipe, call classic CUPS external filter/backend executable wrapped into a filter function, save data stream between chained filter function calls into a file for debugging, ... Perhaps you have followed all this development here in the news posts or in the GIT repository of cups-filters. With this I was especially able to create Printer Applications retro-fitting classic CUPS printer drivers (Snap Store), an important step to be able to switch to a PPD-less and driverless CUPS without dropping support for legacy printers. Now I am also thinking about making use of the filter functions somehow in CUPS, both to get improvement in the upcoming 2 years where CUPS still supports PPD files and classic drivers and also in PPD-less CUPS 3.x, where data-format conversions are still needed, as for example print jobs usually come in PDF but it is not required for a driverless IPP printer to support PDF. Also implementation of functionality like N-up or flattening filled PDF forms (both tasks currently done by pdftopdf) is needed in CUPS 3.x. We should do our best to avoid duplicate code in OpenPrinting and not re-invent the wheel. \"universal\" filter for CUPS As a first approach to improve PPDish CUPS 2.4.x and 2.5.x I have run the GSoC project of a universal CUPS filter, where one single CUPS filter executable does all the filtering for a job by calling filter functions, in a chain if needed. This reduces the number of external executable calls by CUPS vastly, as normally CUPS calls for each filter to run first the cups-exec helper program and cups-exec then calls the filter executable, making up 2 external executable calls per filter. The filter function chaining in the universal CUPS filter still does a fork for each filter function though and pipes the print data from filter function to filter function. Also filters of printer drivers and CUPS backends are not part of the universal filter and need to get called separately by CUPS. The disk space saved is low, as with cups-filters 2.x each filter executable in /usr/lib/cups/filters/ is only a little code stub calling the actual filter function in libcupsfilters, Also the universal filter still needs a fix to work correctly with PPD files which use \"cupsFilter2\" instead of \"cupsFilter\" lines. So it is a little bit of a question whether it is really worth the effort to replace the individual filters called by CUPS 2.4.x and 2.5.x by this universal filter, especially also that we have only more 2 years where CUPS uses PPD files. So before I complete this (if not, the universal filter will at least be used to make cups-browsed's implicitclass backend use filter functions instead of external filters) I want to hear some opinions about this, especially also whether actually saving external executable calls is more resource-saving than for example saving forked parallel tasks and pipes between them. Forking and piping vs. one filter after the other In general if forking and piping for a filter chain consumes much more than calling each filter function one after the other directly and let them write their output into temporary files for the next filter functions in the chain reading from the previous filter function's temp file I am also thinking about adding a second mode to filterChain() to let it operate this way. WDYT? Using filter functions directly in CUPS And, finally, should we make the filter functions be directly used by CUPS, either that in CUPS 2.5.x in scheduler/job.c we call filter functions instead of external filter executables (at least for standard, non-driver filters), or that for CUPS 3.x we do the needed file format conversions by filter function calls (there are no driver filters)? Backends could also be converted to filter functions and be directly called. WDYT? Also, do we need extra functionality in the filter function concept for using it directly in CUPS? For example add a field to the records of the filter functions called by filterChain() to tell as which user each individual filter function should get run? Also, if we want CUPS to use filter functions, we need to do re-structuring to avoid circular dependencies, as libcupsfilters uses libcups and if a function in libcups would call a filter function of libcupsfilters, libcups is using libcupsfilters, ... The planned splitting of libcups, local CUPS daemon, sharing CUPS daemon of CUPS 3.x could help here as if the daemons call filter functions but not libcups, we will not get a circular dependency. WDYT? It would be great if we could discuss these topics before finalizing cups-filters 2.x I am inviting everyone to discuss on the OpenPrintingmailing list (subscription required for posting), either answering to the existing thread or starting a new one. When getting some UTAX PostScript PPD files I found a bug with the PPD file handling in the retro-fitting Printer Applications. PPD files contain a metadata field named NickName (like UTAX 350ci (KPDL)). It contains make and model name of the printer followed by information about the PostScript interpreter or printer driver. This field, plus the two-character code for the PPD's user interface language in parentheses (like (en)) are put together (UTAX 350ci (KPDL) (en)) in a string and then normalized (all-lowercase, no non-alpha-numeric characters, word separation with -) to get a unique driver name (utax--350-ci--kpdl-en) for each PPD and no loss of PPD list entries caused by duplicate names. Unfortuately, the normalization code had a bug, throwing away all characters after the first closing paranthesis. This way the language code got lost and as UMAX PPDs come in 6 languages, only the versions with the language coming first in the alphabet ((de)) remained. In the PostScript Printer Application not only the PPD files for the 3 UTAX printers were affected but also PPDs for all Kyocera PostScript printers (they also have (KPDL) in their NickName), so users of these printers had a working printer but with printer-specific options on the Printer Defaults web interface page in German or another language. This is fixed now. Now options appear in English when auto-selecting the PPD and all supported languages are available when manually selecting the model/PPD from the list when adding the printer. CUPS Snap in the Snap Store The CUPS Snap uses cups-filters 2.x (GIT master) now (commit)! Not only we use the newest generation of cups-filters now, but alo there are many bug fixes, especially also that Raster-only printers in cups-browsed print correctly now. So please test the CUPS Snap, especially also whether everything in it also works nicely in the Snap environment. I am still waiting for the snapd team to implement the security concept on the snapd side, but we have agai progress here. Only few things still need to get adjusted, once to prevent breaking the AppArmor profile by the CUPS socket path specified in the client Snaps (discussion) and second, the best location for the CUPS socket to do not interfere with other files (discussion). Also the bug that the interface needs to get reconneted after an update of snapd needs to get fixed. Main TODOs are: Complete the cups interface in snapd. Testing Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap LPrint in the Snap Store LPrint the Printer Application for label printers, created by Michael Sweet, got now switched over to be PAPPL-based and with this it is the first PAPPL-based, native (non-PPD-retro-fitting) production Printer Application. So not only it gives you support for many label printer models (if your label printer is not supported, some more are supported by the Ghostscript Printer Application), but it also is an example for developers who want to create their own native Printer Application. Announcement of the 1.1.0 release. Project page PDFio is a simple library for reading and writing PDF files, but it is not a PDF renderer/rasterizer. So it does similar things as the QPDF library, but using only simple C, not C++. It does not replace renderers like Ghostscript or Poppler. Some weeks ago, the first stable release, 1.0 of PDFio got issued! Im am thinking about switching cups-filters from QPDF to PDFio, to make libcupsfilters free of C++, but PDFio still does not support converting filled interactive PDF forms into static PDF files. A feature request is posted. This could also be a project for GSoC 2022. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|3730| |ipp-usb|ipp-usb|1191| |ps-printer-app|PostScript Printer Application|2031| |ghostscript-printer-app|Ghostscript Printer Application|875| |hplip-printer-app|HPLIP Printer Application|3039| |gutenprint-printer-app|Gutenprint Printer Application|2373| Currently released is 2.4.0. CUPS is now on its best way to version 2.4.1, the first bug fix release. Most visible fix for users and admins is probably the fix of the default setting for the \"ColorModel\" option in the PPD fles generated for temporary CUPS queues, as instead of the \"best\" choice getting selected, the \"print-color-mode-default\" printer IPP attribute gets used. So the PPD will have the actual default setting of the printer. This is once the most intuitive and when the printer´s default gets changed on the server, the client follows. This makes administration a lot easier.See also the original bug report. This change I have also ported to the PPD generator of cups-filters (in both master and 1.x, included in 1.28.11), so PPDs of cups-browsed-generated print queues and PPDs created by the driverless utility use the printer's color mode defaults now. Ubuntu Jammy Jellyfish (22.04 LTS) will come with CUPS 2.4.x, if all works well as Snap. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.11. We are continuing to polish and to fix bugs for the 2.0.0 release. I have especially switched the implicitclass backend over from using external CUPS filter executables to using filter functions, using the universal() filter function to create the needed filter chains. This revealed a lot of bugs in cups-filters which I have fixed now. I have also adapted the queue naming scheme of cups-browsed to the new naming of temporary CUPS queues, without trailing underscore. This suppresses ugly duplicate entries in print dialogs. cups-browsed's implicitclass backend to dispatch jobs to cluster member printers now uses filter functions and with this it is able to print to Raster printers (see also issue #426. The implicitclass also polls the destination printer with a get-printer-attributes IPP request now to get exact details for the data format to send. Before only the cluster queue's PPD was used with has insufficient info, especially for raster printing (commit). cupsRasterPrepareHeader() creates a complete header now, especially setting page/margin dimensions for the job's page size, filling all dependent fields, initializing header to zero, handle invalid orientation-requested values (commit). pdftopdf() is now correctly applying all print-scaling settings also when the unprintable margins are not symmetric (top != bootom and/or lef != right, commit). Fixed bugs in resolver functions for DNS-SD-based URIs, to not use stdin without need (and so blocking the job data stream in a filter/backend) and to use the actually supplied destination URI (commit). Added PCLm support in cupsRasterPrepareHeader(), to cover all kinds of driverless print data formats (commit). Fixed Apple Raster and PCLm output in universal() filter function, especially make PCLM being generated directly by Ghostscript (commit). Updated the naming of cups-browsed's locally created print queues to match CUPS' naming of temporary queues, to avoid duplicate listings in print dialogs (commit). PPD NickName normalization does not throw away extra text after parentheses any more now, so now Kyocera's KPDL (PostScript) printers appear correctly in ps-printer-app (commit). 1.28.11 Bug fix release, containing backports of many of the bugs recently fixed during the preparation of the cups-filters 2.x release. Important is that cups-browsed’s queue naming is aligned with CUPS’ temporary queue naming now and several bugs affecting driverless printing are fixed. Ubuntu Jammy Jellyfish (22.04 LTS) will most probably come with cups-filters 2.x. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.1.0. PAPPL v1.1.0 is now available for download. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-January-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - January 2023",
+ "url": "/OpenPrinting-News-January-2023",
+ "headings": [
+ "Google Summer of Code 2023",
+ "Linux App Summit 2023",
+ "New Architecture makes it into Ubuntu (and Debian)",
+ "cups-filters bug fixes and second beta (2.0b2)",
+ "LPrint 1.2.0 release",
+ "PAPPL 1.3.1 release"
+ ],
+ "tags": [],
+ "snippet": "GSoC 2023 project ideas and more, LAS 2023 in Brno, New Architecture going into Debian/Ubuntu, cups-filters fixes and 2.0b2, LPrint 1.2.0, PAPPL 1.3.1",
+ "content": "Have you already been in need of a new printer and wanted to make sure it works with your prefered operating system, Linux? If this happened longer ago you had to find out whether there is a driver, in most cases one not coming from the manufacturer amd you were looking up the printer models interesting for you in our database, often with the frustration that they were not listed at all or categorized as a \"Paperweight\". Several years ago we got driverless IPP printing as part of IPP 2.x. Printers advertizing their presence in the network by themselves, telling about all their capabilities und user-settable options by themselves, and using only standard page description languges. This was mainly pushed forward by the fact that the industry wanted that users can print from smartphones. So Apple's Airprint (for the iPhone's iOS and similar) got the most present incarnation of driverless IPP printing. Is this solution the perfect solution making sure that every new printer from now on prints perfectly under Linux and you can simply grab that promotion from your supermarket? In most cases and with certain manufacturers (like HP for example) it works very well, but there are always bugs in manufacturer's implementations of the standards. You see that most bug reports on cups-filters and many on CUPS are a user complaining that output of their printer (used in driverless mode) is not correct. To avoid such problems, the PWG (Printer Working Group), creator of the IPP (Internet Printing Protocol) has created a self-certification program for their own flavor of driverless IPP printing, IPP Everywhere, so that manufacturers can certify their printers, and several did. So we have a long list of printers, either listed by Apple as supporting AirPrint or certified to support IPP Everywhere, more than 8000 printers! For the printers listed as only supporting AirPrint and not IPP Everywhere we do not exactly know how Apple tests the compatibility and how Apple's operating systems exactly communicate with the printers. This can easily lead to issues like this one where a printer does perfectly do AirPrint with Apple clients but has problems when the client is running Linux. Changing the way how to poll the printer's capabilities via IPP solves the problem. For IPP Everywhere everyone can see what the standard includes and how the certification works, as at the PWG all standards and all development are open. All the specifications for the standards are freely downloadable and the self-certification utilities are free software. So if a user reports an issue on an IPP-Everywhere-certified printer we can check why the certification utility succeeds but the user's system fails and more easily do a fix. And, back to buying a printer, now you can download the certification tools, put them on your laptop, phone, or other portable device and run it on the printers which are on display in the store, finding a printer passing all tests and that is the one you will buy ... As the tool does a series of sophisticated tests and so it is much more reliable than if you randomly try to print some file. And in the future this gets even easier: Michael Sweet is working on a graphical certification tool, written in Flutter and probably put up in the Snap Store and other system's app stores once released, making your printer shopping even easier, if needed with the help of the laptops on display and WSL ... While still doing the aftermath of GSoC 2022, having the contributors integrating their work in the appropriate upstream projects, we are already preparing GSoC 2023. So we are involved in the GSoC year-round. As the application period for mentoring organizations is soon starting (Feb, 23, 2023), we have already lined up our project ideas (after some discussion with Michael Sweet): Adding support for the new functionality/attributes of IPP Everywhere 2.x to libcupsfilters and the Common Print Dialog Backends (CPDB) CPDB support for application's print dialogs: Firefox, Chromium, LibreOffice, ... Scanning support in PAPPL Turn cups-browsed into a Printer Application PAPPL-based Printer Applications: Option setting presets via web interface Make a native Printer Application from Gutenprint CI Testing programs for libcupsfilters, libpappl-retrofit, libppd, CPDB, ... GNOME Control Center: List and handle IPP print services for the New Architecture cups-filters: Create OCR filter to deliver scans as searchable PDFs Please contact us at any time if you are interested in being a GSoC contributor for OpenPrinting on one of these projects or on your own project idea. We also have already many contributor candidates doing assignments, in stage 1 building CUPS and cups-filters, learning about the code, the printing architecture, driverless printing, ... in stage 2 working on issues in cups-filters, CUPS, and other OpenPrinting projects, and some already in stage 3 learning about the project in which they want to do their GSoC work. The work on the GSoC 2022 projects and their integration is going on and some are getting continued in GSoC 2023 projects: Common Print Dialog Backends Gaurav Guleria continued his work on the CPDB integration in the print dialogs. Especially he added an option group concept, implemented support for translated UI strings for option, choice, and option group names (commit) and also did a fix on the API of libcupsfilters for that (commit). Gaurav's best friend and dorm roommate Kushagra Sharma got inspired by Gaurav's enthusiasm, started volunteering on CPDB and wants to participate in GSoC 2023. I have put him then to study the print dialogs of the browsers and I had really motivating and inspiring Telegram 1:1s with him, he is currently studying a semester in Germany and I animated him to attend FOSDEM. GNOME Control Center \"Printers\" module I worked with Mohit Verma on preparing his work on the \"Add Printer\" part for Elio Qoshi and Canonical's UI/UX design team to work on the UI design for the upstream integration. They asked me for some screenshots and screencasts and so Mohit has provided them. Mohit is also starting to look into work to be done on the main panel (list of printers/IPP services). PAPPL scanning support I also found a volunteer/GSoC-2023 candidate for doing the remaining work for the scanning support in PAPPL, Akarshan Kapoor. He has studied the project and created documentation for Bhavna Kosta's scanning API work of GSoC 2021. He followed the standards of PAPPL, auto-generating the documentation for the functions with Michael Sweet's codedoc and wrote an introduction manually. He only needed to do a few corrections in the comments of the code which codedoc turns into documentation (Thanks, Bhavna). Here is his pull request for PAPPL. Braille Printer Application I am currently helping GSoC-2022 contributor Chandresh Soni to fix a bug in his Pull Request to upstreamize the Braille Printer Application. Some of our contributors of GSoC 2022 and contributor candidates for GSoC 2023 have provided little write-ups: Mohit Verma GSoC 2022 contributor on updating the \"Printers\" part of GNOME Control Center (G-C-C) for the New Architecture After my GSoC, I had worked on the new method of finding binaries as suggested by Marek Kasik but it didn’t prove to be useful since this method was returning the snap’s binary path. So, it was decided that it is better to add an IPP request to do this task. I had also started working on integrating Divyasheel’s Panel (DNS-SD Window), Shivam’s Panel (IPP Setup Window) & Lakshay’s Panel (Administrative-MF-Devices-GUI) in the G-C-C. I have completed integrating the DNS-SD window after removing the deprecated call’s and fixing some bugs. This window is now working fine. Currently, I am working on Administrative-MF-Devices-GUI Panel and IPP Setup Tool Panel. I am first trying to revamp the GUI to GTK4 along with fixing any bugs that come along. The second step would be to introduce Avahi DBus calls for the Discovery of Device and then finally integrating them into G-C-C. Gaurav Guleria GSoC 2022 contributor on adding Common Print Dialog Backends support to the print dialogs of GTK and Qt After my GSOC, I have added few improvements to CPDB. Firstly some serious flaws in CPDB have been fixed, like major memory leaks and CPDB not supporting reconnecting to DBus once disconnected from it. CPDB now follows XDG directory specification instead of hardcoding system paths. CPDB also provides generic groupings for most IPP options so print dialogs can now separate the options into several tabs accordingly. Furthermore, CPDB now has full translation support, where the translations are fetched from the backends in user's requested locale. In cpdb-backend-cups, this is achieved by using translation support provided by cups-filters in catalog.h. Certain changes were also made to these functions (cfCatalog...) so that they accept locale as additional parameter instead of just defaulting to en-US. Finally, CPDB has now much more verbose debugging which should be really helpful since it'll make bug fixing much easier in the future, considering that CPDB is a fairly new technology. Chandresh Soni GSoC 2022 contributor on turning the Braille embosser driver into a Printer Application After the GSOC period, I submitted a pull request to combine my braille printer application code with the cups-filters 2.0 braille support code. This was separated from cups-filters. In the following days, we will release version 1.0 of the braille printer application. I also corrected several errors in my code, which involved switching to a new cfFilterExternal, which is an updated version of ppd_ filter_external_cups and removing ppd support to make it work with newer cups. Kushagra Sharma GSoC 2023 contributor candidate preparing for CPDB support in application print dialogs I have been studying the repository of chromium to locate and understand print backend and print dialog. I still need some time to get the gasp of whole thing and meanwhile Gaurav asked me to confirm with chromium team whether they need CPDB support or not and if they do agree how they expect it to be implemented. I will continue same for this week. If I need to change anything please let me know. I continued my study on the code base of chromium. I studied their print dialog implementation and print backend implementation for cups and had some discussions with Gaurav on CPDB. I have basic understanding of chromium and now I have started expanding my scope to CPDB as Gaurav is teaching me about its backend implementation. Thanks a lot for all this great work! Probably you remember the great Linux App Summit 2022 in Rovereto, Italy. We will this year have a Linux App Summit again, this time in Brno in the Czech Republic. Brno is home of a Red Hat office and so many of our free software colleagues are located there, especially those on GNOME. And they will be for sure on the LAS, making this year's edition an awesome conference. Update: Call for proposals is open right now!! Until Feb 18, 2023! Submit your great, awesome, and interesting talks, lightning talks, BoFs, workshops ... (No boring talks, please, or while you are on stage you will miss the best hallway sessions of the conference ...). I will also be there ... Now, with having a release (at least a beta) of all the important components: libcupsfilters, libppd, cups-filters, cups-browsed, pappl, pappl-retrofit, cpdb-libs, cpdb-backend-cups, cpdb-backend-file I have started to create Debian packages from everything so that it gets into the Debian and Ubuntu distributions. Unfortunately, Debian is currently entering the freeze for finalizing their Bookworm release. So their developers are going from the add-new-packages-and-new-features into the debugging phase. But fortunately, Debian has at least finally accepted the Common Print Dialog Bsckends (CPDB) components, cpdb-libs (ITP), cpdb-backend-cups (ITP), cpdb-backend-file (ITP) into Debian unstable (after a reminder on their printing mailing list). The versions are still 1.x versions though, the latest stable ones on OpenPrinting, for the 2.x versions libcupsfilters needs to get updated to 2.x first. But the update to the second generation of cups-filters will only happen after bookworm. So all further packages and updates to their new generations will, if at all before the Bookworm release, happen in Debian's Experimental branch. For getting new Packages into Experimental while most Debian developers are busy with Bookworm I get help from my colleagues in Canonical's Desktop Team, Sebastien Bacher and Jeremy Bicha, both long-time Debian developers with the appropriate experience and access rights, and due to Canonical more focused in Ubuntu. Thanks already no for the cooperation. For Ubuntu I can simply upload the new packages, or sync them from Debian (copy the Debian package without changes into Ubuntu), but, in contrary to Debian, the Ubuntu repository of free software packages is split into two parts: Main and Universe. The most important and essential parts of the operating system, which are covered by Canonical's commercial support, are in Main. Universe is a wide range of additional packages for Ubuntu, usually maintained by the community. Packages newly added to Ubuntu, like PAPPL for example, land in Universe. To promote a package into Main, a Main Inclusion Request (MIR) has to be posted into the bug tracker on Launchpad. This is to check whether a free software package is reliable enough to be a core part of a commercially supported operating system. It must be well-maintained, security vulnerabilities quickly fixed, code fulfilling security standards, depending only on other packages which are also in Main, ... The printing stack is usually a core part of the operating system and in Ubuntu, packages like CUPS, cups-filters, Ghostscript, most printer drivers, ... are in Main. Now several new packages which are entering via Universe have to transferred into Main with a MIR: cups-filters 2.x components: libcupsfilters, libppd, cups-browsed: Simplified MIR, PPA cpdb-libs: MIR cpdb-backend-cups: MIR cpdb-backend-file: MIR MIRs for PAPPL and libpappl-retrofit still need to get posted, and for libpappl-retrofit also the Debian package still needs to get created. For the new component packages of cups-filters we do only a simplified MIR, as the code is already in Main, in the old cups-filters 1.x and partially also in libcups (PPD support code). Therefore this change is only distributing the code into more source packages and not introducing new code. Here I want to thank Sebastien Bacher for helping me with the preparation of the packages for the MIR requirements, especially the new ones which got introduced after my last MIR several years ago. Another challenge was that I found an old package named \"libppd\" which was a library providing the PPD support functionality ripped out of libcups to LPD users, via the \"gpr\" and \"ppdfilt\" utilities. It stayed unmaintained (and forgotten) for more than 20 years while all the distros had switched to CUPS. This package is clashing with the name of the libppd of the new generation of cups-filters. I discussed its removal/renaming with Debian folks and we settled on renaming this into \"libppd-legacy\" after the Debian Bookworm release. The renaming has already taken place in Debian Experimental now, where all the packages of the New Architecture will go for now until Bookworm is released. For Ubuntu I asked for a complete removal, which is now done. So now nothing is in the way any more for the upload of the new packages, especially also libppd. During the selection and onboarding process for the GSoC 2023 (see above) we are assigning many of our issues on GitHub to contributor candidates for them to learn about our code base. This leads us to deeper investigation of several bugs and to fixes of them. Like with this issue: To get the full capabilities of a driverless IPP printer, a client (CUPS, or the driverless utility) needs to poll the attributes all and media-col-database with a get-printer-attributes IPP request (media-col-database is not included in all as it is often a very long list). Some printers cannot cope with the two being polled in a single request]. So I added separate polling of the two to work around this, and also parsing the media-col-ready attribute now, to lower chances to overlook something (like borderless printing support). I need to later on add the separate polling of all and media-col-database also in CUPS. During packaging of the components in Debian packages I have found and fixed some build system and documentation bugs and also an API bug discovered during the CPDB work. After that I have released the second beta: In addition to documentation and build system fixes discovered during the Debian packaging, the following changes have been done: libcupsfilters Filter functions did not handle the page size correctly when no printer IPP attributes are supplied (in case of classic CUPS filter no PPD file). Now if a page size is supplied with the job, this one is simply used, otherwise the sizes of the input pages and as a last mean US Letter. In the cfCatalog...() API for obtaining human-readable strings and translations of attribute/option and choice names, we added suport for specifying the user's UI language now, to receive the requested strings in the correct language, and not only human-readable strings in English. libppd In the PPD file generator for driverless printing with CUPS we now support more than 2 resolutions in Apple Raster/AirPrint. The urf-supported IPP attribute was only parsed correctly when its RS part had only 1 or 2 and not more resolutions specified. We have corrected now for an arbitrary amount of resolutions, taking the lowest for \"draft\", the highest for \"high\" and one in the middle for \"normal\" print quality. ppdFilterEmitJCL(): Added NULL check for PPD not being supplied. Classic CUPS filters created based on filter functions using ppdFilterCUPSWrapper() and also filter functions of libppd (ppdFilter...()) should also work without PPD file and not crash if no PPD file is supplied. The Printer Application for label printers, LPrint v1.2.0 (Snap Store) adds support for snap configuration and EPL/ZPL auto-typing support, and fixes a number of bugs. Changes include: Documentation corrections (Issue #53, Issue #76) Added snap server configuration. Added --with-systemd configure option and install to $prefix/lib/systemd/system by default (Issue #50) Added EPL2 and ZPL auto-typing support (Issue #64) Changed the default log level for systemd to info (Issue #82) Fixed macOS installer to start LPrint server (Issue #48) Fixed configure script not using warning/preprocessor options in build (Issue #60) Fixed printer renaming algorithm to not truncate the name (Issue #60) Fixed missing print-color-mode=bi-level for bar code printing (Issue #76) Fixed label mode support in EPL and ZPL drivers (Issue #79) Fixed driver names for EPL printers (Issue #52) More Details and Download Michael Sweet has released PAPPL 1.3.1. It is a general bug fix release. Changes: Fixed auto-add of USB printers Updated \"ipp-attribute-fidelity\" support Reduced sleep interval for USB gadget initialization More Details and Download GitHub Discussions"
+ },
+ {
+ "id": "post:OpenPrinting-News-January-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - January 2024",
+ "url": "/OpenPrinting-News-January-2024",
+ "headings": [
+ "HP madness",
+ "FOSDEM 2024",
+ "Google Summer of Code 2024",
+ "Snap automation",
+ "What is hot on the OpenPrinting mailing list",
+ "New printing-users mailing list"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/W8IAszo8SjM/hqdefault.jpg",
+ "snippet": "HP madness, Framework printer?, tattoo printer, FOSDEM 2024, GSoC 2024, Snap automation, User mailing list",
+ "content": "You probably remember the October News, where, based on experience of some colleagues and also based on discussions on Mastodon, I changed from recommending HP printers to Brother printers. Unfortunately, there are many more reasons to move on from the formerly well-respected printer manufacturer, mainly their agressive enforcement of their razor-and-blades business model. Already before reading about all this, back on the Ubuntu Summit 2023 in November after attending Daniel Schaefer's great talk about Framework laptops and also getting a hallway demo from him, I came to the idea why Framework could not also make a modular, easily upgradeable and repairable multi-function printer and some weeks ago, I posted this idea on their community forum. I got a lot of likes, and D.H from Framework's Mainboard Developer Program gave a nice answer: I love the idea. Especially if the repairable items list expanded to power supply, main board, WiFi module, Ethernet module, etc. In my current case I have a 7 year old brother laser that is preventing me from going to all WPA3 network, because the firmware and/or WiFi chip in it does not speak WPA3. Economics make the printer space a difficult one to introduce a new, different, more complex, and by necessity slightly higher entry price point product. It would have to be paired with sufficient advertising, media coverage, etc to really sell the long term total cost to own advantage. Probably pretty easy for a professional IT department to do the cost analysis, effect the repairs, etc. A self managed small office, typical home office is certainly capable of the same but many will prefer to stay with commodity disposable hardware unfortunately. But yes from an e-waste and TCO standpoint, I love the idea of a repairable, upgradable, open source, etc paper printer, whether Framework or some other company decides to make it. I also take feedback on Mastodon. And the thread seems to have inspired Framework to cite the Ars Technica article about the HP madness on Mastodon. Many of you know that we work here with Structured deposition of ink and toner particles on paper substrates or, just printing. But some people do Structured deposition of ink particles into skin substrates Oh, this sounds like tattoos, a traditional art done by hand ... By hand? No, also for that we have printers. There are actually tattoo printers now, which print with inked needles into the human skin! But sorry, no color, only grayscale. Imagine and a kind of dot-matrix printer is doing its work on your skin ... Mastodon No information about the software used is known, though. So let us see what happened at OpenPrinting in January ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Hewlett-Packard (HP) was for long time a symbol for robust and reliable printer workhorses lasting for decades. And they also were a preferred brand for Linux users as they usually understood PostScript or PCL, and for the few which did not, quickly third-party drivers based on reverse engineering appeared as free software drivers. Also with the advent of driverless IPP printing HP printers behaved well and just worked. And for me as developer HP printers were a good choice as they still understand many languages, starting from good old PostScript and PCL up to the needs of driverless IPP printing, PDF and the different raster formats, and also some HP-proprietary languages and variants in addition. Also all communication protocols, LPD, raw socket, IPP, ... are present, which allows testing for compatibility with many old and modern printers. But in recent years, HP tried to enforce more and more their razor-and-blades business model on printers and multi-function devices, meaning that the printer is sold with loss to actually earn on the high prices for the ink or toner cartridges, where a new set of cartridges often costs near as much as the printer itself. They not only sell ink subscriptions where the printer \"calls home\" through the internet so that the user gets automatically sent new cartridges when the current ones are nearly used up but also started to add more measures against using third-party supplies. Especially they automatically install firmware updates via the internet adding these new measures to printers which are already around, without any warning to the user, making the printer suddenly stop working due to the third-party cartridges in use. This practise even led to a lawsuit against HP, and HP responds telling that it is for security reasons, as third-party cartridges could contain viruses which infect the printer and compromise the user's network. They call these updates \"Dynamic Security\". But if such a thing would be possible, it is a clear sign of bad design, as it would mean that cartridges contain executable code which the printer executes, or at least a way to inject code into the printer via forged data on the cartridge, but this requires a vulnerability in the printer's firmware plus a rather high amount of storage on the cartridge. A cartridge's chip is expected to contain some cryptographic signature and/or copyrighted data from HP to identify itself as original, plus info about the cartridges capabilities, perhaps also color calibration tables. All this should not require such a lot of storage, and well-engineered software can reliably read the data and reject it if not in the correct format. In addition, it is also not proven that such an attack ever happened. In the article it is also told that such kind of firmware updates make people refuse to update and so actual security vulnerabilities especially against attacks from the internet do not get fixed. Another trick to force users to buy original HP supplies is HP+. They offer an Instant Ink subscription to the user of a very cheap printer, with the first 6 months of ink cartridges for free, but couple it with a firmware update which makes the printer only working with original cartridges, and if the customer cancels the ink subscription, the firmware change is not reverted, excluding the use of third-party ink for the rest of the printer's live. And many of HP's printers have the EPEAT ecolabel which requires the printer accepting third-party ink. With the firmware updates revoking that permission the International Imaging Technology Council (IITC), representing the third-party ink/toner industry, wants to have these printers removed from the EPEAT list and they call these updates \"Killer firmware updates\". All this shows that HP does everything to lock in their users on original cartridges to make money ... And HP's CEO Enrique Lores actually admits that they are using the razor-and-blades business model, by telling that when you buy a printer, HP is investing in you, but if you do not print enough or do not use HP's supplies, it is a bad investment. In addition he tells that HP's long-term goal is to make printing a subscription ... Another interesting observation on an HP printer, on the very cheap DeskJet 2700, is that it comes with a sticker over the USB port telling to connect by Wi-Fi and not by USB. This printer was bought by Mastodon user netspooky and they tell in a post that HP most probably wants to make users install an app which lets the user's documents being stored in a cloud service from HP. They also tell that they made it working by Wi-Fi without the app (does most probably driverless IPP). This caused a long thread, with some people saying that the USB principally works but only for ~20 pages as long as the user did not install the app yet. And people tell that the app possibly tries to make users subscribe to the HP+ ink subscription, preventing them from being able to use third-party ink. And with all this, HP claims their printers are \"Made to be less hated\" (Mastodon) ... FOSDEM is approaching! This Friday, in the early morning I will fly to Brussels to attend the FOSDEM on Saturday and Sunday. And many people I will already meet on Friday, during the day and also at a dinner of former and current Canonical employees, mainly from the Desktop Team. And with Brno, the city of RedHat's Europe office, only 2 hours from Vienna, I could even meet one or another Red Hat person on my flight (Brussels Airlines SN2902 VIE - BRU 9:15am - 11:00am, on Fri, Feb 2, if you happen to be on the same one ...). Most of the sessions in the 32 rooms on the 2 days are already scheduled ... Most?! Yes, there are still some missing at this point in time, it seems that the lightning talk submissions are not yet all decided about, especially my two submissions are still pending: Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! Save Legacy Printers under Windows with WSL and Printer Applications On the Schedules page follow the links to the schedules of each room, full schedules for each day, in which room is which track, ... From my other 4 proposals which I have submitted two talks are accepted and scheduled now, and another talk and a workshop got rejected. So here are my scheduled talks up to now: (Update) Videos of the talks are available now. OpenPrinting - We make printing just work! On Sunday, February 4, 11:00 – 11:50 CET, in K.1.105 (La Fontaine) Main Track Video, Slides OpenPrinting: What it is, how it emerged, what we are doing, what are our challenges, what are we in need of ... (Update) I will give an overview of our organization and how we make printing just work. I will also give a short overview on the planned development on CUPS and tell about Windows Protected Print, the way Microsoft will switch to all-IPP printing in Windows. Zdenek Dohnal, printing maintainer at RedHat, originally wanted to participate, but unfortunately, he got sick and is not able to attend FOSDEM. We all wish him that he will get better soon. Desktop Linux, as easy as a smartphone! Just in a Snap! On Sunday, February 4, 13:30 – 13:55 CET, in UA2.118 (Henriot) Distributions Track Video, Slides There are many immutable distributions around, and several talks in the Distributions track are naturally about them, there will also be demos of several of them on the booths. But one immutable distribution is special as it is based on Snap, actually an all-Snap distribution, Ubuntu Core Desktop, and a Distributions Track, and especially one on a conference with many Canonical and Ubuntu folks, should not omit this distribution. And also Snap got 10 years old! (Thanks for the hint, Oliver Grawert) In this 25-min talk I will give a quick overview about how Snap, Ubuntu Core, and Ubuntu Core Desktop work, showing the advantages of a sandboxed packaging system which allows packaging everything, not only desktop apps, but also CLI apps, system and user daemons, desktop environemnts and even kernels, boot systems, and the immutable system core. (Update) During all the event there will also be several demos of Ubuntu Core Desktop, I will have a virtual machine of it on my laptop, Philipp Kewisch (Community Team manager at Canonical) plans to bring an Intel NUC with it, and Alan Pope (\"Popey\") will perhaps bring also a demo. He has succeeded to install and run it on his Steam Deck, but he is not sure whether he will bring this one. Note that we do not have an Ubuntu/Canonical booth. We will demo at the standing tables in the hallways, on Sunday most probably in front of the Distributions devroom (UA2.118, Henriot) where I will give my talk. So that's it from my presentations for now, but up to 2 lightning talks can still get added here ... For whom is not able to attend there will be live streams. I am not sure whether all rooms will do it, but very probably the Main Track (2 rooms) and the Lightning talks will do. Please check here for the links. The organizers of the Google Summer of Code will also be on FOSDEM and have a booth there, and there is a GSoC meeting/dinner on Saturday night, kind of mini Mentor Summit, which I will attend, to meet the organizers and also fellow mentors. And after that, also on Saturday night, there will be the GNOME Beers which I will also most probably join. For the 20th Google Summer of Code the time window for the mentoring organization applications has opened (closing on Feb 6) and so I have posted the application for the Linux Foundation (Mastodon: #LinuxFoundation) again, naturally with OpenPrinting participating as one of its sub-organizations. For this we have also set up our project ideas list, this time with a vastly updated introduction part about our work, now with sections for videos and for desktop integration. And there are 9 project ideas this time (further ones can get added later): Desktop integration: CPDB support for the print dialogs of Mozilla (Thunderbird/Firefox) and LibreOffice Desktop Integration: Update system-config-printer for the New Architecture of printing Desktop Integration: User interfaces for using OAuth2 with printers and scanners Replace QPDF by PDFio as PDF manipulation library in libcupsfilters (cfFilterPDFToPDF() filter function and others) Turn cups-browsed into a Printer Application Converting Braille embosser support into a Printer Application Make a native Printer Application from Gutenprint CI Testing programs for libpappl-retrofit and libppd cups-filters: Create OCR filter to deliver scans as searchable PDFs Please contact us at any time if you are interested in being a GSoC contributor for OpenPrinting on one of these projects or on your own project idea. We also have already many contributor candidates doing assignments, in stage 1 building CUPS and cups-filters, learning about the code, the printing architecture, driverless printing, ... in stage 2 working on issues in cups-filters, CUPS, and other OpenPrinting projects, and in stage 3 learning about the project in which they want to do their GSoC work. Especially to mention here is Rudra Pratap Singh, to whom I have give the task of introducing Snap update automation into the 4 Printer Application Snaps at OpenPrinting as a stage 2 assignment. It is principally a rather easy task as the steps are well described in my Snap automation workshop (video, slides). But he went far beyond his task. See below ... As most of you already know, we are offering several Snaps in the Snap Store: CUPS, ipp-usb, and several Printer Applications. All these Snaps need maintenance, especially they are composed of several different upstream packages, which means that whenever of one of these upstream packages a new release is issued, the Snap needs to get updated. This causes a significant amount of maintenance work, especially many upstream projects need to get followed to not miss any new releases. In the Desktop Team at Canonical, Heather Ellsworth (currently at Thunderbird), has developed a GitHub action to automatically update Snaps when one of their upstream components has issued a new release, as we have to deal with many Snaps for Ubuntu and especially also for Ubuntu Core Desktop. Applying Snap update automation As the procedure is rather simple to apply to existing GitHub repositories following above-mentioned article, or even better, my workshop about Snap update automation (video, slides), I have given it as an assignment to a contributor candidate for GSoC 2024, Rudra Pratap Singh. He started modifying the 4 Snaps of the retro-fitting Printer Applications according to the instructions and it mostly worked afterwards, but he has also bumbed into some issues. And here is the point where he really showed his engagement, as he solved all these problems. foomatic-db foomatic-db, the printer/driver database, is used by 2 of the 4 Printer Application Snaps, the PostScript Printer Application and the Ghostscript Printer Application, for the former providing manufacturer PPD files for PostScript printers and for the latter providing the data for building PPD files for all the built-in printer drivers of Ghostscript ad even some more drivers. As foomatic-db is pure data, not containing any code, we have never issued official releases of it. For easier handling by OS distributions we have a cron job which creates a tarball of it, once a day, versioned by the date of the day. There are no release tags in the repo. So I suggested Rudra to add a GitHub workflow to the foomatic-db repo, to once in 24 hours check whether there was at least one commit in the last 24 hours and in this case create a release tag. This way on each day with at least one commit the Snap update automation of the Printer Application Snaps get triggered, and not on days without any change. Rudra got it quickly working without any problems. Automation GitHub action: More versioning schemes and Debian GitLab support Even Canonical's GitHub action itself got some changes from Rudra. The original GitHub action only supported release tags containing up to 3 integers embedded in a fixed string. So we bumbed into problems with some new, not yet finally released software of OpenPrinting (pappl-retrofit) from which we are using a beta version and also with Debian packaging as upstream code where we have the more complex Debian package version number. So I suggested Rudra to modify the GitHub workflow to allow free-formed version numbers and he added this functionality and posted Pull Request #487. After that he posted Pull Request #489 to support repos from Debian's Salsa GitLab as upstream source, as due to the fact that there is no \"gitlab\" in the URL, they were not identified as GitLab repos. To complete, he posted also the two further Pull Requests #490 and #493. All of them got merged by my Desktop Team colleague Sergio Costas, who also guided him on these pull requests. With all this the Snap update automation on the CUPS Snap and the 4 Printer Application Snaps is working now. Snap versioning automation Another point is the version number of the Snap. It would be useful if Snaps have a versioning scheme like DEB or RPM packages, the version number of its main upstream package plus a package release number, like cups 2.4.7-1. If there is a new version of the upstream package, its version number in the Snap's version number will get updated and the package release number reset to 1. If changes made are only on the packaging or on auxiliary upstream repos, the package release number will get bumped: 2.4.7-1 -> 2.4.7-2 -> 2.4.8-1 -> ... This way on any change the Snap gets a new version number, without needing to create an over-complex numbering scheme. Scripting for this I had already in the CUPS Snap, and made it completely working recently. I asked Rudra to add this scripting also to the Printer Application Snaps and he did. And as all the Snaps now contain complex scriptlets which are practically identical, and therefore on any change on the scriptlet one had to update 5 Snaps, I came to the idea to move this functionality into the Snap update automation GitHub action and Rudra posted Pull Request #516. This Pull Request is still in the works and Sergio Costas is guiding Rudra again to correctly integrate his changes. The posting of the Pull Requests and the work with Sergio to get the Pull Requests merged, Rudra did without needing my help, completely on his own. Thanks a lot to Rudra and Sergio for that great work! Current interesting discussions We had some interesting discussions in the last weeks. See the mailing list archives. The following links are to the initial posting of each thread: Printer's IPP response declares AirPrint, but it's missing urf-supported - workaround?: Another firmware bug in a driverless printer and whether we should have a workaround Congrats, Mike! IPP Everywhere is now really Everywhere!: Microsoft Protected Print - all-IPP printing in Windows CUPS Trademark: Are there no trademark issues with Apple when CUPS moved to OpenPrinting? If you want to participate, please subscribe following the links on the \"printing-aechitecture mailing list entry on this page. e-mail: printing-users AT lists DOT linux DOT dev Archive: https://lore.kernel.org/printing-users/ Subscribing/Unsubscribing instructions A first discussion thread already appeared: Cups automatic duplex printing problems: User cannot print duplex on autodetected printer"
+ },
+ {
+ "id": "post:OpenPrinting-News-July-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - July 2020",
+ "url": "/OpenPrinting-News-July-2020",
+ "headings": [
+ "NEW: The OpenPrinting web site got comments sections",
+ "Google Summer of Code 2020",
+ "Google Season of Docs 2020",
+ "Linux Foundation Mentorship Program",
+ "CUPS Snap",
+ "Driverless Scanning and IPP-over-USB",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "We take comments! Students working in GSoC, GSoD, LFMP; libppd and pclmtoraster in cups-filters",
+ "content": "Our web pages, these news posts but also most other pages have a comments section now. So you can leave your comment about the page in the comments section at the bottom. The first evaluations have ended and all the 15 students for the Linux Foundation have passed, including the 7 for OpenPrinting. Most of our 7 students also gave a short introduction to their project on this month's OpenPrinting tele conference. Some student's work reports for the first month: Mohit Mohan Hi everyone, I am Mohit Mohan, junior at IIT Kanpur in the CSE department. I am a GSoC student this year working with Open Printing on the project “Speed/Scaling optimisation of cups-browsed”. As the first coding period completed a few days back, I wanted to inform you all about what I did in that time. But first a bit about the problem with cups-browsed. The cups-browsed is a very useful tool for networks with large numbers of printers, but as it discovers the printers on the network one by one, so as the number of printers increases, the time taken to create a queue for all of them greatly increases. To understand more about this issue I tested cups-browsed with different numbers of printers to find out how much time it takes to create queues. Next thing to find out was where it was taking most time. To do that I found out time taken by some of the important functions during a queue creation. From the results it was quite clear that update_cups_queues() was taking the most time. This function actually creates the queue. As my mentors Till Kamppeter and Deepak Patankar suggested I looked at where it was taking most of the time in update_cups_queues(), and found out that it was cupsGetNamedDest(), which is a part of CUPS API to get a specific destination from the list of available destinations. We tried all available alternatives, but none of them worked faster than it, so in the end we decided to stay with it. You can find the above results at https://github.com/mohitmo/Testing. I also created a design document for implementing multi-threading in cups-browsed. You can find it here. In the next phase I am working on implementing multi-threading in cups-browsed. Jai Luthra [...] here's my progress with PAPPL. Device discovery via DNSSD, SNMP. Command line interface (papplMainloop) PCL driver (CUPS rastertohp) example Next for work is the packaging and documenting the driver. During the last months was also the time window for the technical writer's applications and we got actually many applications, also for the 2 OpenPrinting projects. Some of the candidates were already interacting with us while writing up their proposals. We got accepted in the LFMP for a 2-student project letting one student to create a framework for converting existing proprietary printer drivers intp Printer Applications and another student to integrate IPP Fax Out support into the Linux desktop. The project is currently open for student applications and the work period will be August 1 to October 31. Several students have applied already and to introduce them into OpenPrinting and select them we have given the cups-filters issues to work on as assignment. The Snap is now renamed to simply be the \"cups-snap\" project on the OpenPrinting GitHub and \"cups\" in the Snap Store. The build service of the Snap Store is now attached to our GitHub repository and builds the CUPS Snap for 6 architectures (amd64, i386, armhf, arm64, ppc64el, and s390x). Note that the CUPS Snap cannot be downloaded and installed through the Snap Store yet as it will need new \"cups\" and \"cups-control\" interfaces which are not yet added to snapd. I have already tested them and they work as expected. I have tested the CUPS Snap a lot during the last month and fixed a lot of bugs, especially make all components build on all the 6 architectures supported by the Snap Store, make utilities like lpoptions, cupsfilter, and driverless correctly work, make DNS-SD-service-name-based URIs correctly resolve if the service is local (Printer Application or IPP-over-USB), and updated the README.md to reflect the renaming and the current use of interfaces. Alexander Pevzner, author of the IPP-over-USB daemon ipp-usb and of the AirScan/eSCL/WSD scanner driver sane-airscan asked me to post the news of his work: sane-aiscan Though sane-airscan is not included into any any major distro, its popularity among users grows, and it receives more testing on a growing variety of hardware. Most of newly discovered issues are either firmware bugs that require workarounds, or certain corner cases, like not running Avahi daemon or device announces 2 IP addresses, one of them is not reachable from host. A couple of hard to reproduce crash bugs were found and fixed with a help of clang static analyzer. Added packaging for ARM32 and ARM64, targeting Raspberry Pi users. There already 7 devices in the list that supports WSD, but doesn't support eSCL, so idea to implement WSD was useful. Integration into SANE project seems to finally stuck. Meanwhile I work directly with Benjamin Gordon on integration into ChromeOS and Zdenek Dohnal on integration into Fedora. ipp-usb Initially ipp-usb was targeting distro maintainers. That is why its initial documentation is rather short technical and no binary packaging were provided. Recently I've discovered certain interest among end users to install and use ipp-usb. So I've provided packages for many distros, including ARM32/ARM64. It also known to work on mipsel Linux, but I can't provide packaging for this platform due to OBS limitations. As with sane-airscan, growing popularity implies more testing, and some issues were discovered and fixed. Some users were interested into direct exporting printer into local network segment, which is safe and reliable with ipp-usb. In result, incompatibility with iOS devices were found and fixed (Android devices were always working). This fix was ported to ippusbxd too. Most of other issues are of the same class: device returns truncated HTTP response, and ipp-usb stuck forever, waiting for missed part of response, which effectively blocks USB connection. The solution is also the same in all cases: properly set \"Connection: close\" or \"Connection: keep-alive\" header in outgoing HTTP request. Unfortunately, different device require different setting of this header. As it is hard to organize testing on hundreds of devices, more generic solution of this problem is required. Zdenek Dohnal seems to begin working on integration of the ipp-usb into Fedora. The projects are not only on the way into Red Hat but also into Debian. Packaging requests for both ipp-usb and sane-airscan have been posted and Didier \"OdyX\" Raboud, printing maintainer of Debian, has taken up both and uploaded the appropriate packages. Also thanks to Brian Potkin to post the request for ipp-usb. Currently released is 2.3.3. No further releases or GIT commits, also 79 open issues and 18 open Pull requests. Only few answers from upstream developers. I have asked several people about what is happening here but did not get really clear answers, but it seems the learning needed by the new engineers, COVID-19, and the switch of Apple from Intel to ARM architecture have influence on this. I am thinking about as a last mean to temporarily fork CUPS so that distribution maintainers can collaborate on fixing bugs there. Currently released is 1.27.5. No new release, due to the fact that I am currently on a major feature addition which I want to complete before releasing 1.28.0 and which is important for the switch over to Printer Applications: libppd One important point for the CUPS Snap is that it does not support classic printer drivers, consisting of PPD files and filters. So for using it as default CUPS implementation in a Linux distribution, all existing printer drivers need to get turned into Printer Applications, and this with a minimum effort of coding. Most of them (probably all except Gutenprint) are difficult to get converted by their original authors, as they do not maintain the drivers any more, supported printers are old and no one wants to code for that any more, driver is simply only a big bunch of PPD files, no code, driver is proprietary, closed source, ... So we need a way to retro-fit these drivers by wrapping them into Printer Applications with lowest coding effort possible and if needed also without needing to modify the original driver executables. This works best if we use the driver's PPD files inside the Printer Application and so we need to handle PPD files, also after the PPD handling support got removed from CUPS and especially libcups. To avoid that we have to invent the wheel again, writing a lot of handling code for a totally obsolete file format, I have grabbed all the PPD handling functions from libcups (current GitHub state, CUPS 2.3.3) and put them into the new libppd which I have added to cups-filters. It has the following properties: All PPD-handling-related functions from libcups (except loading the PPD from a CUPS queue or polling a PPD repository on a CUPS server) are overtaken Also the CUPS-private functions related to PPDs are overtaken and added to libppd's public API. Other private or internal functions are overtaken from libcups as they are needed for the PPD-related functions to work. They are not added to the API. Some functions of tools and utilities like ippeveprinter and ippeveps are overtaken. All API functions have names starting with \"ppd\" and written in camel-case, some needed to get renamed for that. libppd is separate from libcupsfilters, so it does not need to get included in a Printer Application which uses functionality of cups-filters but does not use PPD files NOTE: This is NOT to encourage printer driver developers to continue to create new PPD files for new printers. It is ONLY for retro-fitting existing classic CUPS drivers and PostScript PPD files. There will be no further development on the library's code, especially no new PPD format extensions. The next release of cups-filters, 1.28.0, will contain libppd for the first time. It is already, shortly before completion for 1.28.0 in the GitHub repository, in the ppd/ subdirectory. Further work: pclmtoraster GSoC student Vikrant Malik's project is to extract raster data from PDf files which only consist of embedded raster images, not containing text, fonts, or vector graphics. This allows for higher print quality of such PDFs as input files (for example scanned files) and also to convert PDF output of scanners into dedicated raster formats like TIFF, PWG Raster, ... One known raster-only PDF format is PCLm and therefore Vikrant has started his work by adding the new pclmtoraster filter to cups-filters. He also worked a lot on converting raster formats between color spaces an bi depths. Bug fixes Many bug fixes in cups-browsed, the filters, and the sample PPDs have been performed, often with the help of our GSoC students or candidates doing assignments. Thanks to all of them. Note also that the sample PPD files have moved to the new ppdfiles/ subdirectory. ippusbxd got some bug fixes and improvements from Fletcher Woodruff (PR #38 and #43) and Thierry Hucahrd (PR #41). Thanks very much to the contributors. In ipp-usb Alexander Pevzner added lots of bug fixes and hardware workarounds/quirks. Thanks to all the users who have tested with their devices and reported their problems. Probably many more users will have their device just work by that. ipp-usb is on the way into Red Hat (according to Alexander Pevzner) and also into Debian. This is the packaging request and Didier \"OdyX\" Raboud, printing maintainer of Debian, has taken it up and uploaded the appropriate package. Also thanks to Brian Potkin to post the request."
+ },
+ {
+ "id": "post:OpenPrinting-News-July-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - July 2021",
+ "url": "/OpenPrinting-News-July-2021",
+ "headings": [
+ "Google Summer of Code 2021",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "Retro-fitting of CUPS printer drivers into Printer Applications",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "GSoC mid-term, PostScript Printer Application, Retro-fitting CUPS printer drivers, CUPS, cups-filters",
+ "content": "The mid-term evaluations are done now and all our 5 students have passed. Thanks a lot to them for the great work they did during the first half of the coding period. On this month's OpenPrinting conference call all students participated giving a short screen-share-based presentation of their GSoC projects. Here is some short summary about what got done: cups-filters: Make sure all filter functions work without PPD files Student: Suraj Kulriya Mentors: Jai Luthra, Till Kamppeter, Dheeraj Yadav Suraj made the following filter functions working also without PPD file, based on printer and job IPP attributes: rastertopdf() ghostscript() texttotext() imagetoraster() pdftops() imagetopdf() He also created some library functions for common functionality needed here, like a function which converts IPP attributes to option lists. cups-filters: Convert filters to filter functions Student: Pratyush Ranjan Mentors: Till Kamppeter, Dheeraj Yadav Pratyush converted the following CUPS filters to filter functions: pdftoraster() rastertopwg() (filter from CUPS) cups-filters: Create a single, universal CUPS filter to replace the chain of individual filters Student: Pranshu Kharkwal Mentors: Till Kamppeter, Dheeraj Yadav Pranshu is making very good progress on the universal CUPS filter. Most conversions already work. It also depends on the progress of Pratyush to convert filters to filter functions. The code can be found in this GitHub branch. GUI for listing and managing available IPP Print/Scan services (or DNS-SD-advertised network services in general) Student: Divyasheel Mentors: Till Kamppeter The graphical frontend part is mostly done and in the second half the internal functionality, like Avahi browsing and so on, will be worked on. Here is the GitHub branch with the code. PAPPL: Printer setup tool support and Scanning support Student: Bhavna Kosta Mentors: Jai Luthra, Till Kamppeter, Michael Sweet The original project, \"Firmware and other file handling in PAPPL\" turned out to be not that useful and so we decided to switch to other PAPPL work. I presented the list of feature requests on PAPPL and Bhavna decided to start on features to support printer setup tools and after that to add scanning support to PAPPL. For printer setup tool support I earlier requested to have device IDs listed with the drivers when listing all included drivers of a Printer Application with the drivers sub-command and to make Printer Applications tell whether a printer is supported by them if one supplies the printer's device ID. Bhavna implemented both these features via pull requests, the one for the former got already merged and for the latter not yet. After that, Bhavna started on scanning support, which should not be too difficult do to the fact that Michael Sweet already posted an excellent project description. Here she already posted 3 pull requests: \"Add scanner object and header files\", \"Add scanner.c and scanner-accessors.c files\", and \"Add scanner-driver.c\" CUPS Snap in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, more than 2000 installations via Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but unfortunately, they are very busy currently. A pull request with a suggested implementation of the new \"cups\" interface to which client Snaps which just want to print are supposed to plug automatically got posted and discussion on it has happened. There got also posted a test package of snapd with which I could confirm that the implementation is actually working (see my comments on the pull request). Once this pull request is merged, as a next step a pull request on snapcraft for easily using the interface in client application Snaps is planned. In addition, the CUPS Snap uses newer upstream sources for its components now, of QPDF version 10.3.2 and of cups-filters the current GitHub master branch (2.x under development). Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces (see above) Testing Turn classic CUPS drivers into Printer Applications (see progress below) Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap PostScript Printer Application in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, more than 1200 installations via Snap Store I Continued on the support for CUPS filters used in PostScript PPD files, also in preparation for retro-fitting of actual CUPS drivers, adding the following features (follow the links to the commits for more detailed descriptions and motivations): Added foomatic-rip to the Snap (for PIN-secured printing on Ricoh) Support for CUPS' PPD extension for custom (string, integer, ...) option settings Added parameters like job UUID, date/time of submission/processing, ... to calls of external CUPS filters On the Snap's included PAPPL applied the patch for custom string option support (PAPPL's PR #142) With all this now all ~4000 PostScript printer PPD files which come with the Snap are fully functional, especially also supporting PIN-secured printing on HP and all Ricoh brands. Note that these changes only apply to a few PostScript Printers and only to enable features which are not used very often, but they are especially done with general retro-fitting of CUPS printer drivers in mind, where CUPS filters defined in the PPD file and string/text/numeric/fax number options are more commonplace. With appropriate features added to PAPPL we will be able to also add the following: Support for string/text-style vendor options. Needs support in PAPPL (Patch already applied in the Snap). Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. Currently I am continuing with the work towards retro-fitting classic CUPS printer drivers into Printer Applications. Here I have especially done the following: Turning the PostScript Printer Application into the retro-fit library To start the planned libpappl-retrofit library I have taken the PostScript Printer Application and modified the functions it is composed of to make them \"library-ready\" and to generalize them to support all types of drivers and PPD files, especially also non-PostScript ones. I have done the following modifications on the original ps-printer-app.c file: Get rid of global variables: Instead of using global variables for data which should be accessible from all the functions I have created a data structure (pr_printer_app_global_data_t) for all these items and carry it through the whole Printer Application via the context data pointer of the callback functions. Generalization of data conversion methods: Depending on what kind of driver (High-level graphics like PostScript or PDF or raster/bitmap graphics) you want to accept different sets of input formats and therefore have different format conversion methods. For spooling (usually high-level graphics) conversions there is an array of pr_spooling_conversion_t records and for streaming (usually raster) conversions an array of pr_stream_format_t record now, with input and output data types, and filter functions to be used for the conversion (Hint: If you need more than one filter function for a conversion, simply use the filterChain() filter function). Easy configuration of the Printer Application by the implementer: One only needs to put some basic data into a structure of type pr_printer_app_config_t (which is a part of the global data structure), create the arrays of data format conversion methods in priority order, make sure that the CUPS filters and PPD files are at the right place, and call the Printer Application's main loop. Can all be done in the main() function. Future library functions start with pr_..., the ones starting with ps_... are specific to the PostScript Printer Application. As a sneak preview I have uploaded the code as an attachment to a GitHub discussion. Or simply download it directly: ps-printer-app.c.txt To try it out, take the GIT master of the PostScript Printer Application and replace its ps-printer-app.c file by this file. Then build the Snap (or build classically with newest snapshots of cups-filters and PAPPL) as described in README.md. As a result you should get the PostScript Printer Application with its usual features, probably indistinguishable from the original, but with the new innards. And this will also be the future of it, once the library is started as a new GitHub repo at OpenPrinting. pwgtoraster() filter function Many of the classic CUPS drivers are the so-called CUPS Raster drivers, where the job in a device-independent, designed-for-printing, standard raster format, CUPS Raster, is fed into a CUPS filter, usually with name starting with rasterto, which turns the input into the printer's native, often proprietary language. One can easily recognize these filters by a line like in the PPD file. Retro-fitting those into a PAPPL-based Printer Application is not trivial, especially if one wants to use the streaming raster-printing mode of PAPPL, which is once required to be supported in a Printer Application and second, very useful for large jobs and especially large paper sizes and that even more in combination with low-spec IoT devices. In spooling mode the retro-fit of these drivers is easy, as one can easily call the filter chain which CUPS would use. In streaming raster mode we run into the problem that CUPS Raster supports a lot of different, often exotic color spaces and that also in several different color depths. This would mean, that the 5 raster printing callbacks (start job, start page, print pixel line, end page, end job) need to be able to convert the input into all these color spaces. To implement this only for retro-fitting old drivers is a lot of work, especially as we have this already nicely working in cups-filters, in the gstoraster and pdftoraster filters (ghostscript() and pdftoraster() filter functions). So I have gone another way: The pdftoraster() filter function has everything to convert the 8-bit RGB raster output of Poppler into any of the color spaces needed for CUPS Raster, and this filter already exists for long time and just works. So I have derived a new pwgtoraster() filter function (there is also a pwgtoraster CUPS filter executable for easy testing) from the pdftoraster() filter function, throwing out Poppler and taking PWG Raster as input, allowing only the color spaces 1-bit monochrome, 8-bit grayscale, and 8-bit RGB and converting to the destination color spaces from these. As what the raster printing callbacks of a Printer Application receive is more or less PWG Raster I can simply pass through this raster data when pre-filtering with pwgtoraster() before calling the rasterto... filter defined in the PPD. The new filter function has the following special properties: As streaming as possible: For chunked and banded color orders the data streams \"by-pixel-line\", meaning that a line is read from the input, converted, and immediately sent to the output, before the next line is read. Only when the colors are ordered in planes the streaming is only \"by-page\". Pre-conversion of resolution and color space: The resolution and color space/depth/order for the CUPS Raster data to be fed into the filter is not simply defined by options and choices with intuitive names, but by the PostScript code attached to the choices of the options in the PPD which are selected for the job, like <>setpagedevice or <>setpagedevice. The CUPS filters collect all of the selected ones and interpret them with a mini PostScript interpreter (ppdRaterInterpretPPD() in libppd) to generate the CUPS Raster header (data structure describing the raster format) for the page. Unfortunately, resolutions are not always defined in the \"Resolution\" option (for example in \"Print Quality\" instead) or the resolution values do not correspond with the human-readable choice names, same for color spaces not always defined in \"ColorModel\". As with this the information the Printer Application has from the PPD often does not reflect the driver's actual requirements, the filter function pre-converts resolutions and color spaces as needed. Note that the integration of this filter function into the retro-fit Printer Application code is not yet done, meaning that a CUPS Raster driver retro-fit will not work yet. Capturing of stderr output in the log Printer Applications with PAPPL have a nice logging facility and filter functions in cups-filters support this logging facility. Now I have added capturing of stderr of the called external CUPS filter executable for logging to the new filterExternalCUPS() filter function (see last month's news) and also capturing of stderr of Ghostscript to the ghostscript() filter function. This way the stderr output gets correctly into the log file of the Printer Application instead of leaking into the syslog. Currently released is 2.3.3op2. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 18 months. Ubuntu Hirsute Hippo (21.04) comes with CUPS 2.3.3op2, the CUPS Snap and the PostScript Printer Application Snap use the current GIT master. Currently released is 1.28.9. Feature additions are principally done for retro-fitting classic CUPS drivers, see details in the separate section, but also work of our GSoC students: Added pwgtoraster() filter function In filterExternalCUPS() and ghostscript() filter functions now stderr output of external executables is captured for logging rastertopdf(), ghostscript(), texttotext(), imagetoraster(), pdftops(), and imagetopdf() support printer and job IPP attributes now and so do not need PPD files any more The pdftoraster CUPS filter is converted to a filter function now The rastertopwg filter of CUPS is now added as filter function rastertopwg() Also several bug fixes were done: cups-browsed: Make NotifLeaseDuration configurable and renew after half the lease duration not 60 sec before end The pdftopdf() filter function now works correctly with unseekable input Removed unneeded test code from libfontembed Fixed pdftopdf() filter function to correctly support page ranges without upper limit, like \"10-\" Minor fixes 1.28.9 Bug fix release, fixes backported from the master (2.x) branch (see below) Ubuntu Hirsute Hippo (21.04) comes with cups-filters 1.28.8, also the CUPS Snap currently uses this version. The PostScript Printer Application Snap uses the current GIT master of cups-filters. Currently released is 1.0.3. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-July-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - July 2022",
+ "url": "/OpenPrinting-News-July-2022",
+ "headings": [
+ "New web pages about our work",
+ "GUADEC 2022",
+ "Google Summer of Code 2022",
+ "CUPS Snap and snapd printing interface",
+ "Approaching cups-filters 2.0",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "New pages about our work, GUADEC, GSoC 2022 projects, \"cups\" snapd interface bugs fixed, PPD-independent cups-filters 2.x, CUPS",
+ "content": "At Canonical I got told some weeks ago that someone asked what Canonical is doing for printing with Linux. The person seems not having been aware that Canonical is paying me to lead OpenPrinting full-time. This brought us to the idea to soon post a Ubuntu Blog article and to support such an article we need more detailed information about what OpenPrinting is doing, to link it from there and also partially re-post it in the blog. Therefore I have decided to add three articles to our static web site (not the News and Events blog series here): How did this all begin? Our principal achievements What we are currently doing The first is derived from my blog article about how I got started with OpenPrinting, the second one is about what we have achieved in all the time, and the third will be about what we are currently doing. The first two are already available (simply follow the links) and the third I will write soon after I an back from GUADEC. The new pages are all linked from our \"About Us\" page. GUADEC 2022 in Guadalajara in Mexico is approaching! Next week we will celebrate the 25th anniversary of GNOME! It is the first time for me to attend a GUADEC and also the first time for me to visit Mexico. In my talk (July 21, 14:20 - 15:00 local time, Bosch Auditorium) I will spread the news about our GSoC work on the \"Printers\" module of the GNOME Control Center and on the GTK print dialog and also introduce the GNOME Community into the New Architecture of printing and scanning (Update: slides). You will probably often enough find me at the Canonical booth (or better gathering table, see last month's news). If you cannot make it to Guadalajara in Mexico but to Berlin, you can get to a satellite event, the Berlin Mini-GUADEC 2022 in the C-Base and meet Berlin's/Europe's GNOME community and besides local sessions, hackfests, ... also have a public viewing of the complete GUADEC. And some talks of the GUADEC are even performed in Berlin and transmitted live to Mexico. This is the wonderful world of hybrid (in-person + online) conferences! Now we are one month into the coding period of the Google Summer of Code 2022 and all our 8 contributors are doing great work! All of them have posted a little summary of what they have done in our group chat on Telegram: Converting Braille embosser support into a printer application Contributor: Chandresh Soni Mentors: Till Kamppeter, Samuel Thibault I researched the existing implementation of Braille in cups-filters and how things operate to have a general concept of how braille embossers work and what functionality they bring. I learned about liblouis and ImageMagick, which are used to transform basic text or images to Braille. I've also configured a virtual BRF printer. Now I'm attempting to implement the current filter features, which is converting old shell scripts to C. Scanning Support in PAPPL Contributor: Deepak Khatri Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar I have already looked over PAPPL code and some implementations of it, and it is functioning well. I've also seen the PAPPL scanning work that Bhavna Kosta and others have done in the past. I'm currently going through the current PAPPL scanning issues. I'll try to fix some of the issues in the approaching days as I continue working. Adding Common Print Dialog Backends (CPDB) support to existing Print Dialogs Contributor: Gaurav Guleria Mentors: Till Kamppeter Hello. I have been working on writing the GTK CPDB print dialog backend, and it's going good. It has been a bit slow, as there is no online documentation regarding it and I have to constantly refer the GtkPrintBackendCups and GtkUnixPrintDialog files along with various others. Some of the files aren't even commented and follow old Gtk code conventions, so it takes some time to understand them (I even talked to Emmanuele Bassi about this). Nevertheless, due to the progress I had made earlier as well as putting in some extra hours, I will be able to complete it by the end of first month of GSoC as proposed in the timeline. I plan to finish it by this week, so I can fix any bugs or continue with the qt backend. I just have to add support for multiple backends, configure media-margins and borderless option properly, and add a few more things. I also fixed some more issues with the cpdb-backend. Gaurav's GitHub repository GNOME Control Center GUI for discovering non-driverless printers and finding suitable Printer Applications for them Contributor: Mohit Verma Mentors: Till Kamppeter, Michael Sweet, Pranshu Kharkwal, Divyasheel, Deepak Patankar Hello all, I am currently working on updating the discovery of devices in cups-pk-helper.We will use PAPPL, Printer apps, and lpinfo (as long as it is accessible) in the new approach of device discovery .I had to understand the current functions of cups-pk-helper and the general architecture of G-C-C, which was using it to locate and configure printers.I will try to complete this by next week.After that, I will be working on creating a GUI for printer application set up dialog whose design is ready. I will be sharing the design on the link given below once I am done updating cups-pk-helper. One of the most challenging task for me till now was to use gnome-builder to build current branch of G-C-C. There were too many dependency errors and other weird errors while building it.I had to ask for help at several Gnome IRC channels and even creating a issue at gnome-builder gitlab's page.Finally, I was able to build it successfully after a lot of errors and using few tricks suggested by Christian Hergert(maintainer of gnome-builder).Here's the link for discussion on the new printer dialog. Issue report with discussion on Mohit's work. Scanning Support in PAPPL with eSCL Support Contributor: Rishabh Maheshwari Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar I have completed learning about both AirSane and PAPPL and have marked the important files and some other related files in them and I have prepared short notes for the description and usage of these files. Currently, I am trying to use the code from AirSane and use it in PAPPL in one of the scan functions to make our eSCL parser by making the required changes in it in. Add Avahi calls for discovering and resolving driverless IPP printers and Optimize the processes Contributor: Sachin Thakan Mentors: Till Kamppeter, Michael Sweet, Deepak Patankar Hi all, until now I was doing online reading and trying to understand the implementation for service discovery using avahi and bonjour. From this week I starting to work on segregating the tasks of service browse and service resolve and will try to finish the utility for at least one of them and subsequently make a push. Make a native Printer Application from Gutenprint Contributor: Sahil Kumar Dhiman Mentors: Till Kamppeter, Michael Sweet, Solomon Peachy, Robert Krawitz I have been actively working to understand the PAPPL framework. I have learnt basics of PAPPL and proceeded to knowing the libgutenprint library. I had made myself familiar with the most of the APIs. Having read and understood the workflow of hp_printer_app I have begun modifying the code for Gutenprint Printer Application. The hard task of getting the capabilities of printer using the libgutenprint library has been almost completed. I am also finishing my code after which I will be working on printer admin web interface. All the documentation will also be updated as time progresses. Sahil's GitHub repository Create new printer setup tool for the GNOME Control Center Contributor: Shivan Mishra Mentors: Till Kamppeter, Pranshu Kharkwal, Divyasheel, Deepak Patankar Hello all, I have been working on modifying Divyasheel's code for adding functionality to list IPP printing services in the main panel along with CUPS queues. I plan to finish it by this week so that I can move over to adding IPP Device Configuration System Service in the base hybrid module. Other than this, I have also been working on removing widget for setting of drivers (PPD) in the Printer Details dialog for printers advertised as IPP services over DNS-SD. Feature requests so far: #1877: Improve setting of IPP options #1878: Allow to add new printers via Printer Applications #1879: Do not show setting of drivers for IPP printers #1911: Printers: Make adminurl available for IPP printers CUPS Snap in the Snap Store The cups snapd interface is now fully working as documented! The bugs we told about last month are all fixed and appropriate CUPS Snap and snapd versions are released. Also the CUPS Snap is now auto-connecting the system's cups-control interface. So snappers only need to follow the instructions in the mentioned documentation to use the cups interface in their apps and users of applications plugging the cups interface can just print. Note that there is still no further application using the cups interface except the first two, especially Firefox, Chromium, and LibreOffice did not switch over to it yet. Continuing the restructuring to have libppd depend on libcupsfilters instead of libcupsfilters depend on libppd, as introduced in May. Continuing to restructure the code to separate the siamesian twins of the filter functions and PPD file support: Made the cfFilterRasterToPWG(), cfFilterPWGToRaster(), cfFilterGhostscript(), cfFilterImageToRaster() and cfFilterImageToPDF() filter functions free of PPD file support and created appropriate ppdFilter...() wrapper filter functions in libppd for them. Also had a look into the cfFilter...ToPS() filter functions but they will not get converted but completely moved over to libppd, considering not only PPD files obsolete but also the PostScript format (at least when not used in a PostScript printer driver with PPD). Tested handling of media size, margins, and page geometry and found some issues. Did several improvements on the cfGetPageDimensions() and cfGenerateSizes() functions to solve the problems. Added support for page size variants in PPD files (A4, A4.Borderless, A4.Duplex, ... differences in margins, sometimes even a bit in the size dimensions) Now we are also matching of custom page sizes and pages rotated by 90 degrees. Support for the Duplex (sides) option. Support for using the sizes of the input file's pages when not explicitly requesting a page size, no page scaling (page-scaling=none), and no special layout features like N-up or booklet printing. This allows documents with differently sized pages to be printed. When working on the cfFilterGhostscript() filter function bumped into problems with Ghostscript's cups output device. It allows supplying the backside orientation for duplex, the need of software copies, and the CUPS Raster version only via PPD files, so added appropriate functionality for setting these parameters without PPD file to the Ghostscript device in the Ghostscript upstream repository. Have the cfFilterPDFToPDF() and cfFilterImageToPDF() sharing the JCL/PJL support code for classic native PDF printers. Remaining filter functions to be converted: cfFilterBannerToPDF(), cfFilterTestToPDF(), and cfFilterUniversal(). I still need to check whether to convert also cfFilterTextToText(). So we come close to cups-filters 2.x. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|74900| |ipp-usb|ipp-usb|2287| |ps-printer-app|PostScript Printer Application|2313| |ghostscript-printer-app|Ghostscript Printer Application|1482| |hplip-printer-app|HPLIP Printer Application|4864| |gutenprint-printer-app|Gutenprint Printer Application|4128| Currently released is 2.4.2. There will be further bug fix releases in the 2.4.x series. Some bug fixes were done during the last month, see changes below. Ubuntu Jammy Jellyfish (22.04 LTS) comes with 2.4.1. Ubuntu Kinetic Kudu (22.10 will most probably come with a later 2.4.x. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.15. We are continuing to restructure the code to separate the siamesian twins of the filter functions and PPD file support and after that we will finally polish and bug-fix the code for the 2.0.0 release. See above for more details. The re-structuring made me not doing any further bug fixes on cups-filters, so there is also nothing to backport to 1.x. Ubuntu Jammy Jellyfish (22.04 LTS) comes with cups-filters 1.28.15. Ubuntu Kinetic Kudu (22.10 will be the first Ubuntu coming with cups-filters 2.x. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.2.1. In the last month only some minor bug fixes got done, also fixes for libcups3 (CUPS 3.x) compatibility, and addition of translations from Weblate. I have started to work on adding the new PAPPL 1.2.x features (SNMP-based supply level readout, localization/human-readable strings for options/attributes) to pappl-retrofit. See above. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-July-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - July 2023",
+ "url": "/OpenPrinting-News-July-2023",
+ "headings": [
+ "GUADEC 2023 in Riga",
+ "Opportunity Open Source in the IIT Mandi, India",
+ "DebConf 2023 in Kochi, India",
+ "Ubuntu Summit 2023 in Riga",
+ "Google Summer of Code 2023",
+ "The CUPS Snap in Ubuntu 23.10",
+ "Rehearsal for the all-Snap desktop distro",
+ "Snappy scanning: simple-scan Snap is working now!"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/dVVyokoQl2k/hqdefault.jpg",
+ "snippet": "GUADEC 2023 in Riga, Opportunity Open Source in IIT Mandi, India, Ubuntu Summit 2023 in Riga, GSoC 2023, Ubuntu 23.10 with snapped CUPS, versioned Printer Applications.",
+ "content": "My work since the last news post was mainly organizing and preparing for conferences and updating and improving our Snaps, of CUPS, ipp-usb, and the 4 Printer Applications. The work on our Snaps is to prepare them for the default inclusion in Ubuntu 23.10 and in Ubuntu Core. We had to version the Printer Applications, promote them to the stable channel, the cups-control interface got checked for different system types and fixed to work on all of them, ... And we have a lot of conferences again, GUADEC, DebConf, the second Ubuntu Summit, and a new one: The Opportunity Open Source in the IIT Mandi! And this one is my baby! We have many students from the IIT Mandi under our GSoC contributors, and so Aveek Basu and me decided to neet them in-person to motivate even more. But next up is GUADEC. On the GNOME developer conference I will tell about the state of the art of the GNOME UI for printing, teach application developers how to make Snaps to be distributed in the Snap Store, an discuss the printing-related topics in a BoF with GNOME developers. And stay updated on Mastodon: #OpenPrinting. Tomorrow the GUADEC in Riga, Latvia, will start! I am already on the way to there. Update: All session times corrected I have now prepared everything for my 3 sessions, especially the slides (linked below) but also the exercises and examples and a virtual machine image for the Snap workshop. See the schedules. Please also keep an eye on Mastodon for updates: #GUADEC2023, #GUADEC Also note that if you cannot make it to Riga you can register as remote attendee and then watch all the talks live (and also ask questions via keyboard, as far as I remember). On Tuesday I will get to Riga, meet my colleagues and friends, attend some exciting sessions, have an even more exciting hallway track, and will host these sessions: The New Printing GUIs: GNOME Control Center and Common Print Dialog Backends Wed, July 26, 11:00 EEST, room 2 Slides Update: Video Right on the first day I will talk about the state of the art of the printing GUIs for the New Architecture, the \"Printers\" part of the GNOME Control Center and the Common Print Dialog Backends (CPDB) support in the print dialogs and will also demo the GUIs. I will also announce my BoF then. Your app everywhere, just in a Snap! (Workshop) Sat, July 29, 15:15 EEST, room 1 (Update) Slides This GUADEC will get snappy! In this 2-hour interactive workshop you will learn how to snap (= package as a Snap) your favourite applications! You will snap a simple GNOME application on your own laptop and after that we (me and Jesús Soto) will also help you to snap your applications. Update: The workshop got moved to two hours later to not run in parallel with the only other workshop on the GUADEC, \"Discover GNOME development with Workbench\" at 12:00 in room 2. If you want to attend the workshop, please prepare your laptop for the hands-on exercises, by installing the needed software or downloading our virtual machine image. Instructions are in the \"Setup\" section of the slides and here is the Ubuntu 23.04 virtual machine image with everything needed alrady installed. Note that the *.qcow2 image is 5.7GB large, so please download it as soon as possible and especially not during the workshop. GNOME/GTK Printing BoF Sun, July 30, 13:30 EEST, room 3 Slides During my work on the New Architecture for printing and a recent discussion with GNOME developers and designers, I have 2 subjects I want to discuss in-person: UI Design for the GNOME Control Center \"Printers\" module with support for the New Architecture Separation of GTK printing API into its own project Main participants of the discussion are me, Matthias Clasen, and Jakub Steiner. Anyone is invited to participate. Remote participation is possible and I expect that Mohit Verma, GSoC contributor on the \"Printers\" module of G-C-C, and Gourav Guleria, GSoC contributor (2022) and mentor (2023) on CPDB support in print dialogs will connect. Canonical/Ubuntu Booth Wed-Fri I will also be at the booth for some time and will be able to demo recent work on printing, scanning, Snap, and Ubuntu, and also help you preparing your laptop for the Snap workshop. Organizing every year the participation of the Linux Foundation as mentoring organization in the Google Summer of Code (GSoC) and mentoring contributors for OpenPrinting I work together with Aveek Basu who joined OpenPrinting when he worked at Lexmark in India. He is reaching out to colleges and universities in India and this way we have every year around 5-7 students as contributors for OpenPrinting, most of them studying at the Indian Institute of Technology (IIT) in Mandi. With the DebConf being in India, Aveek and me have decided to meet most of our current and former contributors in-person and motivate the students, professors, and researchers to join the community of developers, designers, doc writers, … in a 2-1/2-day conference, the \"Opportunity Open Source\". We will talk with our contributors about their GSoC experience on a panel have a GSoC Q&A session have the contributors presenting their work have talks about OpenPrinting have talks about Zephyr have Rudra Saraswat on the conference giving talks about his projects Ubuntu Unity and blendOS. have a panel and Q&A with Canonical employees telling about jobs at Canonical, how to apply, how the work will be. have a talk (and perhaps also a workshop) about Snap by me. By a Call for Proposals (extended to August 14) we hope to get even more contributions. And for the attendees getting some real-life experience we are running this year’s OpenPrinting Roadmap Sprint (like our micro-conferences on Linux Plumbers: 2019, 2020, 2021, 2022) on the conference and attendees can participate in the discussion and planning of the next 12 months in printing and scanning. We will also live-stream and record everything and allow remote participation. The conference takes place on September 8-10, right before the DebConf. By the way, I have extended the Call for Abstracts to close on August 14. There is a thread on Ubuntu Discourse. And we keep you informed via Mastodon: #OpportunityOpenSource I hope to see you all in Mandi! And thsi year I will be on Debian's annual developer conference, DebConf, for the first time! This year´s edition takes place in Kochi, in the south of India. This is the annual 2-week meeting of the Debian developers to plan their work, 1 week DebCamp on Sep 3-9, informal, hackfest, BoFs, and a second week on Sep 10-17, with talks, panels, workshops, ... I will attend the second week, starting from the 11th or 12th, depending on when and how well I will arrive from Mandi. I have submitted two presentations: The New Architecture for Printing and Scanning on Debian With the DebConf taking place right in the new cycle after the Bookworm release I will tell the Debian developer community about the New Architecture of printing and scanning to help them switch the Debian distribution to the new IPP-only PPD-less realm. The talk will also cover any news from our roadmap sprint in Mandi. Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! This talk is about how we have organized the conference, the challenges, and naturally also the outcome and experiences with running it, having come right from there to the DebConf. And we will have a Q&A session about organizing conferences and also being a mentoring organization for the Google Summer of Code. So everyone interested in running a free software conference and/or participating in the Google Summer of Code is welcome to participate in this session. Preparations for another great Ubuntu Summit are going on. The Call for Proposals has ended on July 21 and we got a whopping 178 proposals!! So we are reviewing like hell as we have a lot to select from. I have also submitted some proposals, partially together with colleagues, a talk telling about my experience with the Opportunity Open Source in the IIT Mandi, a workshop about packaging applications as Snaps (\"snapping\") together with Lucy Llewellyn, and another workshop, about Snap update automation on upstream releases with Heather Ellsworth. Notification of acceptance of the sessions is planned to be sent out on July 31, probably we will also have the schedules then. 5 of our 6 contributors have passed midterm and I as mentor and org admin got many positive evaluations from them. The 6th contributor did not fail, but we have postponed his remaining part of the GSoC, including midterm. Some of the contributor's evaluations: Akarshan Kapoor (Scanning support for PAPPL): Both the organization and the mentors have been excellent throughout my participation in GSoC. The well-structured and supportive environment provided by my organization has made the program a highly enriching experience. My mentors have been outstanding, offering consistent support and sharing their expertise, contributing significantly to my learning and growth. My experience with GSoC has been exceptionally positive due to their concerted efforts and dedication. Kushagra Sharma (CPDB support for Chromium, Mozilla, LibreOffice): I wanted to take a moment to express my utmost gratitude and appreciation for the invaluable guidance and mentorship you have provided by mentors at linux foundation Pratyush Ranjan (CI Testing for OpenPrinting): Hi, you guys have been great, and I appreciate working with you all. Write-up from Kushagra: OpenPrinting: CPDB support for application's print dialogs: Firefox, Chromium, LibreOffice Contributor: Kushagra Sharma Mentors: Till Kamppeter, Gaurav Guleria, Shivam Mishra, Rithvik Patibandla, Ira McDonald After building chromium from source, I have created a dummy print backend which implements all the virtual functions in /printing/backend/printing_backend.h. After this next task is to add this dummy print backend to build files of ninja. The implementation requested from chromium dev team is that they want to select which print backend in runtime. I am currently working on how to tackle this task as currently if CUPS print backend is available then it is automatically using it and not the dummy print backend. Chromium team has asked me to push the changes on the gerrit so that they can assist. This will be my upcoming task And Google does the Mentor Summits in-person again! So I will be on this year's Mentor Summit, October 13-15 on the Google Campus in Sunnyvale, California! Here I will meet my fellow mentors from a lot of different free software organizations to exchange experience, tell about the Opportunity Open Source in the IIT Mandi, and, with Ubuntu 23.10 being released on October 12, celebrate the release! Now it finally happened! Ubuntu is switched over to use the CUPS Snap as its printing stack. The Debian package of the CUPS daemon and of the classic CUPS drivers are going away. First, do not rush out to grab Ubuntu 23.10 (Mantic Minotaur) and install it for testing it out, it has still too many rough edges in terms of printing. Especially do not install it on your daily driver machine, as usual, you should not use a development branch for your daily work ... I worked together with Sebastien Bacher, leader of the distro squad in the Canonical Desktop Team. He told me what is needed for the installation image inclusion (\"seeding\") of my Snaps and I told him which Snaps have to get seeded and which Debian packages removed, and finally he switched over and current daily ISOs use the CUPS Snap as their printing system. The Snaps being all migrated to core22 (Ubuntu 22.04 LTS) as base distro and all their components updated to the newest upstream versions already last month I now had to give them version numbers nad release all of them on the \"stable\" channel in the Snap Store. CUPS is already versioned, by CUPS' upstream version number plus a package release number, similar to the (classic) packages of Linux distributions. The upstream version number is taken from the metadata of the GIT snapshot of the CUPS upstream code loaded. The correct GIT snapshot is selected via the release tag (source-tag: in snapcraft.yaml). This method is already a preparation for future automation of updating the CUPS Snap triggered by a new upstream release of CUPS via GutHub workflow. The 4 retro-fitting Printer Applications get their version numbers from their principal component, plus a package release number: PostScript Printer Application: foomatic-db, current version 20230715-1 Ghostscript Printer Application: Ghostscript, current version 10.01.2-1 HPLIP Printer Application: HPLIP, current version 3.22.10-1 Gutenprint Printer Application: Gutenprint, current version 5.3.4-1 For all of them I select the version via upstream release tags, so that later automation will get easy. No with all Snaps versioned I have promoted the current versions of them into the \"stable\" channel, and in addition, created ubuntu-23.10 branches for them in the Snap Store, as this is needed for inclusion in Ubuntu 23.10. With this in place we could change the seeding in Ubuntu 23.10: Removed Debian (binary) packages: cups-daemom cups-browsed cups-filters ipp-usb printer-driver-* system-config-printer-* Added Snaps: cups ipp-usb ps-printer-app ghostscript-printer-app hplip-printer-app gutenprint-printer-app Note that the removal of the mentioned binary packages of CUPS does not eliminate the need of the source Debian package \"cups\", as we still need the CUPS library, libcups2, of it. Applications with print functionality installed classically, as Debian package, need this library. Here things get improved with CUPS 3.x, as here the CUPS library comes as separate upstream source. To be able to remove system-config-printer, Sebastien has updated the gnome-control-center package, removing the patch which adds the button to start system-config-printer for advanced configuration. system-config-printer is not actively developed any more and therefore did not get updated to support the New Architecture. Principally, it is planned that the Printer Applications are only downloaded and installed if actually needed, and not included by default. We are temporarily seeding them as the work on the needed functionality in GNOME Control Center is not yet completed. As soon as this is done, they will not get seeded any more. I have also tested the cups-control interface whether it is working correctly with the different system configurations, especially if the classic CUPS installation is replaced by the Snap, both on classic Ubuntu and on Ubuntu Core (all-Snap immutable distro). Here we already got a bug report of cups-control not getting correctly auto-connected on Ubuntu Core, which made me more intensely testing and discussing my observations on this thread. And we really needed a fix here, which James Henstridge fixed by this pull request. Now, if a Snap is installed from the Snap Store which has permission to auto-connect cups-control, gets it auto-connected to the system's :cups-control slot only if a classic CUPS is installed, identified by the presence of an /etc/cups/cupsd.conf file, otherwise it gets connected to the cups:cups-control slot of the CUPS Snap. This way we can have printer setup tools distributed as Snaps and they connect to CUPS as expected by the user. Next steps are: CUPS migration script: Similar to how it got done for the introduction of the Firefox Snap in Ubuntu we will create a transitional Debian package providing a binary package with the name \"cups-daemon\" and a version number higher than the one of current CUPS. This way the package will replace the current cups-daemon package which actually contains the CUPS daemon on a update. It does not install any files but has a post-install script which installs the CUPS Snap, migrates the classic CUPS' configuration from /etc/cups/ to the Snap (/var/snap/cups/common/etc/cups/), taking into account that we now need Printer Applications instead of classic drivers, so installing the needed Printer Application Snaps and migrating the print queues from CUPS into the Printer Applications. In the end the /etc/cups/ directory gets deleted (or at least renamed), so that cups-control of client Snaps gets auto-connected correctly to the CUPS Snap. Add support for the New Architecture to GNOME Control Center: We need at least the essential parts from Mohit Verma, GSoC contributor on this part, before Feature Freeze mid-August. This is to make the \"Add Printer\" part working and to let the main view show visible grouping of the listed IPP services if they come from the same Printer Application or the same multi-function device. More detailed changes, like the UI design worked out by Mohit together with Canonical's Elio Qoshi Mohit will implement during his extended GSoC time until end-October. Add Common Print Dialog Backends (CPDB) support to all print dialogs: All print dialogs will be migrated from direct CUPS use to using the Common Print Dialog Backends. Once we replace \"bad\" CUPS access implementations which do not support temporary CUPS queues which CUPS creates for discovered IPP print services or directly access PPD files in /etc/cups/ppd/, and second, we pass the maintenance responsibility for the print dialogs to suppor the print technologies correctly from the GUI and app maintainers to the maintainers of the print technologies themselves, as they also should provide the backends. For CUPS this is OpenPrinting. But as long as we do not achieve this goal, we will keep cups-browsed in the distro to assure that the old dialogs keep working ... Install the Legacy Printer Application (legacy-printer-app) by default: With it installed, a classic CUPS driver, like a proprietary driver from a printer manufacturer, will get visible in this Printer Application and so printers can get set up with this driver. For actual seeding I will need to post a Main Inclusion Request (MIR), to get it into the Canonical-supported Main part of the Ubuntu distro. The switchover from classic Debian packages to Snaps for printing in Ubuntu 23.10 serves not only to prepare for Ubuntu 24.04 LTS and even more future Ubuntu versions which will use CUPS 3.x, but it is also a rehearsal for the all-Snap desktop. As already told about on an Ubuntu blog post by Oliver Smith, product manager Desktop at Canonical, we are also working on an all-Snap desktop distro based on Ubuntu Core (there are already first images of it for testing, but please, do not use for your daily driver). This is also an immutable distro, but not as immutable as most others, because of the fact that its application package format, Snap, cannot only distribute desktop applications, but also daemons and system components. One good example of such Snaps is the CUPS Snap with is not just an application but a complete printing stack in one Snap. On most other immutable distribution, the printing stack, probably even the printer drivers, are in the immutable core, making it hard for printer manufacturers to add drvers. So here we have, as usual, an immutable core (based on the current Ubuntu LTS, currently 22.04), but then not only immutable user applications but also immutable system components, like the CUPS Snap providing the printing stack and printer and scanner drivers in separate Printer/Scanner Application Snaps. By the way, even GPU drivers are available as modular components. Note that printing in Ubuntu Core Desktop is only superficially tested, so do not bet on it already working currently ... And as users of also want to be able to scan from snapped applications, especially also if we have an all-Snap distribution, we need to test this, too. As a first Snap of a scanning application, there is the Snap of Simple Scan. It was already there longer ago but probably never got well tested, as it turned out that it actually did not work, not being able to access scanners (Pull request) and that it was not prepared forall types (eSCL and WSD) driverless scanners and Scanner Applications (Issue). I have investigated the problem and fixed it and the fix is now included. Now we have tested it on driverless scanners (scanning part of driverless IPP multi-function printers) and it works. So we are ready for a consistent scanning experience in the Snap and Ubuntu Core Desktop world!"
+ },
+ {
+ "id": "post:OpenPrinting-News-July-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - July 2024",
+ "url": "/OpenPrinting-News-July-2024",
+ "headings": [
+ "GUADEC 2024 in Denver",
+ "Opportunity Open Source in IIT Kanpur",
+ "UbuCon Asia 2024 in India",
+ "Google Summer of Code 2024",
+ "Pull Requests"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/zU035efP2p0/hqdefault.jpg",
+ "snippet": "Caution, non-driverless printer!, Interview by Podcast Ubuntu Portugal, Flatpaking daemons, GUADEC 2024, Opportunity Open Source in IIT Kanpur, UbuCon Asia 2024, GSoC 2024, Pull Requests",
+ "content": "This month I will start with a very important warning: Some months ago I talked here about HP's crazinesses to lock their users into expensive original ink and that following reported user experience I recommended to buy Brother printers instead of HP. I also told that typical modern printers, also cheap ones, are driverless IPP (AirPrint, Mopria, IPP Everywhere, Wi-Fi Direct Print) nowadays. But unfortunately, there are still exceptions: There is the ultra-cheap USB-only Brother DCP-L2600D (for Europe/Africa/Asia markets), which is not driverless and therefore useless under Linux! Thanks to Zdenek Dohnal from Red Hat, who got note of it and reported on our developer mailing list. Michael Sweet mentions this printer's North-American Wi-Fi sibling DCP-L2640DW which is also not driverless and tells we need to do better in telling which printers to buy. Solomon Peachy (Gutenprint) answers that inside printers the print engine and the networking engine are separate parts and the IPP support comes from the networking engine, and so IPP-over-USB is usually only available in network printers and not in USB-only printers. All-in-all one should really check whether a printer supports driverless IPP protocols like AirPrint or Mopria, according to what is written on the box, and what most printers do, fortunately. And to make it even easier we have now a button to get to our driverless printer list right in the banner of our home page. By the way, HP has withdrawn from one of their madnesses. They were selling cheaper versions of several laser printers with an \"e\" added to the end of the model name and users of those printers were required to join HP+ and to keep the printer always connected to the internet. These models are now discontinued and only the somewhat more expensive versions without \"e\" but full liberty continue to be available. But existing \"e\" models continue to require HP+. I am back from GUADEC 2024 in Denver and did not only give a talk about Snap but learned about the efforts towards flatpaking daemons and methods of analysing graphical results in CI testing. And the next conference is already around the corner. The CfP for the second Opportunity Open Source in Kanpur, India, has ended and the schedules of 50 sessions are published. Once in India I will be on two conferences again, also on the UbuCon Asia 2024 in Jaipur on the following weekend. Some weeks ago I got interviewed by Diogo Constantino, one of the hosts of the Podcast Ubuntu Portugal, and now this interview got published as episode #310. I talk about how I got into computers, free software, printing, ... How I started OpenPrinting. And I also talk about Snap ... But note that it is all in Portuguese, Diogo speaking Portuguese of Portugal and I speaking Portuguese of Brazil. And Diogo invited me to the Festa do Software Livre 2024 in Aveiro, Portugal, which is co-hosting the UbuCon Portugal. While I have put a lot of work into the Opportunity Open Source the Google Summer of Code contributors have carried on with their great work. And even better, they did not only work on their code but Biswadeep Purkayastha, contributor for CPDB support in LibreOffice and his mentor Michael Weghorn did a lot of fixes and improvements on the CPDB code. Also Zdenek Dohnal from Red Hat posted some Pull Requests on OpenPrinting code. See it all here. Did you know that humans have even printed in space? The Space Shuttles had a 59-pound-weighing 80-column line printer on board. See also the comments, where it is told that the line printers got later on replaced by stock Epson Stylus Color 900 inkjet printers. So let us see what happened at OpenPrinting in July ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat Photos and Videos I am back from a great GUADEC in Denver, Colorado, in the US! It was a great event. First I met some good friends, especially Heather Ellsworth from Thunderbird and Ken VanDine, Marco Trevisan, Aaron Prisk, and Jeremy Bicha from Canonical, but also many others on the event. I already arrived on Wednesday afternoon to attend a GSoC Meet-up which GSoC lead Stephanie Taylor organized as she was already there anyway for her keynote on Sunday. So I met Stephanie and some GSoC mentors and contributors, one even from the beginning of the GSoC, wearing the t-shirt from 2005, the very first year (I was late on the party, started mentoring from 2008 on). The next day I finally met the GNOMies and who else attended GUADEC on the pre-registration meeting. Friday to Sunday were the 3 days for the talks (All videos). I have given a talk, too: Snap and Ubuntu Core Desktop - Desktop Linux, as easy as a smartphone! Slides, Video Here I explained what Snap is and how it worked and also how the all-Snap immutable operating system, Ubuntu Core, for which Snap was originally created, works. In the end I also showed how adding a desktop session Snap (Wayland + Desktop Environment) turns it into the Ubuntu Core Desktop operating system. As usual, having proposed the talk as a 40-min talk I got only 25 min, but this time I succeeded to finish in around 20 min leaving some time for questions and Ken VanDine, one of Canonical's Ubuntu Core Desktop promoters, helped my nicely to answer them. There were also great keynotes, the subject matters of both affecting me especially: Thunderbird, The Death and Rebirth of an OSS Project Video Ryan Sipes, lead of Thunderbird, tells how he saved Mozilla's e-mail client from the death and made it awesome again. I am long term lover and user of Thunderbird, I use it already for more than the 20 years that it is named Thunderbird, in the beginning as part of Netscape Communicator even. Ryan, thanks to keep it rolling. Google Summer of Code 20 years of OSS Mentorship Video Stephanie Taylor, lead organizer of the Google Summer of Code at Google, tells everything about the Google Summer of Code and what was achieved with it. I did not participate from the very beginning, but I am long-term org admin for the Linux Foundation as mentoring organization in the GSoC, from 2008 on (4th GSoC). And GSoC has done very well for OpenPrinting. Monday and Tuesday were the days of BoFs and workshops. I have attended some of the sessions, especially Workshop: openQA testing for your GNOME app, module or service openQA GitHub Here Sam Thursfield and Outreachy interns Dorothy Kabarozi and Tanjuate Achaleke have shown how automatic testing of GNOME's GUI application works. Especially the graphical content of the application window after doing an operation must be compared against the expected content. And that is something which would be also useful for CI testing at OpenPrinting, comparing the output of print filters against the expected page content. To compare graphical content they use the free software computer vision library OpenCV and also the universal file comparison tool diffoscope is used to check output. Especially OpenCV seems to be also useful to check on an output file (if it is PDF or PostScript we would raster it first) whether it is the \"correct printout\", not doing a pixel-by-pixel comarison, but checking whether the expected text content is there, and whether nothing got cut off at the borders, ... We could offer that as a GSoC project idea in 2025 ... Flatpak & Portals BoF Notes Georges Basile Stavracas Neto has hosted this session about all kinds of Flatpak related issues. The discussion started with how to flatpak system services (daemons), led by Christian Hergert who works on this already for some time. Also Adrian Vovk with whom I already had a short conversation about this subject matter Thursday night, was participating. If all this works out, we at OpenPrinting will also start to flatpak CUPS and the Printer Applications, making it easy for users of most immutable Linux distributions to install printer drivers and also the newest CUPS. That would be another GSoC project idea. Note that this is still in a very experimental stage and it is not yet clear whether Flatpaks of non-GUi system applications and daemons will ever appear. Back on the Canonical Engineering Sprint 2023 in Prague Heather Ellsworth and Aaron Prisk talked about going to a tattoo studio together for each of them getting a little Tux tattooed, on the next Sprint, in November 2023 in Riga, but before that Sprint happened, Heather had left Canonical. Now, on the GUADEC, Heather and Aaron met again, and turned their old plan into reality, but not only them, also Thomas Crider (\"Glorious Eggroll\" or just \"Eggy\"), a good friend of Heather, living in Denver, joined the action, and now all the three are wearing a nice Tux tattoo ... It is only little more than two weeks from now and we have the second Opportunity Open Source in the Indian Institute of Technology (IIT) Kanpur, on August 24-26! As we have opened the CfP for the event hardly any proposal appeared and we were already fearing not getting the one plenary room filled with talks on the two days. So I asked the on-location organizers to ask around, and especially Sanskar Yaduca started to e-mail lots of people (I got CCed) mainly in India as they do not need expensive overseas travel to come. Many declined but in the end we got so many proposals that we had to ask for a third room and now we have two rooms for talks and panels and one for workshops and the time slots are nearly completely booked out! Thanks a lot Sanskar! We have published the schedules now and the conference is stuffed with great content of lots of different areas, a total of 50 sessions: OpenPrinting, including talks (CUPS, PAPPL) by Michael Sweet, author of CUPS Zephyr, several talks and a workshop, by Jonas Remmert, Oliver Völckers, and others I give a talk about Snap and Ubuntu Core (Desktop) and my workshop where you learn snapping applications Hands-on with firmware programming: A ChromeOS firmware team from Google gives 2 talks (Intro, Advanced) and a workshop Rudra Saraswat introduces into his BlendOS system, immutable, arch-based, sandboxes/containerizes classic app packages on-the-spot. Rudra Saraswat will also give 2 workshops, one to make your own Ubuntu flavor with his Iona framework and the other about creating Arch-based immutable distros Jiongchi Yu, GSoC contributor on deploying OSS-Fuzz testing on OpenPrinting and his mentor George-Andrei Iosif show that they are not only an excellent team at OpenPrinting but also in presenting security-related talks, this time 3. More current and former GSoC contributors will speak: Akarshan Kapoor, Rudra Pratap Singh, Shivam Jaiswal, Deepak Patankar, Sahil Arora, ... Large Population Models, AI for simulations of millions of interacting agents (there is not only generative AI) Pierre Clisson will talk about building brain-computer interfaces 20 years of the Google Summer of Code - I am hosting a panel about what it is, how to participate, experiences of mentors and contributors, questions & answers Want to know how it is to work at Canonical? I am hosting a panel with some colleagues from Canonical and we tell our experience. a lot more ... So if you come to Kanpur you will for sure find a lot of interesting sessions, plus a great hallway track. We have especially also 9 workshops during the 3 days, if you want to try out the things by yourself, often even on your laptop. And on Monday we will run a Hackathon, the subject is still to be determined by the organization team in India. We will also live-stream the Plenary Room and the Breakout Room, and record the sessions in the Workshop Room. So if you cannot make it to Kanpur, please follow the menu entry \"Attending Remotely\" on our event page for instructions and links to watch the live streams on YouTube and to ask questions via the live comments there. Note that the links are not yet there. I will post them some days before the conference. Special thanks to Shivam Mishra for suggesting the IIT Kanpur and to Pratham Sahu, Sanskar Yaduca, and Mohammad Rabhar for leading the on-location organization, to the 50 volunteers on-location, and to Aveek Basu. Also thanks to Canonical and there especially the Community Team (Mauro Gaspari, Aaron Prisk) for all the support, providing me Indico, StreamYard, lots of swag, and giving me support and answering my questions concerning conference organization. Also my participation in the organization of the Ubuntu Summits has given me a lot of experience. Please follow us on Mastodon: #OpportunityOpenSource From Kanpur I will continue my trip to Jaipur (with stop-over in Agra, to see the Taj Mahal) for the UbuCon Asia 2024, on Aug 31 - Sep 2 (Sat - Mon), and give a talk and a workshop about Snap. If you attend, please make sure to not miss my two snappy sessions: Desktop Linux, as easy as a smartphone! Just in a Snap! Sat, August 31, 11:35 AM IST, Main Hall The motivation, advantages, and concept of the sandboxed, immutable Snap packaging format is shown and how it is used to make up immutable all-Snap OS distros, the IoT distro Snap was originally designed for, Ubuntu Core, and the easily usable and maintainable Ubuntu Core Desktop. Your app everywhere - Just in a Snap! - Interactive Workshop Sun, September 1, 1:55 PM IST, Room 2 Interactive workshop to learn how to package applications in the sandboxed, immutable package format Snap to publish them in the Snap Store. Attendees will create simple Snaps in several hands-on exercises. With the workshop I got featured speaker on the front page. Full schedules I will also meet Soumyadeep Ghosh from the Snapcrafters and present Snap with him at his booth and also work with him on the plans for the Snapcrafters booth and workshops on the Ubuntu Summit. 10 of our 11 contributors have passed their mid-term evaluations! And the 11th, Arun Patwa (Braille Printer Application) did not fail. He just started coding 6 weeks late, due to his graduation, and therefore did not reach mid-term yet. And we got write-ups of nearly all of them: Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh I have thoroughly tested cups-rock. Added instructions in the cups-rock GitHub repository for testing the OCI image. Implemented GitHub Actions from ubuntu/desktop-snaps to support version automation in cups-rock. Started containerizing ps-printer-app. Added GitHub Actions to test cups-rock on every push. CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha This month I worked on conforming my code to the reviews left by my mentor Michael Weghorn, of LibreOffice. Apart from minor fixes such as dropping DBus headers, changing low level handling of the options hashtable and writing some documentation for the newer API functions of CPDB frontend, it also included bigger tasks such as changing the way the print dialog was interacting with CPDB. Initially my approach was to write custom DBus calls to subscribe to signals and use the API callback function so that changes were made to both the CPDB and LO printer lists simultaneously. However in the end we agreed upon using the API calls for the signals so that changes were first made to the CPDB printer lists and using a custom callback to make changes to the LO printer list later. This would prevent low-level DBus calls in LO ensuring any future changes in the way signals are processed by CPDB does not require any code change for maintenance in LO. Apart from that I also added the support for translations in LO so that the options and their corresponding choices are displayed in a human-readable format. While working on this I discovered that options such as media and media-types did not produce expected logical translations. On raising a bug for it in CUPS, I got to know that CUPS provides only a limited number of localized names for common media sizes and types and as such translations for them may not always be logically correct. Quoting Michael R Sweet's response on the bug, \"We provide a limited number of localized names for common media sizes since some sizes have multiple names not tied to a particular language or region (like “ledger” which is also “tabloid” and “b”) and others are so esoteric as to be meaningless (most photo sizes). Thus, the localized size name will be a dimensional name in many cases using the language/region’s appropriate units and separators.\" So although most translations work, not all will be correct. You can find my WIP PR here. PAPPL API Bridging for Scanner Applications Contributor: Akarshan Kapoor This month, my major goal was to successfully complete a significant portion of the API handling and finalize the integration schemes for the PAPPL Scan API. Additionally, I discussed with Till Kamppeter and Alexander Pevzner the essential elements that should be included in the scan API documentation. I aim to have the main documentation ready by the first week of August to ensure the project is comprehensible to the larger Linux community. Our next focus will be to complete the API integration by the third week of August and then begin the eSCL server-side integration, which was covered in the last GSoC. As usual, updates to the Work in Progress PR can be found at: https://github.com/michaelrsweet/pappl/pull/349. The documentation for the initial PAPPL project (not updated for scanners) can be found at: https://www.msweet.org/pappl/pappl.html. Akarshan's ongoing work you find in this work-in-progress pull request on PAPPL and in his GIT clone of PAPPL 1.4.x. CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma Successfully Built Mozilla Firefox. Adding a demo print backend with dummy function calls, these calls will later be replaced by CPDB APIs. Also working on adding package config file for CPDB that will check if CPDB is present or not , if present then it will use CPDB for performing print jobs. Kushagra created a good collaboration with the Mozilla developers now, via my original feature request. Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal Firstly, as I mentioned before, I looked into the GNOME Control Center telegram group for UI ideas related to the system-config-printer. Additionally, after discussing with Mohit Bhaiya, we decided to change the IPP discovery code to make it discover services asynchronously (currently, it does this synchronously). So, I have been working on these code changes. I was quite busy with internship stuffs. Now, my goal is to finalize the IPP discovery code and the UI as discussed. Make a native printer Application from Gutenprint Contributor: Ankit Pal Singh Successfully created driver callback for the native guten printer applications. Tested the functionality like listing of supported drivers, options specific to printer Currently working on start_job, end_job, print_job functions using libgutenprint. User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma I have written a code for token exchange which will help clients to authenticate their identity. For this I am using GOA and GOA API has several inbuilt functions which I am using to add various features. I completed the setup of the GOA DBus connection. I am using Google as the account type because GOA supports Google accounts only. Currently I am working on designing the UI for this OAuth process. After successfully completing the token exchange code I will merge it to CPDB and then I will modify the UI and the functionality of the token exchange code. I can also add the authentication server which the printer will provide to the client for verification. Converting Braille embosser support into a Printer Application Contributor: Arun Patwa I have implemented a foundational structure for a Braille printer application using the PAPPL framework. This includes defining the printer drivers, setting up callbacks for device auto-adding, MIME type handling, and driver configuration. I have also implemented a test page printing callback and a print filter function specifically designed to handle the conversion of input files to Braille-ready formats. Additionally, I have created data structures and global configurations necessary for managing printer settings and job processing within the application. In this month I will add the functionality of text to brf conversion. Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak I have ported the code from C++ to C for the files 'nup.cxx' and 'intervalset.cxx', which I have updated into my GitHub repo. I have also ported 'pdftopdf-processor.cxx' and 'qpdf-pdftopdf-processor.cxx' into C. I am currently testing all the outputs of the functions. Here is Uddhav's work on GitHub. Adding Common Print Dialog Backends (CPDB) support to the Qt print dialog (GSoC 2022) Contributor: Gaurav Guleria Gaurav is now finishing the merge requests, actively working out the remaining rough edges with the Qt developers (#556476, #437301, #471258, #116726). I had an in-person meeting with Axel Spoerl (Qt developer, works at Qt in Oslo, Norway, and does the, otherwise abandoned, print dialog as pet project) in Vienna to discuss the merge of the CPDB support merge request in upstream Qt. His summary (reported to Volker Hilsheimer from Qt): We have changed the commit message slightly and verified, that the merge conflict disappears. What remains to be done: bump the provisioning verison to CPDBlibs 2.0b6 move the code references from gerrit comments to source code comments What remains to be decided, Volker's input needed: There is a compiletime CPDB switch, which will always remain. We will default it to ON from Qt 6.9 onward, meaining that we build with CPDB support by default. That will enable users to build Qt with CUPS only, CPDB only, both or none. In addition to that, we need a runtime switch to cover the following case: host system doesn't have CPDB support => fall back to CUPS use CUPS as default in 6.9, opt in for CPDB use CPDB as default from 6.10 onward, opt in for CUPS This still needs to be developed. Decisions to be made: implement runtime switch on QGuiApplication level? (we proporse: yes) confirm the versions: 6.9 still defaults to CUPS, implement CPDB default from 6.10 onward. @Volker: Are you fine with that? Should we ask the mailing list as well? It currently also seems to build only locally and not on Qt’s servers. Volker likes the roadmap but wants to have it completely implemented before making CPDB the default (instead of direct CUPS), ideally in the next LTS+1 release of Qt. Important remark: CPDB will be required for using Qt with CUPS 3.x. I agreed with Axel, to not update the direct CUPS support of Qt to CUPS 3.x. From CUPS 3.x CPDB will have to be used. While I was putting a lot of work into the Opportunity Open Source, GUADEC and into mentoring the GSoC contributors, the development of our code base has continued. Special thanks go to Biswadeep Purkayastha (CPDB support for LibreOffice) and his mentor Michael Weghorn (LibreOffice upstream developer) as they did many changes and improvements, mainly on the CPDB libraries (cpdb-libs) and also on the CUPS backend for cpdb-libs (cpdb-backend-cups). Also Gaurav Guleria (CPDB support for GTK and Qt peint dialogs, CPDB 2.x development) did a change. Many changes are bug fixes but there are also several library-internal functions promoted to the public API of cpdb-libs. Since the 2.0b6 releases they did 18 Pull Requests on cpdb-libs and 4 on cpdb-backend-cups: cpdb-libs PR #35: API functions to refresh printer list and to get D-Bus connection, by Biswadeep Purkayastha PR #36: Turn some static functions into frontend API functions, by Biswadeep Purkayastha PR #37: Turn cpdbFillBasicOptions() into a frontend API function, by Biswadeep Purkayastha PR #38: text-frontend: Quit on EOF (Ctrl+D), by Michael Weghorn PR #39: text-frontend: Don't crash when printer doesn't exist, by Michael Weghorn PR #40: Pass backend name to cpdbRefreshPrinterList() as const char*, by Michael Weghorn PR #41: Removed unused parameter instance_name, by Biswadeep Purkayastha PR #42: Replace cpdbGetStringCopy() with g_strdup(), by Michael Weghorn PR #43: Documentation for newly added API functions, by Biswadeep Purkayastha PR #44: Correct DBus calls to add, delete and state change of printers, by Biswadeep Purkayastha PR #45: Fix bad free, by Biswadeep Purkayastha PR #46: frontend: Drop unused own_id member, by Michael Weghorn PR #47: Fix a memory leak in cpdbGetSysConfDir(), by Michael Weghorn PR #48: cpdbConcatPath(): Actually check XDG_CONFIG_DIRS, by Michael Weghorn PR #49: Add capability to check CPDB version at runtime, by Gaurav Guleria PR #50: text-frontend: Add null check for get-default-printer, by Michael Weghorn PR #51: text-frontend: Get locale via GLib, by Michael Weghorn PR #52: text-frontend: Drop unused local vars, by Michael Weghorn cpdb-backend-cups PR #32: Use g_strdup instead of cpdbGetStringCopy(), by Michael Weghorn PR #33: Always query current CUPS default printer, by Michael Weghorn PR #34: Add support for CUPS printer instances, by Michael Weghorn PR #35: Use NULL Instead of \"NA\" if there's no default printer, by Michael Weghorn Zdenek Dohnal, printing maintainer at Red Hat, did several fixes on libppd and cups-browsed: libppd PR #30: ppd-cache.c: Use PPD size name from CUPS if size is standardized PR #46: ppd-cache.c: Use 0.5mm for delta when comparing sizes cups-browsed PR #32: cups-browsed.c: Ignore attributes with empty values PR #33: cups-browsed.c: Ignore IPP attributes with \"no-value\""
+ },
+ {
+ "id": "post:OpenPrinting-News-June-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - June 2020",
+ "url": "/OpenPrinting-News-June-2020",
+ "headings": [
+ "Google Summer of Code 2020",
+ "Google Season of Docs 2020",
+ "CUPS Snap (Printing Stack Snap)",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "Renaming of CUPS Snap, cups-filters 1.27.5, GSoC 2020 coding period has started",
+ "content": "On June 1st the coding period of this year's Google Summer of Code has started! All the 7 students (announced here last month) have prepared themselves and even partially started with the coding (and first code pieces being comitted to the project's repositories) and now they will all work on their projects. Some of the students are currently getting printers from us to test their work. Now in the end of each of the three months there will be evaluations which the students have to pass to get the money for the month done and stay in the program to continue their project. The coding will end in the end of August and the students will post their work products. We got already some e-mails from potential candidates and they are in contact with the mentors of the appropriate sub-organizations of the Linux Foundation. The application period starts on Tuesday, June 9 and will terminate on Thursday, July 9 and here are the project ideas for OpenPrinting. The Snap will soon get renamed, from Printing Stack Snap to simply \"cups\" and the GitHub repository will then also be renamed, to \"cups-snap\" (Link will work after the renaming). The CUPS Snap on OpenPrinting will be the official Snap, as we cannot expect that CUPS' upstream, Apple, will make a Snap of CUPS and also CUPS on any non-Apple system is used with cups-filters, which is an OpenPrinting project and it is based on the parts of CUPS which Apple has spun out due to the fact that they are not needed by Mac OS X and so Apple did not want to maintain them. Therefore it should be no problem to name our CUPS Snap simply \"cups\". The GitHub repository will be named \"cups-snap\" so that the visitor of our GitHub will not think that this is a fork of CUPS but rather the set of files needed to build the CUPS Snap. I have also continued work on the Snap: Updated upstream packages: cups-filters 1.27.5 When checking for an already running CUPS using lpstat, check also for lpstat errors Put groups listed as \"SystemGroups\" in cups-files.conf in correct order, so that \"root\" is not the first group Removed patches to lift CUPS' internal security features of not allowing to run filters/backends as root, the filters/backends user group being an admin group, and to run the helper program cups-deviced as root CUPS is run as root without CAP_DAC_OVERRIDE capability, so CUPS has to obey ownerships and permissions of files/directories, corrected directory/file permissions appropriately Set fontconfig environment variables to files/dirs inside the Snap Clean up temporary directories by the run-cupsd script, using a special algorithm to work without CAP_DAC_OVERRIDE capability Let CUPS create the root certificate with group ownership root and without ACLs Installed fonts-arphic-uming package to print CJK plain text files Added the Berkeley-style printing utilities lpr, lpq, lprm, and lpc Cleaned up the Snap from unneeded files: C headers, documentation, DejaVu fonts, System V startup scripts, static libraries, ... Currently I am testing the Snap and fixing bugs. Also a migration script to switch over from classically installed CUPS to the CUPS Snap is still needed. Currently released is 2.3.3. No further releases or GIT commits. Currently released is 1.27.5. 1.27.5: Several fixes/improvements on cups-browsed, to correctly determine the CUPS server to attach to, to correctly create queues pointing to a second local CUPS instance, and to not remove the locally created queues on shutdown. Also included several bug fixes from contributors We have a new contributor for ippusbxd who wants to solve its problems in C: Fletcher Woodruff is working on Issue #15, of ippusbxd returning invalid data to TCP clients when communications got interrupted. The problem was solved by ipp-usb making use of Go's HTTP library. Fletcher is now trying to find a suitable library in C. Fletcher has also already made a small contribution, raising the internal buffer size to speed up data transfer between the printer and the host."
+ },
+ {
+ "id": "post:OpenPrinting-News-June-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - June 2021",
+ "url": "/OpenPrinting-News-June-2021",
+ "headings": [
+ "Want more news?",
+ "Google Summer of Code 2021",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "Retro-fitting of CUPS printer drivers into Printer Applications",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "GSoC, PostScript Printer Application and PIN-based printing, Retro-fitting CUPS printer drivers, cups-filters 1.28.9",
+ "content": "Are you always eagerly waiting until I issue my next news post here after a month? Due to the fact that I am working at Canonical (the company behind Ubuntu) I also post weekly updates about my work (which is mainly OpenPrinting but also printing integration in Ubuntu) in the Discourse forum of Ubuntu. The coding period has started a week ago and now, after some of the students having finished their exams, they are all working on their projects. They have now 9 weeks until mid-August for their coding work. CUPS Snap in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, more than 1800 installations via Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but unfortunately, they are very busy currently. Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces Testing Turn classic CUPS drivers into Printer Applications Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap. PostScript Printer Application in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, more than 1000 installations via Snap Store Features and fixes in the past month (follow the links to the commits for more detailed descriptions and motivations): Support for CUPS filters used in PostScript PPD files. The manufacturers of PostScript printers got aware of the shortcomings of the PPD file concept and work around them using CUPS filters for more complex conversion of option settings into PostScript or PJL code. The PostScript Printer Application supports such filters now and if the appropriate filter is actually installed, all PPD options for the printer get available. This is the first application of the new filterExternalCUPS() filter function in cups-filters. Support for printing private jobs (with PIN protection) on HP printers in the Snap of the PostScript Printer Application. Here we make use of the CUPS filter support for the first time, adding the hpps filter of the HPLIP package. The options to control PIN-protected printing are under the \"Printing Defaults\" in the web interface. Support for the CUPS extension of PPDs for custom option settings, as strings, password, numeric values, fax/phone numbers, ... This is especially needed by the PostScript printer PPD files from Ricoh and OEMs as here the PINs are entered as string-type options. Note that this change is not yet in the GIT repository of the PostScript Printer Application, as it still needs PAPPL's string option support to get fixed. Patches with the changes on both PAPPL and the PostScript Printer Application for implementing this feature are included in the issue report. Note that these changes only apply to a few PostScript Printers and only to enable features which are not used very often, but they are especially done with general retro-fitting of CUPS printer drivers in mind, where CUPS filters defined in the PPD file and string/text/numeric/fax number options are commonplace. With appropriate features added to PAPPL we will be able to also add the following: Support for string/text-style vendor options. Needs support in PAPPL. Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. Currently I am working towards retro-fitting classic CUPS printer drivers into Printer Applications. Here I have especially done the following: Automatic selection of extended Color spaces Completed first version of implementing automatic selection of the extended print quality features 16-bit-per-color (high color depth/dynamic range) and AdobeRGB (wide color gammut) via print-quality=high setting and document color space on driverless IPP printers. Created library functions in libcupsfilters for it and applied them to the ghostscript() filter function. Modified the PPD file generator for CUPS queues appropriately. Discussion in this thread on the OpenPrinting mailing list and this thread on the Ghostscript developer mailing list. Details of my commit in the threads on OpenPrinting and Ghostscript mailing lists). We came to the conclusion that the PDF print job output of user applications lacks information about the actually used color space/profile (sRGB, AdobeRGB, custom). I was unable to correctly print a JPEG photo shot with the camera set to AdobeRGB on an AdobeRGB-supporting printer with CUPS from photo management/editor applications. Please subscribe to the OpenPrinting mailing list and/or to the Ghostscript mailing list to participate in the discussions. Made foomatic-rip streaming PostScript, feed Raster to it as PostScript I investigated how raster data can get streamed into foomatic-rip for the Foomatic/Ghostscript Printer Application and also for using foomatic-rip with Ricoh's PostScript PPD files in the PostScript Printer Application to enable secure (PIN-protected) printing. Started a thread about this on the Ghostscript mailing list. Please subscribe to the Ghostscript mailing list to participate in the discussions. As PostScript is a streamable format but PDF is generally not, I decided to make Raster input data to be converted into a PostScript stream, especially with this already being implemented in the PostScript Printer Application. So the Ghostscript used by the legacy driver gets the Raster input streamed in as PostScript and prints each page as it completes, allowing streaming and infinite jobs as required by the driverless IPP printing standards. If the input was PDF Ghostscript reads until the end of the job/document before starting to print the first page. For this I also did a fix on the zero-page job handling in foomatic-rip to make it able to stream PostScript input again. filterExternalCUPS() filter function to call classic CUPS filters The ideal way to convert a classic CUPS driver into a Printer Application is to take the copde of the driver and re-arrange it into a native Printer Applications, to get rid of calling external executables and using PPD files altogether. Problem is that this requires access to the source code, understanding of the source code andf reliable ways for testing, ideally having all supported printer models at hand. Unfortunately, many of the drivers we want to convert are old, unmaintained code, authors do not have these printers any more, not remembering any more for waht exactly all these parts of their code were good for, and there are even proprietary drivers for which we do not even have the source code. And do not think that OpenPrinting has every printer which ever came to the market, so that we can test. Therefore our strategy of converting such printer drivers is wrapping their unchanged code into Printer Applications, what we call retro-fitting printer drivers. To call the original CUPS printers without turning them into filter functions I have created the new filterExternalCUPS() filter function in libcupsfilters which calls a CUPS filter, specified in the filter-function-specific parameters. The filter function also allows to supply options and environment variables only applied to this filter, not to the whole filter chain. The new filter function is already in use in the PostScript Printer Application to support PostScript PPD files which specify CUPS filters, as the ones from HP which use a filter for secure, PIN-based printing. Filter and custom option support in PostScript Printer Application As already described above we got more techniques important for retro-fitting classic CUPS drivers into the PostScript Printer Application, which will be the base for a driver retro-fitting library. This is especially the support for CUPS filters and the support for custom (string/text/numeric/...) option settings. Currently released is 2.3.3op2. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 17 months. Ubuntu Hirsute Hippo (21.04) comes with CUPS 2.3.3op2, the CUPS Snap and the PostScript Printer Application Snap use the current GIT master. Currently released is 1.28.8. Feature additions are principally done forretro-fitting classic CUPS drivers, see details in the separate section: Automatic selection of extended Color spaces Made foomatic-rip streaming PostScript, feed Raster to it as PostScript Added filterExternalCUPS() filter function to call classic CUPS filters Also some bug fixes were done, especially letting the driverless utility not error-exit if no supported printer got discovered. Update: 1.28.9 Bug fix release, fixes backported from the master (2.x) branch (see below) Ubuntu Hirsute Hippo (21.04) comes with cups-filters 1.28.8, also the CUPS Snap currently uses this version. The PostScript Printer Application Snap uses the current GIT master of cups-filters. Currently released is 1.0.3. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-June-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - June 2022",
+ "url": "/OpenPrinting-News-June-2022",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "GUADEC 2022",
+ "Google Summer of Code 2022",
+ "GNOME Control Center - The new \"Printers\" module",
+ "Scan support for PAPPL",
+ "Common Print Dialog Backends (CPDB)",
+ "CUPS Snap and snapd printing interface",
+ "Approaching cups-filters 2.0",
+ "New feature in PAPPL 1.2.x and implementation in pappl-retrofit",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "ipp-usb: Solution for non-driverless IPP-over-USB-reporting printers",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/CBPefa0Ckq8/hqdefault.jpg",
+ "snippet": "OP Summit Summary, GUADEC, GSoC 2022 projects started, first apps use \"cups\" Snap interface, PPD-independent cups-filters 2.x, PAPPL 1.2.1, CUPS 2.4.2",
+ "content": "On May 17-19 we had our annual meeting together with the PWG (Printer Working Group) again, the OpenPrinting Summit/PWG Meeting. We presented and discussed our work of the last 12 months and what we plan to do next. Especially CUPS 3.x, use of OAuth with CUPS, cups-filters 2.x, and the GSoC 2022 projects for the New Architecture were the main subjects of the meeting. A summary got posted by Jeremy Leber from Lexmark and minutes of the OpenPrinting sessions posted by Ira McDonald. Thanks a lot for this. The conference also initiated some interesting discussion with Alexander Pevzner (author of ipp-usb) and Smith Kennedy (firmware developer at HP) about too many quirks in printer’s IPP-over-USB implementations (see below). As already mentioned here last month I will be on the GUADEC (GNOME developer conference) this year which will take place on July 20-25 in Guadalajara in Mexico. I will not only give my talk about the New Architecture of printing and scanning for GNOME developers (July 21, 14:20 - 15:00 local time, Bosch Auditorium), but also come with my colleagues from Canonical, similar as on the LAS 2022 (video). As of now the Canonical Gang will be me, Heather Ellsworth, Britt Yazel, Marco Trevisan, and Nathan Pratta Teodosio. Heather will give a lightning talk about the Linux Application Summit 2023 showing how to submit a proposal if one wants to host the event. I hope this will help to have another great LAS as we had this year. It will take place most probably on July 22, somewhere between 14:25 and 15:05 local time in the Bosch Auditorium. We will also have a Canonical booth. But do not think about at the GUADEC booths being these sales/marketing people in neatly tucked-in company polo shirts, no, on GUADEC booths you will encounter developers there, of the different companies and projects participating. The booths are just tables to sit around them and chat. This makes it much easier to find people for fruitful hallway sessions. Google has officially announced the contributor projects for 2022. We got 18 contributor slots for the Linux Foundation, all 8 projects for OpenPrinting are accepted! Converting Braille embosser support into a printer application Contributor: Chandresh Soni Mentors: Till Kamppeter, Samuel Thibault Scanning Support in PAPPL Contributor: Deepak Khatri Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar Adding Common Print Dialog Backends (CPDB) support to existing Print Dialogs Contributor: Gaurav Guleria Mentors: Till Kamppeter GNOME Control Center GUI for discovering non-driverless printers and finding suitable Printer Applications for them Contributor: Mohit Verma Mentors: Till Kamppeter, Michael Sweet, Pranshu Kharkwal, Divyasheel, Deepak Patankar Scanning Support in PAPPL with eSCL Support Contributor: Rishabh Maheshwari Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar Add Avahi calls for discovering and resolving driverless IPP printers and Optimize the processes Contributor: Sachin Thakan Mentors: Till Kamppeter, Michael Sweet, Deepak Patankar Make a native Printer Application from Gutenprint Contributor: Sahil Kumar Dhiman Mentors: Till Kamppeter, Michael Sweet, Solomon Peachy, Robert Krawitz Create new printer setup tool for the GNOME Control Center Contributor: Shivan Mishra Mentors: Till Kamppeter, Pranshu Kharkwal, Divyasheel, Deepak Patankar With all the contributors I had already introductory meetings/chats, partially also by video calls. I have also created groups on Telegram, Signal, and Discord (according to participant's preferences) of the contributors and mentors for their daily chat about their work, questions, planning, design, ... I am also trying to include upstream developers into the team's whenever possible. The 2 contributors on the \"Printers\" module in the GNOME Control Center and the 2 on scanning support for PAPPL are even together in contrinutor/mentor teams. During the introductory communication we already have planned the work, explained to the contributors how things are working, and especially made the principal design decisions for each project. The official coding period starts today and it seems also that the end-semester exams at the Indian colleges have ended, so the contributors will be active coding from now on. I had intense e-mail discussion with the upstream maintainer of the G-C-C \"Printers\" module, Marek Kasik from Red Hat, and also with Michael Sweet. I got a first answer from Marek Kasik about the original idea of replacing the module by one for the New Architecture. He suggests a different solution, instead of replacing the module adding the functionality needed for the New Architecture to the current module making it supporting both old and new. CUPS 2.x already supports most features of the New Architecture (printers as IPP service, Printer Applications) and with CUPS 3.x old-style items (like PPD/driver-based queues) simply will not show. I agreed with that. I asked Michael Sweet several questions about how to handle managing printers via pure IPP and he helped a lot. Then finally Marek posted 3 feature requests describing the needed work on the upstream GitLab: #1877: Improve setting of IPP options #1878: Allow to add new printers via Printer Applications #1879: Do not show setting of drivers for IPP printers I presented them to the 2 GSoC contributors and they agreed. Thanks a lot to Marek and Michael for their kind help and great communication! With this the GNOME Control Center module and CUPS can get independently updated (as long as the module comes first) and also new elements, like for example Printer Applications or IPP-over-USB printers, can enter at any time and get fully supported. This means, that the main view (to be worked on by Shivan Mishra) of the \"Printers\" module will show both classic, permanent CUPS queues, created locally with PPD file/driver and backend, and IPP services, for which CUPS would auto-create a temporary queue. On classic queues we will get the same operations as we already have: Set option defaults, change driver, ... On IPP services we get operations like entering the web admin interface of the service-providing device, IPP System Service configuration, local option settings, ... Also if an IPP service has more than one print destination (like for example a Printer Application), we will list these destinations together. The \"Add Printer\" part (to be worked on by Mohit Verma) will also support both the current way and the New Architecture. As long as the underlying CUPS supports it, both classic queues with drivers or Printer Applications can get installed for a discovered printer. As long as classic drivers are still available (CUPS 2.x, not the CUPS Snap) it will be possible to choose. Internet search for OS-distribution-independent packages of Printer Applications will get included as originally planned. Initial tests of installing Printer Application Snaps on the OpenPrinting web server were already performed. Thanks Violet Kurtz from OSUOSL! There will be no \"Printers & Scanners\" module, due to the very different nature of print, scan, and fax operations for the user we will continue with a \"Printers\" module. Faxes would be shown on a seperate panel, but the code of the \"Printers\" module could be shared here. Two GSoC contributors (Rishabh Maheshwari and Deepak Khatri) will continue where Bhavna Kosta has left off in GSoC 2021: They will add scanning support to PAPPL. This will allow complete suppport for multi-function devices (they get really common nowadays, practically the standard form for paper-processing peripherals) and also with Scanner Applications generally a way to provide scanner drivers in OS-distribution-independent packages. Originally, Rishabh's main part was to make PAPPL accepting and processing eSCL scan jobs and Deepak's main part to do the same for IPP Scan jobs, but it turned out that IPP Scan got a still birth. It is a nicely worked out standard, also IPP as our printing standard, but no one in the hardware industry adopted it, eSCL won as driverless scanning de-facto industry standard, its specs got also published by Mopria, it works also under IPP-over-USB (not being IPP though), so we go eSCL-only in PAPPL. This means that we are currently re-organizing and re-defining the projects of our two contributors, to get a great eSCL-based driverless scanning support in PAPPL. I have started a kick-off mail thread with the two contributors, their assigned mentors, Michael Sweet (PAPPL), Alexander Pevzner (sane-airscan), Bhavna Kosta (GSoC 2021 student who started this work) and got a lot of help from Mike and Alex, thanks a lot to them. Our GSoC contributor for adding CPDB support to the current print dialogs, Gaurav Guleria, has already started very early, already before submitting his proposal, especially he has already done some fixes the CPDB libraries. He especially worked on support for human-readable strings for options and choices in the CPDB libraries (commit) and removed CUPS-specific functions from the frontend library (commit). He also has already started on the CPDB support for thr GTK print dialog. In a recent chat I worked out with him how to handle if the PPD of the CUPS queue contains variants of the same page size, like A4, A4.Borderless, and A4.Transverse. we decided on sending each actual page size (here A4, 297x210 mm) only once to the frontend (in the \"Page Size\" option) and send additional enumerated choice or boolean options to select borderless or transverse (long-edge-first) printing. CUPS Snap in the Snap Store The cups snapd interface now having been officially launched and documented gets started to be actually used. The first application using this interface got uploaded to the Snap Store on May 17, onlyoffice-desktopeditors and after that, on June 13 FreeCAD. Congratulations to the developers of these applications and thanks to Daniel Manrique from the Snap Store Team at Canonical for this valuable information. But the code now getting actually exercised, we also found first bugs: On a first test with the Chromium Snap by my colleague Nathan Pratta Teodosio from Canonical some bugs got found which are all already fixed as of now. While starting to make use of the new cups printing interface in the web browsers, replacing cups-control by cups there, as recommended now, it turned out that the CUPS Snap in proxy mode did not clone the print queues, at least if there are no network IPP printers around (observed by Nathan Pratta Teodosio and also Olivier Tilloy, both from Canonical's Ubuntu Desktop Team, thanks a lot for reporting and especially Nathan's patience in investigating it). This was caused by bugs in the CUPS Snap itself, cups-proxyd not doing an update right after starting (fixed) and the CUPS Snap needs to plug cups-control to use D-Bus services of host system's CUPS (fixed)), and a bug in snapd, an erroneous restriction peer=(name=org.freedesktop.DBus,label=...) for CUPS D-Bus access (Pull request #11843 on snapd). The fix on snapd got already merged and should be in snapd 2.56 (Snap Store) and the fixes on the CUPS Snap are included in version 2.4.2-2 also already in the Snap Store, so everything should work now. Only missing piece is approval from the Snap Store team to auto-connect the cups-control interface. The request is posted here. For now, should you not connect cups-control manually (sudo snap connect cups:cups-control) and/or not have snapd 2.56 or newer, at least when starting the CUPS Snap the cloned queues are updated, as well as on appearing or disapperaing of a network printer. So if a new print queue does not get cloned (not appear in print dialogs of snapped applications), either power-cycle an arbitrary printer in your local network or restart the CUPS Snap (sudo snap stop cups; sudo snap start cups). Thanks, James Henstridge (Canonical Desktop Team) for the pull request on snapd, and Michael Vogt (snapd Team Manager at Caninical), Alberto Mardegan, and Alex Murray for quickly approving this pull request. To assure that the CUPS Snap works correctly with the current cups-filters 2.x, we are now building the included Ghostscript 9.56.1 with all output devices needed for the 4 page description languages needed for driverless IPP printing (PDF, PWG Raster, AppleRaster, PCLm) (commit, issue fixed). The CUPS Snap is also updated to CUPS 2.4.2 now. Continuing the restructuring to have libppd depend on libcupsfilters instead of libcupsfilters depend on libppd, as introduced last month. Continuing to restructure the code to separate the siamesian twins of the filter functions and PPD file support. After having made the cfFilterPDFToPDF() filter function free of PPD file support I have done the same now also for the cfFilterPDFToRaster() filter function, the Poppler-based PDF rasterizer. The ppdFilterPDFToRaster() wrapper filter function now adds PPD file support to that. To reach this I have especially removed the PPD support from the color management support functions (cfCm...() and cfColord...()), moved the reading from PPD keywords for CUPS/Apple/PWG Raster/PCLm attributes, backside orientation, even number of pages for duplex, and rendering intent into the PPD loader/parser functions for the wrapper filter functions in libppd, added fields to the filter data structure for input and output formats and also for a sample Raster header which can be derived from the PPD (from pseudo-PostScript code in Raster driver PPDs). Also some crash bugs in code which did not get exercised enough in our PPDish world got fixed. Most of the PPD attribute readouts are transferred to libppd now. Especially also some code duplication in filter functions got eliminated. Now it is mainly to go through the remaining filter functions and apply the new PPD handling functionality also to them. Michael Sweet released version 1.2.0 (and bug fix follow-up 1.2.1) with support for SNMP-based supply level readout, localization, and human-readable strings for vendor options. Features which were still missing for the development of pappl-retrofit. Supply level readout The supply-level readout I made already use of in a first implementation in pappl-retrofit (plus crash fix, extra crash guards, no premature backend shutdown, following the implementation in hp-printer-app after talking about how to do the supply-level readout with Michael Sweet on the OpenPrinting mailing list. For now it only works for network-connected printers and when using PAPPL's own print backends. Later on we will also add support for supply-level readout for embedded CUPS filters. I also started work on finding out how to read out supply levels with embedded CUPS backend calls and found out that also CUPS backends need access to the PPD file. So I made sure the PPD is also available when a printer uses a CUPS backend (commit). I found the way how to complete it but had no time to implement it due to the more urgent work on the cups-filters 2.x release. Localization and human-readable strings I had also some chat with Michael Sweet on the OpenPrinting mailing list, about localization and human-readable strings for the vendor options and how to implement it in pappl-retrofit, as here the set of strings is variable on run-time due to the PPD files. They are once too many for pre-building the strings file and second, in the PostScript Printer Application the user can add their own PPD files. The 4 retro-fitting Printer Applications are now also built with PAPPL 1.2.1 and so getting all the new features and bug fixes, but due to the fact that they use CUPS backends and not PAPPL's own backends to communicate with the printers they currently do not support supply level readout. This will be added later, but most probably only after the release of cups-filters 2.x. Also the support for human-readable strings for the vendor options will come. For those who are printing JPEG images shot with digital cameras directly to a Printer Application (using the setting print-scaling=none) and expect the photo coming out in its \"original size\" according to the image file's metadata will have much better chances now, as the image resolution information in the image's EXIF data (metadata saved in the image file by the camera, more commonly used to find out about ISO, shutter speed, aperture, ...) is made use of now. See cups-filters Issue #362 and Pull request #466 which implements the EXIF support. Thanks to Brian Potkin from Debian for reporting and to Sachin Thakan (GSoC contributor on Avahi support, see above) for the implementation. As a follow-up of the discussion about printers with a 7/1/4 USB interface but not doing driverless IPP via IPP-over-USB on this interface (see last month), Alexander Pevzner has found a solution for ipp-usb not blocking classic access to these printers. He simply lets the ipp-usb daemon disconnect as soon as the access to the device during the preparation of the daemon fails. See Issue #52. Thanks, Alex, for this. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|41888| |ipp-usb|ipp-usb|2186| |ps-printer-app|PostScript Printer Application|2390| |ghostscript-printer-app|Ghostscript Printer Application|1413| |hplip-printer-app|HPLIP Printer Application|4725| |gutenprint-printer-app|Gutenprint Printer Application|3974| Note: The sky-rocketing of the number for the CUPS Snap from ~4200 last month to ~42000 this month is due to the fact that Application Snaps in the Snap Store which use the new cups snapd interface auto-install the CUPS Snap as it is needed for the interface's security concept. The new interface got launched April 25 and the first application using it uploaded on May 16 (see above). Currently released is 2.4.2. There will be further bug fix releases in the 2.4.x series. Some bug fixes were done, see changes below. Ubuntu Jammy Jellyfish (22.04 LTS) comes with 2.4.1. Ubuntu Kinetic Kudu (22.10 will most probably come with a later 2.4.x. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.15. We are continuing to restructure the code to separate the siamesian twins of the filter functions and PPD file support and after that we will finally polish and bug-fix the code for the 2.0.0 release. See above for more details. The re-structuring made me not doing any further bug fixes on cups-filters, so there is also nothing to backport to 1.x. Ubuntu Jammy Jellyfish (22.04 LTS) comes with cups-filters 1.28.15. Ubuntu Kinetic Kudu (22.10 will be the first Ubuntu coming with cups-filters 2.x. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.2.1. I have started to work on adding the new PAPPL 1.2.x features (SNMP-based supply level readout, localization/human-readable strings for options/attributes) to pappl-retrofit. See above. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-June-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - June 2023",
+ "url": "/OpenPrinting-News-June-2023",
+ "headings": [
+ "GUADEC 2023 in Riga",
+ "Ubuntu Summit 2023 in Riga",
+ "Google Summer of Code 2023",
+ "CUPS 2.4.6",
+ "Approaching final release of cups-filters 2.0.0",
+ "Snap updates",
+ "Test the CUPS Snap!",
+ "Classic Ubuntu",
+ "Ubuntu Core (immutable)"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/t0_qvADqLsY/hqdefault.jpg",
+ "snippet": "GUADEC 2023 in Riga, Ubuntu Summit 2023 in Riga, GSoC 2023, CUPS 2.4.6, cups-filters 2.0rc2, Snap updates, Test the CUPS Snap!",
+ "content": "Perhaps one or another of you remembers that in last month's news I have announced that I want to switch Ubuntu 23.10 (Mantic Minotaur) from the CUPS packages in Debian format to the CUPS Snap as its printing environment and correspondingly to Printer Applications instead of classic CUPS printer drivers. And this announcement had a high impact, opened a downright can of worms ... First, as usual, I announced my news post on Mastodon and a few days later OMG! Ubuntu picked up on this. As usual, if something is written or told about Snap somewhere it tends to provoke a heated debate, the naysayer's voices usually the loudest, nearly masking the few telling about the advantages of Snap ... Near 200 comments! After all this lively Snap discussion, a few days and subsequent blog posts later, Oliver Smith, product manager desktop at Canonical, issued a great post on Canonical's Ubuntu Blog about immutable Linux distros, a great explanation of how immutable Linux distributions work, the different already existing approaches Chrome OS, Fedora Silverblue/OSTree, and MicroOS/Btrfs, and Canonical's Ubuntu Core/Snap with the possibility to use also this one for a desktop operating system. And from then on, immutable distros and distro-independent, immutable packaging was what everyone talks about: Jorge Castro, Brodie Robertson on immutable distros, on packaging, ... By the way, YouTuber Brodie Robertson did a nice interview with former Canonical employee (and free software veteran as me) Alan Pope. Alan especially tells about how Snap started. But careful! It is 2 hours, like a full-sized movie ... So Snaps get more and more important, and therefore I am also on it here at OpenPrinting. I have already switched all our 6 Snaps to core22 as base Snap. So please help us and test the CUPS Snap! We especially need to fix as many bugs as possible but also do some tuning with the interfaces, partially also on snapd. Also, if our Snaps should get included in Linux distributions, independent of whether immutable or classic, we need a proper versioning and release management for all our Snaps. Heather Ellsworth, responsible for Snap packaging of several desktop applications for Ubuntu in Canonical's Desktop Team, has created scripting for automatic release of a new Snap build into the --candidate channel of the Snap Store always when the upstream repo gets a new tag (usually a release). All files needed for that are available in a GitHub repository and Heather explains on Canonical's Ubuntu blog site how to use them. We have also progress in many other OpenPrinting projects thanks to our Google Summer of Code contributors, they tell us what they have done since our previous news post. And Canonical's security team liked my GitHub security bug tutorial from last month. It made it into their Ubuntu Security podcast! But note, the first, near 20 min of the podcast is a, for many people rather boring, list of all security fixes which got done in that week. The part about our tutorial starts at 19:33 min into the podcast. Only 4 weeks until GUADEC in Riga, Latvia! Now also the contributions from the second Call for Proposals for extra workshops and BoFs have been selected and my proposal of a GNOME/GTK Printing BoF has been accepted! It seems that they got an extra room in the venue for the workshops and BoFs on Saturday and Sunday. So there are 3 extra 2-hour sessions on Saturday and 2 extra 2-hour sessions on Sunday. See the updated, final schedules. Please also keep an eye on Mastodon for updates: #GUADEC2023, #GUADEC So I will be speaker/host of the following sessions: The New Printing GUIs: GNOME Control Center and Common Print Dialog Backends Wed, July 26, 10:00 EEST, room 2 Right on the first day I will talk about the state of the art of the printing GUIs for the New Architecture, the \"Printers\" part of the GNOME Control Center and the Common Print Dialog Backends (CPDB) support in the print dialogs and will also demo the GUIs. I will also announce my BoF then. Your app everywhere, just in a Snap! (Workshop) Update: Sat, July 29, 14:15 EEST, room 1 This GUADEC will get snappy! In this 2-hour interactive workshop you will learn how to snap (= package as a Snap) your favourite applications! You will snap a simple GNOME application on your own laptop and after that we (me and Jesús Soto) will also help you to snap your applications. Update: The workshop got moved to two hours later to not run in parallel with the only other workshop on the GUADEC, \"Discover GNOME development with Workbench\" at 12:00 in room 2. And if you want to attend, please prepare your laptop for the hands-on exercises, by installing the needed software or downloading our virtual machine image. Instructions are in the \"Setup\" section of the slides and here is the Ubuntu 23.04 virtual machine image with everything needed already installed. Note that the *.qcow2 image is 5.7GB large, so please download it as soon as possible and especially not during the workshop. GNOME/GTK Printing BoF Sun, July 30, 12:30 EEST, room 3 During my work on the New Architecture for printing and a recent discussion with GNOME developers and designers, I have 2 subjects I want to discuss in-person: UI Design for the GNOME Control Center \"Printers\" module with support for the New Architecture Separation of GTK printing API into its own project Main participants of the discussion are me, Matthias Clasen, and Jakub Steiner. Anyone is invited to participate. Remote participation is possible and I expect that Mohit Verma, GSoC contributor on the \"Printers\" module of G-C-C, and Gourav Guleria, GSoC contributor (2022) and mentor (2023) on CPDB support in print dialogs will connect. Canonical/Ubuntu Booth Wed-Fri I will also be at the booth for some time and will be able to demo recent work on printing and scanning, and also help you preparing your laptop for the Snap workshop. Preparations for another great Ubuntu Summit are running. Weekly organization team video meetings have started again and the Call for Proposals is open. We got more than 70 submissions already! And we are still waiting for your amazing contribution to the conference. We have extended the Call for Proposals, so take your time to create something awesome. The deadline is now on July 21, 20:59 UTC (23:59 in Riga). Our 6 contributors (plus 1 volunteer) are continuing on their projects and doing awesome work! All of them have posted a little summary in our OpenPrinting team channel on Telegram: OpenPrinting: CPDB support for application's print dialogs: Firefox, Chromium, LibreOffice Contributor: Kushagra Sharma Mentors: Till Kamppeter, Gaurav Guleria, Shivam Mishra, Rithvik Patibandla, Ira McDonald Started progressing for adding cpdb support for chromium. Connected with chromium team for assistance in building chromium from source. Faced several challenges as chromium has a very large repository with a lot of dependencies. At last build is successful and print dialog is also working fine thanks to chromium dev team and my mentors. Next step is to use cpdb api for print backend and edit build config file so that ninja can build cpdb api. I am excited to be able to work with chromium dev team. Sand-Boxed Scanner Application Framework Contributor: Akarshan Kapoor Mentors: Till Kamppeter, Rishabh Maheshwari, Deepak Patankar, Ira McDonald After successfully implementing the regex parser, it was time to delve deeper into the architecture framework of client and server connections. The process began with the implementation of a file named \"escl-ops.c,\" which was the first file that required a separate header file implementation. My mentor, Till Kamppeter, guided me in introducing a file-header system into the existing PAPPL architecture. Little did I know that this was just the beginning of a long implementation journey. The client-server architecture of PAPPL is primarily designed for printers, so I had to consider the requirements of scanners when processing these requests. I was able to develop a basic architecture for handling these requests and then proceeded to create a baseline for implementing scan job creation. These scan jobs needed to align with the MOPRIA scan documents and required a separate implementation that took into account various scan properties. Currently, I am working on resolving the baseline implementation for these scan jobs. Once the baseline implementation of the scan job architecture is complete, we will be able to generate scan job tickets. This will pave the way, after the midterm, for scanner advertising and SANE implementation in PAPPL-retrofit. GNOME Control Center: List and handle IPP print services for the New Architecture Contributor: Mohit Verma Mentors: Till Kamppeter, Marek Kašík, Zdenek Dohnal, Rithvik Patibandla, Ira McDonald I am currently working on making the discovery of devices in G-C-C asynchronous. Along with it, I am also working on sorting the device entries. I am currently trying to understand how to make these features possible by understanding the existing methodology of asynchronous discovery of devices. I am trying to get this done as soon as possible. Continuous Integration: Test Programs for libcupsfilters, libpappl-retrofit, libppd, CPDB, CPDB Libs Contributor: Pratyush Ranjan Mentors: Till Kamppeter, Deepak Patankar, Zdenek Dohnal, Ira McDonald Test Suite for Libcupsfilters: Implemented tests for filter functions in libcupsfilter. The test program accepts the input in the form of printer properties, formats and options. Each test case also specifies the input and output MIME type of the file. The tester function then emulates an IPP printer with same properties and attempts to test it by calling cfFilterUniversal(). Tester than summarises all the tests based on the return value of the function call. The test cases are determined by the bug reports on various openprinting projects. Adding support for the new functionality of IPP Everywhere 2.x to libcupsfilters and CPDB Contributor: Gayatri Kapse Mentors: Till Kamppeter, Rishabh Maheshwari, Zdenek Dohnal, Ira McDonald During the analysis of the codebase, I identified a specific structure responsible for declaring the character set of a text file. In order to fulfill the requirements of printing a PDF document, I made an enhancement to this structure by introducing an enumeration that allows for the specification of various character sets beyond the existing utf8 variable. Additionally, further exploration revealed the presence of numerous attributes that necessitate inclusion. The focus is currently directed towards understanding the definition and utilization of these attributes, aiming to ensure their appropriate implementation within the project. Native Gutenprint Printer Application Contributor: Yuvraj Aseri Mentors: Till Kamppeter, Solomon Peachy, Rishabh Maheshwari, Chandresh Soni, Ira McDonald After completing the printer application's basic structure and looking at the codebase of pappl-retrofit, I developed a plan for integrating libgutenprint into the application. I am composing some wrapper functions that will call and list all printers supported by gutenprint. I will test and compile the code as soon as this function is complete. If everything goes according to plan, I will add all other functionalities in a similar fashion. I will periodically compile and debug the code to avoid encountering problems in the future. Preset management web interface for PAPPL-based Printer Applications Volunteer contributor: Ankit Pal Singh I have successfully developed APIs that allow for the addition and updating of presets in the state file. Additionally, I have created a web interface that enables the creation, editing, and modification of presets. Currently, I am in the process of identifying the appropriate location to implement the necessary code that will ensure the client listeners receive the presets in the 'job-presets-supported' attribute. Looong, looong ago ... we had the release of CUPS 2.4.2, around one year ago now! But finally, we have a new release. One? No, even 4 in quick sequence, as probably during the enthusiasm of releasing again, some glitches got overlooked and in addition, another security bug got reported. So we are at CUPS 2.4.6 now, providing us with tons of bug fixes and among them also two security fixes, and both handled with GitHubs security vulnerability report functionality. Highlights of release 2.4.3 were my pull request for polling the media-col-database IPP attribute separately if needed when doing a get-printer-attributes IPP request to get the printer's capabilities, and the fix for security vulnerability CVE-2023-32324, a possible heap buffer overflow in _cups_strlcpy(). In addition, there is a year of bug fixes, especially identification of fax queues in the get-printer-attributes IPP response (Issue #459), not dropping media types from the PPD due to not having unique IPP names (Issue #688), and color printers not defaulting to color output (Issues #451 and #500). 2.4.4 and 2.4.5 fix regressions discovered soon after the 2.4.3 release, the former a chrasher bug introduced when fixing a bug of not being able to see a remote printer as default (Issue #719 and the latter certificates downloaded from printers not being correctly saved and reloaded, making all jobs after the first job being denied (Pull request #727, discovered during tests of the CUPS Snap by my colleagues). And shortly after 2.4.5 the fix for security vulnerability CVE-2023-34241, a use-after-free in the cupsdAcceptClient() function, got published, leading us to the third hotfix release, 2.4.6. And this one also fixes printing multiple files to IPP printers, which did not work on some printers Issue #643. Thanks, Zdenek Dohnal, for your excellent work as release manager for the CUPS 2.4.x series! I hope we will be able to return to more healthy bug fix release intervals now. Good News! All the bugs I mentioned here last month are fixed now and appropriate Stable Release Updates (SRUs) are released to Ubuntu 23.04 Lunar Lobster. Also a fix resulting from testing the fully updated CUPS Snap are included, and the fix for our first security vulnerability report. But I did not yet do the final release and did a second release candidate first, as I have synced the libppd code with the PPD file support code of current CUPS. The PPD support code of CUPS got spun out for starting libppd three years ago and after that there happened many changes not being synced during all this time, and therefore there should be a little more time for testing. Here are some highlights of the work on our second release candidate: cups-browsed 100% CPU! The Unsupported Resolution Attack!! All-Snap Ubuntu Desktop libppd sync-up with CUPS First Vulnerability Report If nothing severe happens, I will release cups-filters 2.0.0 final in a few weeks, so that perhaps we can celebrate it on the GUADEC ... Ubuntu 23.10 with the CUPS Snap as its printing system approaching, everyone talking about immutable distros, not having given much love to our Snaps in the last months concentrating on landing cups-filters 2.0.0 ... Now we really need to look after our 6 Snaps again ... First, I have updated the upstream versions of all the Snap's components: CUPS 2.4.6 (in Printer Applications from GIT Master) cups-filters (libcupsfilters, libppd, cups-filters, cups-browsed) 2.0rc2 (from GIT Master) PAPPL 1.3.2 + Avahi registration fix (from GIT Master) pappl-retrofit 1.0b1 (from GIT Master) Ghostscript 10.01.1 QPDF 11.4.0 HPLIP 3.22.10 foomatic-db 20230701 (from GIT Master) I have also fixed several build failures, switched to the cmake plugin for QPDF, and added source-depth: 1 for all parts taken from GIT repositories (loads faster, needed for automation scripting, thanks Heather Ellsworth!). But most importantly, I have migrated the Snaps from core20 to core22, to get to the newest core Snap and so reduce the number of different core Snaps to install in a distribution, independent whether it is a classic one with some Snaps or an all-Snap immutable one. For this I simply needed to follow the instructions of the documentation for general core Snap migration and for migration to core22. Now you should read on in the next section to try it all out! Update: I have investigated the behavior of the cups-control interface in different situations. Needs fixing in snapd for auto-connection if the CUPS Snap is used. See this thread on snapcraft.io. Nice shiny, newly updated Snaps! To get also nice, shiny, both classic and immutable distros with them, they need to get tested, so that in the end everything just works ... Please follow the instructions below and if something goes wrong, please tell us. Best is to report an issue for the CUPS Snap. You can also use the discussion facility or alternatively discuss in the snapcraft.io forums. Some discussion with a Ubuntu Core (immutable distro) user we have already in this snapcraft.io thread. So let us first look at classic distros, most importantly Ubuntu Desktop, as we plan to switch to the CUPS Snap as the print environment of Ubuntu 23.10 Mantic Minotaur. You do not need to upgrade to the development branch for Mantic now and most probably run into other bugs and oddities. I recommend that you do the testing under Ubuntu 23.04 Lunar Lobster, especially if you want to test printing and printer management with desktop applications, you will need my New Architecture PPA which is currently only available for Lunar. Having your Lunar machine ready, does not matter whether on real iron or on a virtual machine, you first need to switch from the Debian packages of CUPS to the CUPS Snap. We go the minimum-invasive way and avoid uninstalling packages, but instead we disable the daemons of the Debian packages via systemd. This way you can more easily return to you habitual configuration (by disabling the daemons of the Snaps and re-enabling the classically installed ones). So first disable the printing-related daemons which are available as Snaps: Now check whether the Snaps \"cups\" and \"ipp-usb\" are already installed: Those which are not installed, install via If you have the CUPS Snap already installed, assure you have the very newest one by switching it to the --edge channel: The CUPS Snap is running in the so-called \"proxy\" mode now, operating as firewall for the classically installed CUPS. This is triggered by the presence of an /etc/cups/cupsd.conf file, not by a running CUPS, to avoid race conditions during boot. But do not delete your /etc/cups/cupsd.conf to make the CUPS Snap running in its \"standalone\" mode. Instead, force the Snap to not go into \"proxy\" mode via Now restart the CUPS Snap to switch the mode: Check whether it has actually switched. Run and see whether the printer URIs (last word in each line) DO NOT start with proxy:. If there is no output (but also no error) it is also OK. If you already have a driverless IPP printer (supporting at least one of the following: AirPrint, Mopria, IPP Everywhere, Wi-Fi Direct Print), lpstat -v should contain at least one line, with an URI starting with implicitclass:. It does not matter whether your printer is connected via Ethernet cable, Wi-Fi, or USB. If your printer is not driverless, which is usually the case only for printers which are several years old, you need a driver. But note that the ones already installed on your system (dpkg -l | grep printer-driver-) are not supported by the CUPS Snap. The new format for printer drivers are Printer Applications. Depending on the type of your printer install the needed one: PostScript printers HP printers (at least most of them) Epson or Canon inkjets, dye-sublimation printers of any manufacturer Label printers None of the above works, especially if your printer is VERY old, also PDF and PCL printers from RICOH and OEM Activating classically installed drivers Only if none of the above-mentioned Printer Applications makes your printer working, especially if you have a proprietary printer driver installed, install the Legacy Printer Application which makes the classic CUPS drivers available to the CUPS Snap: Note that this package is in Universe, so you need to have the Universe package repository activated. Now open the web interface of the Printer Application, via http://localhost:8000/, if you were in doubt which is the right Printer Application or you have more than one non-driverless printer, you have perhaps installed more than one Printer Applicatio now. Open the web interface of the other ones via http://localhost:8001/ and so forth. On the upper left you see in which Printer Application you currently are. Add your printer via the \"Add Printer\" button at the upper right, the next screen will take some time to show completely, because it is searched for supported printers. Your printer should get discovered and shown under the discovered devices. Select it. You can usually keep the choice of the printer model on automatic. Once done and back on the main page you can get to a printer settings/jobs page for each printer you have set up, or directly use the buttons in the printer entries on the main page. Under \"Device Settings\" you can configure installable accessories (usually only on PostScript printers). On some printers you can poll this information right from the printer via the appropriate button. It is important to configure this correctly, so that you can choose and configure any added tray on the \"Media\" page and use other accessories, like finishers, via the settings on the \"Printing Defaults\" page. Set loaded paper sizes and types via \"Media\" and desired default settings via \"Printing Defaults\", A4/Letter should already be set automatically. Print a test page. DO NOT try to create print queues directly with CUPS the \"classic\" way (lpadmin, system-config-printer, http://localhost:631/, ...). This will not work! Now lpstat -v should show a line for your printer. The third word of each line, after the device for and before the colon (:) is the print queue name. This name you use to select a printer when using a command line tool of CUPS. Run replacing QUEUE by the desired print queue name. The output shows you the user-settable options, to select paper sizes, trays, finishers, print quality, ... The first word (up to the slash (/), but without the slash) of each entry is the option name and the words after the colon are the possible choice names. Print a file via FILE is the name of a PDF file or an image file. Print with custom option settings via You can supply any number of options. Run to see which jobs are currently in the queue. Now you have done basic tests of the CUPS Snap, you can try all of CUPS' command line utilities. If you want to try the utilities which are provided by the Snap, call them via cups. followed by the command name, like cups.lpstat -v. Use these command line utilities also if the \"normal\" ones fail in some way. Next step is the desktop. Follow my first call for testing, for the desktop libraries and applications which are already updated for the New Architecture, from my PPA. Simply go to my call for testing for the GUI changes in the May News and follow the instructions there, but do it on your system where you are using the CUPS Snap instead of the standard Debian/Ubuntu CUPS packages. Another test case is Ubuntu Core, an immutable distribution for IoT and servers. This one is Snap-only. Any change or application installation can only be done by means of Snaps. As the immutable core does not contain CUPS or any other parts of the printing stack, you have to install the CUPS Snap, and the Snaps of ipp-usb and also of any needed Printer Application, as shown above for classic Ubuntu, but you do not need to stop or disable any already existing daemons for it. You also do not need to create a no-proxy file to stop the CUPS Snap from going into \"proxy\" mode. But what you also have to do is to install the \"avahi\" Snap in addition. The CUPS Snap needs the Avahi daemon to be able to discover IPP printers. With that done you can test the command line tools as shown above for classic Ubuntu (call them with cups., like cups.lpstat -v), but not any desktop experience, mainly due to not having a desktop, but also you cannot install the Debian packages from my New Architecture PPA into the immutable, Snap-only distro. Also due to the fact that Core is Snap-only you will not be able to install classic CUPS drivers and import them with the Legacy Printer Application. By the way, Ubuntu Core, with only the \"avahi\" Snap and one or more Printer Application Snaps installed (no CUPS) could also be used as a print server/adapter to turn old printers (everything which works under Linux) into a modern IPP printer which can be used from any operating system, especially also smartphones and Windows and Mac systems for which appropriate printer drivers are not available any more. On some hardware (Raspberry Pi?) the adapter can even be connected to a computer via its USB power port (Micro-USB or USB-C) and the computer sees an IPP-over-USB printer (PAPPL's gadget mode). Also tests of such setups are highly appreciated."
+ },
+ {
+ "id": "post:OpenPrinting-News-June-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - June 2024",
+ "url": "/OpenPrinting-News-June-2024",
+ "headings": [
+ "Most hated gets loved under Linux",
+ "Raspberry Pi saves old printers",
+ "Opportunity Open Source in IIT Kanpur",
+ "UbuCon Asia 2024 in India",
+ "Open Source Summit in Vienna",
+ "Ubuntu Summit 2024 in The Hague",
+ "Google Summer of Code 2024",
+ "KDE Print Manager",
+ "Quo vadis, Gutenprint?",
+ "CPDB 2.0b6",
+ "CUPS 2.4.10"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/OmzCvb-QBak/hqdefault.jpg",
+ "snippet": "Opportunity Open Source in IIT Kanpur, UbuCon Asia 2024, Open Source Summit Europe, Ubuntu Summit 2024, GSoC 2024, KDE Print Manager, Gutenprint, CPDB 2.0b6, CUPS 2.4.10",
+ "content": "This month we have again a lot of great News! First, as usual, we have a lot of conference news. We now know the location and date for the third Ubuntu Summit and the second Opportunity Open Source. And I am featured speaker on the UbuCon Asia and will also give a talk on the Open Source Summit Europe. Also we got 8 reports from our 11 GSoC contributors. They are all doing great work! But 11 contributors? There is more work, and so we have also a volunteer now, working on CUPS 3.x support in the KDE Print Manager. The most sophisticated non-manufacturer free software printer driver project is Gutenprint. But what is on with this project now? Have a look into my interview with Solomon Peachy, current maintainer of it and contributor of the dye-sublimation printer support. I have tested one of the most hated cheapo HP printers and it is working perfectly under Linux, when one sets it up correctly. There are many people making use of Linux to conserve old printers under Windows, when there are no Windows drivers any more, and have caused a longer thread on Hackaday. And it is always nice to get praised by users for the OpenPrinting work, this time by Aaron Prisk from Canonical's Community Team. He writes on Mastodon: I love that I can just plug in my printer and scanner and they just work. No extra bloatware, no funky drivers, they just pick up and go. We're super lucky to have wizards like @till in the open source world. and also got a nice thread of answers. To complete our intro, on Matrix I told to a person that I am leading OpenPrinting, and they told something about their skills and in the end: \"Though I am hesitant to approach devices that often seem to personify God's punishment upon prideful IT workers. 😅\" So let us see what happened at OpenPrinting in June ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat Remember when I wrote earlier here about HP's madnesses related to there razor-and-blades business model and how they try to enforce it? I got hold on one of these cheapo inkjets from HP now, the HP Envy 6000. I did not buy it, I would never do, I got it as a gift from a person who is moving to overseas. It is one of the Wi-Fi-only species with a sticker put over its USB port, saying Wi-Fi-only. They want the user to install their software to set it up for the user's Wi-Fi SSID and password (it has also no front panel menus and no WPS support). And this software is pitching the ink subscriptions and trying to update the firmware so that the printer rejects 3rd-party cartridges. I tested the printer and found out that you do not need all this, just a USB printer cable. Remove the stupid Wi-Fi sticker and see the shiny USB port. Connect the printer to your computer and in a browser, go to http://localhost:60000/ (if this does not work, install ipp-usb). You will see the printer's web admin interface, and on the \"Network\" tab you can do your Wi-Fi setup. Once done, you can remove the USB cable and use the printer from all devices in your network. Note that when you use the printer just USB-only it will print only 20 pages. If you set up Wi-Fi you can continue printing, both via network and via USB. And you do not need any driver for printing and scanning, it is just a driverless IPP printer, as most modern printers. Well known for us Linux users is that a big problem on Windows is that hardware support for a certain device gets discontinued after a few years, so many printers go to the trash because there is no driver in the new Windows version and the manufacturer has also discontinued support for it. But under Linux, in free software, hardware drivers are conserved for many years, ideally eternally, so if a printer gets once supported under Linux, by a free software printer driver, it stays supported. So a Linux print server, for example on a Raspberry Pi is a solution for Windows users to conserve an old printer, at least if it works with a free software driver under Linux. This idea was presented on Hackaday: A Canon PIXMA MP250 (released 2009) got the death sentence for Windows 11 by Microsoft or Canon but can be used under Linux with the Gutenprint driver. So a Raspberry Pi was used to run CUPS with Gutenprint and the printer shared to the network, appearing as modern, driverless IPP printer under Windows ... The original author wrote a HOWTO. But we have already shown here that this also works without any additional print server hardware, at least for Windows 10 and newer, just running Linux under WSL. And also, with or without extra hardware, one does not even need CUPS but can simply use Printer Applications instead, as shown in our HOWTO, and also on the Ubuntu Summit 2022, which got well accepted. There is a long list of comments on Hackaday and I have commented, too, telling about the WSL-based solution and also that a Pi cannot only mimick a driverless network printer but also a driverless USB (USB-over-IPP), thanks to PAPPL. So OpenPrinting is sustainable! I have posted the link to our HOWTO for saving old printers with the help of WSL also at another place. Zygmunt Krynicki has asked in a Mastodon Thread who is using WSL and for what. He got several answers, including one by me ... Now we have confirmed it! The second Opportunity Open Source will be held in the Indian Institute of Technology Kanpur, on August 24-26, the weekend before UbuCon Asia in Jaipur! We already had some contributors from there, like Shivam Mishra, Mohit Mohan, Pratyush Ranjan, Vikrant Malik, Tanmay Anand, ... We also got a lot of support. Shivam Mishra, former GSoC contributor for us, made the suggestion to do it in Kanpur and already told us that IIT Kanpur is larger than Mandi and has more ease to travel to from other cities, like Delhi, as alredy told here earlier. And as we started working it out, Pratham Sahu has taken the lead in the on-location organization and built up a nice volunteer team. He even interviewed several candidates to fill volunteer roles. In contrary to Mandi, the local organizers are also looking for (local) sponsors, to support us financially for things like speaker accommodation and meals, banners, backdrops, conference-specific swag, ... We also do not need to worry about A/V, as this will all get managed for us by the local organizers. Our responisbility will be to fill the Saturday and the Sunday (August 24 and 25) with talks, demos, and workshops, which we are currently working on. Once we are talking to potential speakers, and second, we have put up a Call for Proposals. So if you want to come and contribute, please submit your proposal until July 22. As on Monday, August 26, there are no classes in the IIT Kanpur, we include this day in our event, as a Hackathon day. So attendees can participate in several Hackathons. Also Hackathon ideas are accepted via our call for proposals. Canonical's Community Team has, as last year made available their Indico for us, so that we have an event site for handling proposals and schedules, some practical info, and later on also registrations. The event is annouced on both Mastodon and the Ubuntu Discourse. Any further spreading is more than welcome. I plan to give talks about OpenPrinting, Snap/Ubuntu Core Desktop and workshops about Snap. We will also host panels about GSoC and about working at Canonical. We also invited Michael Sweet who will give a talk (online) about the state of the art of CUPS and PAPPL and we will run a Q&A session afterwards. Jiongchi Yu, GSoC contributor for OSS Fuzz testing of OpenPrinting components, also wants to give a talk. He also will give it online as he lives in Singapore. I will also try to get further GSoC contributors giving a talk. As I already told last month I will be in Jaipur the weekend after the Opportunity Open Source, Aug 31 - Sep 2 (Sat - Mon), and give a talk and a workshop about Snap. On the front page of the event there are 6 featured speakers, the keynote speakers Bhavanishankar Ravindra, Khairul Aizat Kamarudzzaman, and Varshi Gupta, and also Rudra Saraswat (Ubuntu Unity, blendOS, Iona), Buo-Ren Lin (Snap, L10n), and ... ... me! The featured session is my workshop, \"Your app everywhere - Just in a Snap!\", the one where the audience will learn snapping. As I already mentioned here in February this year's Open Source Summit Europe will take place in Vienna (on Sep 16-18). And I will not just attend because it is around the corner for me, I will also give a talk: OpenPrinting - We Make Printing Just Work! Wed, September 18, 15:10 - 15:50 CEST, Room 1.61 & 1.62 (Level 1) Track: LinuxCon I will give an overview of our work. Going through OpenPrinting's history the components of the printing infrastructure of modern Linux (and other Posix-style) operating systems will get shown. - How did the Internet Printing Protocol (IPP) with the printing system CUPS being an implementation of it simplify printing a lot? - The printer driver challenge, good and bad cooperation with manufacturers, packaging and distributing ... - Desktop integration, GUI toolkits, print dialogs, setup tools, portals, ... Especially also the New Architecture of all-IPP printing and scanning and also the integration in immutable OS distributions will be treated ... There will also be a Canonical/Ubuntu booth with several people from Canonical, especially also Mauro Gaspari, organization lead of the Ubuntu Summits, from Canonical's Community Team. After 2 amazing Ubuntu Summit events in 2022 and 2023, there is only one solution: Celebrate a third one. And this we are doing this year in the Hague in the Netherlands, on October 25-27. Our Call for Proposals is open, until July 15! And this time we do not only ask for awesome talks and workshops, but ... ... also for your free software organization's booths, for our new exhibition which will make up the center of the event. I am in the organization team again, as in the first 2 years, and having run community booths already in the early 2000s I will be able to help with booth-related questions. After more than one month into the coding period of the GSoC we have seen a lot of enthusiasm by our 11 contributors. As last month many of them have provided a write-up again to tell what they have done. And one of them, Rudra Pratap Singh (OCI-containerization of CUPS and Printer Applications) got interviewed in a video by Harkirat Singh, telling about his experience. Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh This month, I've made significant progress on containerizing a working CUPS instance using Rockcraft: Implemented a GitHub Action to automate building the Rockcraft project, compiling it into a Docker image, and pushing the image to a Docker registry. Checkout at DockerHub Raised and merged a PR to extend update-automation for rockcraft.yaml in the ubuntu/desktop-snaps repository, now part of the cups-rock project: GitHub PR 635 Started dbus-daemon within the container for printer discovery, avoiding interaction with the Docker host. Verified printer discovery using the ippeveprinter tool from cups-ipp-utils. Successfully printed files from the Docker host to CUPS running inside the container. Raised another PR for extending version-automation to rockcraft.yaml in the ubuntu/desktop-snaps repository: GitHub PR 636 CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha This month I worked on rewriting all the necessary older code to include CPDB frontend API functions and fix the printing process so that now printing with CPDB works on the LibreOffice print dialog. While working on that I discovered that the names of printers on the LibreOffice dialog are static, evaluated on LibreOffice startup and not refreshed while the dialog is open unlike CPDB where periodic refreshing of the printer lists take place. This meant that the print dialog needed to be able to cope with that a printer can already have gone away even though it is still displayed in the dialog. So, I made changes to include appropriate error handling so that while using CPDB, the issue of stale printers do not occur. Moreover, I also made modifications so that for CPDB the \"Print Directly\" button of LibreOffice now prints on the default printer initially and not on the first available printer as was the case before. Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu OpenPrinting has successfully integrated two main projects into the OSS-Fuzz framework in June, which includes the migration of the ownership for existing OSS-Fuzz CUPS integration and fixing building issues. We have integrated all harnesses into a new GitHub repo, fuzzing, and are continuously updating and maintain the fuzzers. So far, OSS-Fuzz has identified a total of 34 potential issues and has contributed to one fixed bug in libcups and CUPS. We are pleased that Oliver Chang and Dongge Liu from Google have joined to mentor the integration process and we plan to add more fuzz harnesses in future developments to improve test coverage and will push forward the continuous fuzzing integration of more OpenPrinting projects such as cups-filters. PAPPL API Bridging for Scanner Applications Contributor: Akarshan Kapoor Akarshan has moved from India to Germany for studying for a semester there. Therefore he had a lot to do with this move in the last month and so he did less on his GSoC project, so he did not provide the usual write-up. For onboarding Alexander Pevzner (author of ipp-usb and sane-airscan) as a mentor, he wrote a short introduction to his project, which is also interesting for anybody not having followed his work in previous news posts: For non-driverless legacy or specialty printers, we have introduced Printer Applications, which emulate driverless IPP printers. To create these Printer Applications, there is a standard library called PAPPL (Printer Application Library), written by Michael Sweet. It contains everything a Printer Application needs, including a daemon, handlers for DNS-SD and IPP, a web admin interface, and more. Michael has also written two native Printer Applications: hp-printer-app (for legacy PCL lasers) and LPrint (for label printers). Till Kamppeter has written pappl-retrofit, an additional library for PAPPL that allows one to easily wrap classic CUPS printer drivers and PostScript PPD files into Printer Applications - retro-fitting. Currently, I am adding scanner support to PAPPL so that it can be used to create both Printer and Scanner Applications, even supporting multi-function printers with a single application. I am adding eSCL support to PAPPL (which previously only supported IPP printing) and SANE support to pappl-retrofit. This approach provides a universal Printer/Scanner driver format that allows for distribution-independent binary packages and the addition of drivers not only to classically installed but also to immutable operating systems. Akarshan's ongoing work you find in this work-in-progress pull request on PAPPL and in his GIT clone of PAPPL 1.4.x. CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma I have resolved all the comments on the merge request for adding CPDB support to chromium, the updated code is under review and in this coming week I am planning to have a virtual meeting with chromium team to speed up the merge request. I have also started working on adding CPDB to mozilla which includes both Firefox and thunderbird. Kushagra created a good collaboration with the Mozilla developers now, via my original feature request. Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal With help of ideas discussed with Mohit Verma in meetings, I was clear on what I have to do and how I'm going to test it. Developed Functions for Listing IPP Services: Used Avahi and D-Bus libraries in Python. Implemented functions to list available IPP services. Service Discovery: Program runs DBusGMainLoop() to continuously discover new services. Prints service details whenever a new service is resolved. Next Objective: Deliver the discovered services to the UI part of the system configuration printer. User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma First I have build a dummy printer for testing the code and after that I started working on an authentication server. It is important to know the flow of access tokens, so I learned about it and implemented the code of it. Then I started working on handling HTTPS requests which will be done by libcurl. Currently I am working on the user interface and in coming weeks I will implement the code written so far and will try to make it secure and to make it secure I am using HTTPS. Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak I have migrated following files from QPDF to PDFIO, also I have changed the code for these files from C++ to C qpdf-tools.cxx, qpdf-cm.cxx, qpdf-xobject.cxx, qpdf-pdftopdf.cxx, qpdf-pdftopdf-processor.cxx As there was a \"pptypes.cxx\" file dependancy while migrating \"qpdf-pdftopdf.cxx\". So that I have changed pptypes.cxx extenion to .c extension. Currently, I am validating the changed qpdf-pdftopdf-processor.cxx functions. Here is Uddhav's work on GitHub. Gaurav Guleria is now finishing the merge requests for CPDB support in the Qt print dialog, actively working out the remaining rough edges with the Qt developers (#556476, #437301, #471258, #116726). Good News! We found a volunteer who will work on the CUPS 3.x support in the KDE Print Manager together with KDE developer Mike Noe! As I told in April Mike Noe from KDE is working on CUPS 3.x support for KDE's printer setup tool. Now, well after the contributor application deadline for this year's GSoC, Tarun Srivastava, student at the Indian institute of Technology Mandi in India, showed interest in participating in OpenPrinting. He started working on a CUPS issue and after some conversation with Michael Sweet, the problem got solved. He showed more interest in OpenPrinting, reached out also to me, and then I offered him three areas for contribution: Working on further issues, working on library documentation, and doing the CUPS 3.x support for KDE. He picked the latter. Now Tarun is enthsiastically on it, talking with Mike Noe by e-mail and also discussing on our Telegram channel for the CUPS 3.x support in the GNOME Control Center, as he will have to resemble this functionality in KDE. So seems that the first Opportunity Open Source in Mandi was really successful ... The Gutenprint project (formerly GIMP-Print as it provided also GUI for printing out of GIMP), created by Michael Sweet, overtaken by Robert Krawitz, and currently taken care of by Solomon Peachy, was an approach to get high quality, free software inkjet printer drivers, especially for photo printing, also with specialty inkjets (like 6 gray-level monochrome) from third parties. Mainly covered were Epson and Canon inkjets, including large formats, and also dye-sublimation photo printers. Also some HP inkjet and laser printers were supported. Robert Krawitz was working on the project with a lot of enthusiasm for many years, making it the most sophisticated and most active non-manufacturer free software printer driver project, and while he was on it, most Epson inkjets got quickly supported. Unfortunately, Robert stopped working on Gutenprint some years ago due to lack of time. Maintenance got continued by Solomon Peachy, but as he joined originally for the dye-sublimation printers, development of Epson and Canon printer support practically died. As Solomon is now mentoring Ankit Pal Singh on his GSoC project about creating a native Printer Application of Gutenprint I got to have a conversation with Solomon which turned out to also be interesting for our readers here and so I published it (with his consent) as an interview here: Solomon: Gutenprint is effectively dead upstream, other than my work. I keep hoping that these GSoC efforts will supr other interest, but none of this is cool sexy work.. :( Till: Are there really new printer models coming up needing Gutenprint and somebody implementing the support for these models? Solomon: Yes, unfortunately. :) Well, that someone is me, but yeah. The commercial/industrial dyesub space is still quite resistant to IPP Till: As label printers ... Solomon: Label printers are another vertical that is largely sdk driven instead of generic raster. Till: So the only new models in need of Gutenprint support are dyesubs? Or are Epson and Canon still producing proprietary-only inkjets? Solomon: I can't speak about canon but Epson is still producing non IPP models, especially on the very high end They still see IPP as something that iterates too rapidly and drives up the cost/complexity/support burdens given the decade-long lifecycle for a given model Several times now I've actually been hired by US/EU branches of printer makers to reverse engineer things because it was easier than working with their corporate head office. Corporate politics are really screwed up sometimes... Till: That's great ... Solomon: Its been a long time since I've been able to talk anyone into funding improvements to the low level infrastructure though. Most of my work on gutenprint has been self funded. I prefer to focus on the hardware support side, but... I'm the only one keeping gutenprint alive now. I have some contract work coming probably next month for a new router. And I'm still slowly backfilling in some other models as time and access to hardware permits. Er, a new printer. Not router. Till: So there is somebody contracting you to add support for their printer in Gutenprint? Solomon: Yep. Though not the actual manufacturers Till: OS vendors? Solomon: ISVs producing things like kiosks and specialized print servers, mainly. Till: So these drugstore photo kiosks which have a dyesub printer inside? Solomon: That's one of the major markets, yes. The other major one I deal with is for folks wanting an on premise printing solution for event photography or selfie booths at weddings. Till: These thingies which also often make it to closing parties of conferences, like the Ubuntu Summits. Solomon: They are incredibly popular still. Till: And these high-end Epsons, these seem to show shortcomings of IPP. Are there problems to map the high-end imaging into IPP? Or is it this vast amount of adjustable parameters? Solomon: I think it's the latter, and the fact that the normal use cases require actively tweaking things until you are happy with the output Printing on custom media, using custom inks, and more. These things are typically driven by a dedicated RIP built on a mfg sdk instead of via OS drivers. Till: And is it straightforward to add the new Epson models into the existing Epson driver of Gutenprint? Or are they inventing all the time new communication protocols? Or is the problem more the always new and different ink sets? Solomon: It's not hard to add basic support for new Epson models, but tuning the output to be \"good enough\" for standard use case is time consuming especially if it involves a new ink set. I only did it once. Till: And probably requires from you to have the actual printer (which you would have to buy if you do not get some form of external support for this work)? Solomon: But yes, either someone sends me a printer or I buy one myself. I have quite a collection now, thanks to eBay and being able to repair broken stuff. Epson has a newer communication language and they even provide a cups driver... but it uses a proprietary library. But all of their high end stuff still provides esc/p2 because that provides the low level knobs you need for all the custom stuff. Dyesubs are comparatively simple, so I've often got things working with someone else sending me USB sniffs, spool files, and running tests. But it's a lot faster to have the printer on hand. Usually results in more features too as I can experiment more Till: So Epson's proprietary driver with its new proprietary language is more for the \"consumer\" users who want everything ready-made, like what is IPP supposed to be good for, and there is ESC/P2 for the \"power users\" to have access to everything? Solomon: I think that's fair, yes. But afaik all of the relatively recent esc/p-r models also support IPP directly Till: So the ESC/P-R driver is actually only needed for non-IPP legacy models? Solomon: ...maybe? I honestly haven't looked into it. Epson also doesn't publish any esc/p-r specifications I don't have any contacts with them. When I added the surecolor D700 [Epson SureLab D700, see below] to gutenprint I produced over 100 printed before the quality was acceptable in my eyes. If that hasn't been paid work I would have never have done it. Till: This is a lot, you run through a lot of cartridges, this is impossible if you have to do this on your own dime ... Solomon: Exactly. This sort of tuning needs mfg support. Or better yet they do it themselves. Till: I only have seen by the options in Epson's ESC/P-R PPDs that this driver is rather low-end. It often had only 300 or 360 dpi as resolution, not these crazily high ones directly accessible with Gutenprint. Did they already reach the 10000 dpi? Solomon: That esc/p-r 300dpi is the software exposed resolution. The hardware is much higher, and generates the high res dot/dotjer patterns internally. Till: Does it not make sense to feed at least 600 dpi from the software side into the driver? Solomon: Those crazy high resolutions refer only to individual ink drops. You might get 2-3 drop sizes only so you have to use dithering to get smooth tones. So in practice a 3840dpi printer is still only 360 from a sw perspective Iirc the models that use /300 dpi are all esc-pr, but /360 can use escp2 as well Till: So there are 300-dpi Epsons? And these are ESC-P/R only (perhaps also IPP)? And the 360-dpi models are both ESC/P-R and ESC/P2? Are the high-end ones all 360-dpi then? Solomon: I think so? Like I said, I have only mucked with two models personally. Till: So you are more the master of the dye-subs? Solomon: Yes, that was how I got involved in this space. And then everyone else sorta left. Till: Meaning that we probably will not see support for new Epson and Canon models? Solomon: The short answer is... Probably not. The canon maintainer hasn't been heard from for several years. I could probably take over that stuff completely but.. not on a purely volunteer basis. Till: But this will cost a lot of time and money (printers, lots of cartridges, ...). Solomon: Exactly. Fwiw I think it wouldn't be a lot of work to write a native esc/p-r driver for gutenprint and make the Epson drivers irrelevant. But that goes back to time and money. ...I have not had a lot of spare time these days, and prefer to spend what I do have outside instead of staring at screens. Till: Yes, and such a high-impact driver change requires testing on actual hardware. Solomon: For several of the dyesub models I've reverse engineered driver binaries to work out algorithms. And often it's not the algorithms themselves that matter, but instead it's embedded data tables. Meanwhile gutenprint needs updates for the gimp plugin too. Gimp 3 and newer versions of gtk. The work adds up. I'm hoping to at least get a new gutenprint release out soon. Till: Yes, this would be great. The Debian (and so also our Ubuntu) package has a crazy version number, due to lack of releases. 5.3.4.20220624T01008808d602-1build4 Solomon: The CI system that Robert set up has gone MIA too. There is a lot of stuff I don't know about that needs to get done for a proper release. Till: So with the background of that most modern consumer or office printers are IPP, including Epson and Canon models, Gutenprint's Epson and Canon support is to be considered rather a way to keep legacy printers alive and for you to do great, useful, and impactful things with Gutenprint is to concentrate on dye-sub, as here IPP support is lacking and in this area you get more easily somebody contracting you. Solomon: I think that is a good summation The ultra high end and commercial gear also benefits from gutenprint due to the extreme tunability required by the target market. But everything else is legacy. Till: But this one only if somebody maintains Gutenprint and adds the new models. Solomon: Current models too, yes. But for any new model to be added someone has to do the work.. Till: And therefore it makes the impression for me that this high-end printing support via Gutenprint is dying. Solomon: That's probably been true of gutenprint as a whole for a decade. I sometimes think it might be simpler to fork gutenprint and strip out everything that isn't for dyesubs A pure dyesub subset would be a lot simpler to bolt onto PAPPL too. Till: This would be a good idea ... The inkjet part would go into OpenPrinting's driver museum for legacy printer support via the (retro-fitting, nobody is willing to make a native one) Gutenprint Printer Application and the dye-sub part goes on actively maintained by you including a native Printer Application. WDYT? Or would this lead to a lot of independently maintained duplicate code? Solomon: I don't know. The main complication/duplication has to do with the backend. And that happens whether or not gutenprint itself is forked. Figuring out how to merge the backend stuff into the application is a task I've been putting off until after the rest of it is at least demonstrable. Till: OK, looks like that will still need some effort ... Solomon: Yep. Pappl also gives us a lot more options for dynamic settings (Eg restricting available print sizes or other options based on printer state) so that will factor into how things get restructured. And much better status reporting options. And being able to seamlessly combine print jobs to save paper or time. Till: So with PAPPL we get much better printer drivers and for the client it is all IPP? Solomon: Since PAPPL is a running daemon it is a lot easier to carry state versus the old cups every job is completely standalone model? Till: It even saves state files so that it carries on where it left off after a reboot. Do you have something which you want to tell to our readers? Solomon: The main thing... see Xkcd #2347 I got into this printer hacking world so I could actually use my own printer without using proprietary software/drivers that were ... Quite awful Even in an IPP world, that still matters. Till: XKCD #2347 ... The usual one ... It is referred to a lot ... Solomon: Every IPP printer I have owned has had serious bugs that only occasionally get fixed. My brother laser printer is more reliable using cups+gutenprint talking to the jetdirect port than via IPP. And faster too? Free software still matters. Anyway I need to go help with dinner, but thanks for the chat. :) Till: Dinner?! For what that? You should better use the time for coding ... Solomon: Plus my phone is at 2%. Till: And thanks for the patience with me, have a nice dinner! After proofreading this interview in the form how I have posted it here, Solomon has provided me with some corrections and additional information: Solomon: Corrections: The Epson printer I mentioned is the SureLab, not SureColor. And Epson is actively maintaining two esc/p-r drivers, one fully open source but the other partially proprietary. But they support different sets of printers. I think the standard office types are handled by the open one but high end+prosumer stuff is by the proprietary one. The latter being Gutenprint's general niche these days. Till: So the \"newer communication language\" you meant originally, which uses a proprietary library, is actually also ESC/P-R? Solomon: Yes. The proprietary library is most likely dealing with the fancy multicolor ink sets. But it's not something I've looked into. Or wanted to look into. :) After 10 months, and working currently on snapping the CPDB backend for CUPS, we are now releasing the sixth beta of the second generation of the Common Print Dialog Backends (CPDB). Changes on the CPDB libraries Changes are Streaming print job content Simplifying list filter control Allow permanently running backends Print dialog update on addition or removal of backends Dropped job control functionality Discontinued the FILE backend Bug fixes This caused some API and D-Bus communication protocol changes. See the announcement post. Changes on the CUPS Backend Changes are Updated names of some CUPS constants to CUPS 2.5.x and newer Removed tryPPD(), a useless, PPD-related function Unified logging. We always use the log...() functions now. Build test ( make check) fixes Bug fixes The new versions of the CPDB components cpdb-libs: More Details and Download, Discussion cpdb-backend-cups: More Details and Download, Discussion There were two new CUPS 2.4.x releases in June, one containing the bug fixes which happened so far plus a security fix and the second quickly done to fix a regression caused by the security fix: 2.4.9: CUPS 2.4.9 brings a security fix for CVE-2024-35235 and several bug fixes regarding CUPS Web User Interface, PPD generation and HTTP protocol implementation. 2.4.10: CUPS 2.4.10 brings two fixes: Fixed error handling when reading a mixed 1setOf attribute. Fixed scheduler start if there is only a domain socket to listen on (Issue #985) with the latter being a fix for a regression caused by the fix for CVE-2024-35235 in scenarios where there are no other listeners in cupsd.conf than the domain socket created on demand by systemd, launchd or upstart. More Details and Download"
+ },
+ {
+ "id": "post:OpenPrinting-News-March-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - March 2020",
+ "url": "/OpenPrinting-News-March-2020",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting Virtual",
+ "Linux Foundation Member Summit 2020 has been cancelled",
+ "Google Summer of Code 2020",
+ "Avahi local service support",
+ "Printer Application Framework/SDK -> PAPPL",
+ "Driverless scanning",
+ "Printing Stack Snap",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "Virtual OpenPrinting Summit/PWG Meeting, LF Member Summit 2020 cancelled, Linux Foundation accepted as GSoC mentoring organization, PAPPL Printer Application Framework, Avahi 0.8.0 released with localhost support, AirScan in Ubuntu 20.04, cups-filters 1.27.3, ippusbxd 1.34",
+ "content": "On May 5-7 we will have our annual meeting again, the OpenPrinting Summit/PWG Meeting. Because of the Corona virus situation we have turned it into a virtual meeting using WebEx instead of actually coming together in Lexington, KY. The originally planned schedules are slightly changed to get shorter meeting days. Unfortunately, the Linux Foundation Member Summit 2020 in Lake Tahoe, California, has been cancelled due to the Corona virus as many other events got cancelled. The Linux Foundation got accepted as a mentoring organization on February 20. So we have continued looking for students and let them do assignments to introduce them into OpenPrinting. The application period for students has started on March 16 and currently we are working with our student candidates on their proposals. We are giving them more background information about the project ideas so that they can plan how to work on the projects. The students who have reached this stage of our selection process have successfully fixed 9 issues on the OpenPrinting GitHub which we have given to them as assignments. Some additional issues we have closed as invalid after investigations done by out students. The number of open issues of cups-filters is down to 8 now. We have also 13 mentors registered already for OpenPrinting, so mentoring for all students will be assured. The application period for students ends on March 31, so we are still accepting student applications. The accepted student projects will get announced on April 27. See the GSoC 2020 timeline. As I told last month Trent Lloyd has added support for localhost to Avahi. Now he has released version 0.8.0 with the localhost support included and my name is listed in the \"Thank you\" section of the release notes. Now all the requirements for Printer (and Scanner) Applications to work are fulfilled. Michael Sweet has started his PAPPL, a framework/SDK for creating standards-conforming Printer Applications. Especially allows configuration and administration with a web interface, a command line interface, and a basic IPP System Service interface and it opens only one socket for all configuration interfaces and IPP device emulations. Note that PAPPL is still under development and not in a working state yet. The printer-application-framework project from GSoC 2019, which I had moved into OpenPrinting last month and also started improving it for actual use is now deprecated by PAPPL, as it is missing configuration interfaces and runs IPP printer emulations with independent sub daemons on different ports. Some part of the code could perhaps still be used in future Printer Applications. I want to than Dheeraj Yadav for his work anyway, as it was an important study to try out and understand the new architecture. After having a deeper look into PAPPL and also LPrint, the very first working Printer Application, a driver for label printers, also from Michael Sweet, which also has a good documentation I have written up how a Printer Application should work, especially also with user experience in mind, and Michael has agreed with that, and he wants to add that to the documentation of PAPPL. What I had written up is the following: A Printer Application should work like this: Fire up the daemon after installation of the Snap and after each subsequent boot (declare as \"daemon: simple\" in snapcraft.yaml). Check whether there is an \"lp\" system user available. If yes, let daemon drop privileges fully or partially, depending whether root is needed to access the hardware device. Opening the socket and filtering can always be done as \"lp\". Open the socket, at least localhost:PORT, only one single socket on one single port. Depending on configuration settings the socket is also opened on the network: HOST:PORT. For simplicity I will only mention localhost in the next steps, also only http and ipp and not https and ipps. Fire up the web admin interface: It should always be there, even if no supported printer or scanner gets discovered or manually set up. Make also a command line interface and optionally an IPP System Service interface available. Observe devices appearing and disappearing through the whole life of the daemon process. Auto-setup USB- and DNS-SD-discovered devices when they are not already set up and when configuration does not suppress auto setup of a certain device or generally. Do not wake up hardware devices during auto-setup. Use only the information of device IDs and DNS-SD records plus the knowledge of the Printer Application itself (driver) for the initial configuration of the device. Do not use SNMP for auto-setup, it causes more problems than benefits. Mark queues online and offline on devices appearing and disappearing. For each hardware device create an IPP device emulation with an URI as follows: Here the OfficeJet 5000 is a multi-function device which also does Scan and Fax and the Printer Application supports this (HPLIP for example). My suggestion is to have the same queue name for the printer, scanner, and fax which belong to the same hardware device. Only query a hardware device (possibly waking it up) if A client sends a get-printer-attributes IPP request A client sends a job The user configures the device using the Printer Application's web interface. A new Printer Application should be done natively whenever possible, not simply wrapping PPD files and filters. Printer Applications retro-fitting PPD files and filters should only be used for older, now unmaintained drivers, proprietary drivers where the manufacturer does not care, or as a quick interim solution if a Linux distribution should be turned all-Snap, especially with CUPS in a Snap. All PPD options which can get translated to IPP attributes should be made available as IPP attributes, all options of the PPD including the ones which cannot get converted to IPP attributes should be configurable by the web interface, so that a user can at least access them by setting queue default values for them. The Printer Application is not restricted to only provide functionality for the printing and scanning itself and preparing it but can contain all printer-specific software, like the GUI tools which come with HPLIP. (I do not know whether this is required by standards, but in my opinion it should work) Make use of GUI tools contained in a Printer Applications Snap optional, always also allow installation of the Snap and using it on a GUI-less, headless server. This especially requires that all configuration should also be available through the web admin interface. Michael Sweet has also updated our GSoC project ideas appropriately and the mentors are also informed about the new requirements. While preparing our students for writing their proposals, Michael has discovered that IPP System Service is missing a standard DNS-SD record. So he has quickly defined one and already put it onto its way into the IPP System Service standard of the PWG. SANE 1.0.29 with the \"escl\" (AirScan) backend made it into Ubuntu 20.04 LTS (Focal Fossa), so we have AirScan support, meaning that hundreds of scanners in multi-function devices will work now. Alexander Pevzner has expanded his \"airscan\" SANE backend to be a general backend for manufacturer-independent high-level scanning protocols. He already has added the WSD (Microsoft, W3) scanning standard and plans to add IPP Scan support soon. Here is his work so far on GitHub. He will also mentor a student on the IPP Scan server/Scanner Application project in this year's GSoC. I have been on a Canonical Engineering Sprint in Frankfurt as my last trip right before the Corona virus shutdown and talked with the developers of the Snap infrastructure about the CUPS Snap integration. For the Printing Stack Snap I have posted the following requests on the Snapcraft Forum: Interface request: “cups-control” on CUPS snap and including D-Bus: Snaps are a form of sandboxed software packages. The packaged software is inside an enclosure to allow detailed control of the interaction between this software and the outside world. To define the allowed communication Snaps use interfaces which describe what is allowed. These interfaces are defined in snapd, the central control entity for the Snaps on a system. For the CUPS printing Snap we need a specialized interface allowing the communication channels of CUPS. its TCP socket, its domain socket, and its D-Bus services. This is a request to the snapd developers to add an appropriate interface. Hardware-associated snaps - Snap Store search by hardware signature: The main reason for which we are developing Printer Applications is to provide printer drivers in a way that we can used sandboxed packaging for security and for making the driver packages working on any Linux distribution, not needing to build them for each distribution individually. But when the Printer Applications are put up as Snaps in the Snap Store, users would need to find the corrct Snap for their device to install it. Adding a hardware signature list could make the finding of the correct driver automatic, by hardware info being sent to the Snap Store as search term. This is the appropriate feature request for snapcraft and the Snap Store. No further releases. Still no commits on the CUPS GitHub since Dec 18, 2019. But now I got the first sign of life from Apple after Michael Sweet has left. I got answers on my two bug reports, one about mangling IPP attribute names, and one about cupsctl corrupting the cupsd.conf file. Currently released is 1.27.3. Next development steps of cups-filters are to go towards a PPD-less world and Printer applications: Make all filters working without PPD, with IPP options. Exceptions are filters especially made for PPDs, as foomatic-rip. Add build options for no-PPD-supporting CUPS, raster-only Printer Applications, no cups-browsed. Snaps will often have their own cups-filters and then a very limited part of it. Move more functionality into the libcupsfilters library, so in Printer Applications filter chains could be implemented as library function calls instead of external executable calls 1.27.3: Bug fix release, fixing Ghostscript-based PDF page counting in foomatic-rip to work with all Ghostscript versions, building libfontembed tests with correct path to test font, re-sharing of remote CUPS queues with cups-browsed and others 1.27.2: Bug fix release, mainly to fix regressions cause by the zero-page-job-support implementation in foomatic-rip, also some code improvements in foomatic-rip and some crasher fixes in cups-browsed Released ippusbxd 1.34 This release is mainly to improve the DNS-SD advertising to equal the one of the network mode of the device and also to advertise its AirScan scanning capabilities, but we also have some communication and code base improvements. DNS-SD-advertise the device's capabilities based on polling the device via IPP (printing and send-fax part) and via HTTP (eSCL scanning part, if available), the records now contain the same information as the DNS-SD records which the printer broadcasts through its network connection Improved code base by formatting, header files, comments in the header files, and improving debug output Added exponential backoff for print read requests when printer’s responses are empty for saving resources and reducing log file spam Apparmor: Matched path when bin and sbin directories are merged"
+ },
+ {
+ "id": "post:OpenPrinting-News-March-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - March 2021",
+ "url": "/OpenPrinting-News-March-2021",
+ "headings": [
+ "CUPS has new home at OpenPrinting!",
+ "Google Summer of Code 2021",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "User experience: Automatic printer setup, printer setup tools",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "New CUPS home is OpenPrinting, CUPS Snap and PostScript Printer App in Snap Store, Printer setup tools/user experience",
+ "content": "Due to the fact that CUPS development at Apple has stopped since the beginning of 2020 we had forked CUPS some months ago to incorporate patches and fixes from the distributions. As Apple did not resume the upstream work on CUPS, we have made OpenPrinting now the official upstream home for CUPS. This especially means that we can now continue developing CUPS, independent of Apple. So we can add features and lead CUPS into the new architecture without PPD files and with Printer Applications. CUPS has a new home page now and what was formerly our fork is now the official CUPS repository. Upcoming releases will be of the new 2.4.x series, now without \"opX\" suffix now. Also all documentation files which come with it are updated to point to the OpenPrinting resources. Mailing list for development discussions is our printing-architecture list. First feature additions have already happened, all Snap support which the CUPS Snap and the Ubuntu package of CUPS received as package-specific patches is now upstream in CUPS. Update: The Linux Foundation got accepted as mentoring organization by Google! We have applied again for the Linux Foundation as mentoring organization, as in the previous years, for the Google Summer of Code. The accepted organizations will be announced by Google on Tue, March 9, 2021 (Timeline). OpenPrinting's project ideas are posted, but further ideas are still welcome. Note that the projects are half-length this year, 175 hours instead of 350 hours (see our October news. Larger projects we should run in the Linux Foundation Mentoring Program instead of in the GSoC. The CUPS Snap is in the Snap Store now! After several months of waiting, the snapd developers have finally accepted and merged the needed changes for CUPS to receive both printing and administrative (create/modify queues, delete anyone's jobs, ...) through secure interfaces and to easily upload applications with print functionality (like LibreOffice) to the Snap Store without them being able to do administrative CUPS tasks and this without the CUPS Snap needing full access to the snapd core. So we have a secure and easy-to-use printing infrastructure also in all-Snap operating systems. But note that access from non-Snap software gets always granted, so it is recommended to only install such software as package of your OS distribution. Please see the README.md file of the CUPS Snap for installation instructions. Update: All needed interface connections are now approved for automatic setup, so you simply install the Snap and it is ready to use. To make the CUPS Snap your standard printing environment you have to disable or remove your system's CUPS (usually installed as RPM or DEB packages) first. Note also that one cannot install classic CUPS printer drivers into a snapped CUPS system. You need to use driverless IPP printers (AirPrint, IPP Everywhere, Mopria, Wi-Fi Direct Print, those on which you can print from a phone without dedicated app), remote CUPS printers, or PostScript printers (using the PostScript Printer Application, Snap Store). More Printer Applications to provide additional drivers are on the way. Automatic migration to the CUPS Snap by OS distributions will only happen if enough drivers are available as Printer Applications. Update Call for Testing I have now posted a \"Call for Testing\" for both the CUPS Snap and the PostScript Printer Application on Discourse. Please try everything out, following the instructions and post your experience there. Features and fixes in the past month: As already told, the correct implementation of the slots for the \"cups\" and \"cups-control\" plugs of client Snaps, so that the CUPS Snap does not need to plug \"dangerous\" interfaces to the system, like \"snapd-control\". Applied all code changes needed on CUPS to support Snap, both for cupsd being in the CUPS Snap and for access control of client Snaps to CUPS upstream, so with the next CUPS release, we do not need to apply patches to CUPS for its snappability any more. Currently, we are applying one single patch with all these changes. Do not modify the CUPS code with sed any more. Updated the plugs of the included command line tools, depending whether they are administrative or not. Silenced warnings during build due to missing paths for the included command line tools. Get up-to-date with the upstream sources: CUPS 2.3.3op2, QPDF 10.3.0, 1.28.7 Main TODOs are: Testing Make sure CUPS backends have correct permissions (USB currently not working). Turn classic CUPS drivers into Printer Application Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap. The PostScript Printer Application is also in the Snap Store now! You can simply install it now and it is immediately ready to use, no manual connection of any interfaces is required as everything got approved. After installation you only need to set up your printers via the web interface or command line interface. If needed you can also upload your own PPD file into the Application. See the README.md for detailed instructions. Update Call for Testing I have now posted a \"Call for Testing\" for both the CUPS Snap and the PostScript Printer Application on Discourse. Please try everything out, following the instructions and post your experience there. The only new feature added after the February news post is: In the Snap use pyppd to compress the included PPD files from 60 MB in tarballs (.tar.gz) to 5 MB in pyppd'd self-extracting archives. Otherwise a lot of testing of the Snap was done and a lot of things got fixed: A patch on PAPPL allows the command line control of the server as normal user while the server is running as root (daemons auto-started by a Snap run as root). This change was also submitted upstream. Removed unneeded plugs \"network-manager\" and \"log-observe\" In the Snap make the temporary directory available for non-root users Set a default spool directory and allow changing via environment variable to not create a new directory in the $TMPDIR with every instance and leave them dandling around. Silenced warning in Snap build. Correction for build failure in Snap Store Updates to keep working after PAPPL API changes Unfortunately, some things in the PostScript Printer Application are not working as expected due to bugs in PAPP: USB connection only uni-directional (This especially leads to polling option defaults and installable accessory configuration not working) When creating a print queue via command line, I cannot auto-select the driver (You cannot use -m auto when creating a print queue via command line) Web interface: After adding a queue via command line the frontend does not show all queues (Display glitch of the web interface) \"autoadd\" via command line works but gives 3 times \"ps-printer-app: Unable to get IEEE-1284 device ID: Pipe error\" (Principally it works, but ugly messages appear on the screen) With appropriate features added to PAPPL we will be able to also add the following: Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. I have also looked into how to solve the printer auto-setup problem in PAPPL and this way in the Printer Applications. Therefore I have started a discussion on the OpenPrinting printing-architecture list. First problem is if there is more than one Printer Application (with each having its individual auto-setup) installed (for example by the OS distribution) each one wants to poll the device ID from the newly plugged Printer Application at the same time, making perhaps the \"best\" Printer Application not getting it ... We discussed also having a central utility doing the auto-setup and ran into the problem that if more than one installed Printer Application supports the printer in question which Printer Application to select for creating the queue. so we concluded that as driverless IPP printers will be the standard and non-driverless printers which need a Printer Application are either legacy or specialty auto-setup is not that important. We only need some way to guide the user on which Printer Applications are available locally and in the Snap Store. So to not let the users with non-driverless-IPP printers alone and lost I think the desktop should continue to have a printer tool to guide users to find the correct Printer Application, and so started a second thread \"Future of Printer Setup Tools\" suggesting how a printer setup tool could look like in the future: Main window: Instead of having a list of our local CUPS queues we have a list of installed Printer Applications, which printers are set up with them and buttons leading to web interface, IPP System Service panel, printer options, ... All information obtained through Avahi/DNS-SD, could be expanded to a general network service lister (think about also having a button leading to the web interface of your router). Add-printer wizard: Replaced by a list of discovered non-driverless printers (USB, network) and after selecting one you get a list with installed Printer Applications supporting it with button to open the web interface and also a button to do a fuzzy search of make/model in the Snap Store. Johannes Meixner from SUSE suggested to reach this also by a button in the print dialog. We need people to do GUI work for the new printing/scanning architecture. Related to this I posted two feature requests on PAPPL: Extend \"ps-printer-app drivers\" to also show supported device IDs Add subcommand to simply ask whether a given printer is supported Also, having hardware-signature-based Snap Store search would be great here. Currently released is 2.3.3op2. 2.3.3op2 is the last release of the 2.3.x series. To mark that CUPS upstream development is now under OpenPrinting, we start 2.4.x. Ubuntu Hirsute Hippo (21.04) will ship with CUPS 2.3.3op2, also the CUPS Snap currently uses this version. Currently released is 1.28.7. Many things were going on in the other projects, so here we have only one bug fix, raising the timeout of cups-browsed's implicitclass backend from 20s to 60s, to make printing more reliable if cups-browsed is very busy. Currently released is 1.0.2. The release fixes many bugs. PAPPL development has continued, approaching 1.0.3. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-March-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - March 2022",
+ "url": "/OpenPrinting-News-March-2022",
+ "headings": [
+ "Google Summer of Code 2022",
+ "OpenPrinting web site",
+ "CUPS Snap and snapd printing interface",
+ "How it works",
+ "How to snap an application",
+ "Thanks",
+ "Flatpak and printing",
+ "Approaching cups-filters 2.0",
+ "Ghostscript supports driverless IPP data formats",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "Linux Foundation accepted as GSoC 2022 org, \"cups\" Snap interface for applications ready, Snap vs. Flatpak for printing, approaching cups-filters 2.x, Ghostscript and driverless IPP",
+ "content": "The Linux Foundation got accepted as mentoring organization by Google again! So now we are about to find the contributors we ant to work with. Many of those who have already worked on OpenPrinting GitHub issues during our selection process have came up to us, right on the day after Google has announced the Linux Foundation's participation, suggesting which project idea they want to work on and some are already starting to work on it. We are open for GSoC contributors, also non-students, like for example retired people looking into getting involved, and especially people who join our OpenPrinting community, stay with us, maintain, and improve their code, bring in new ideas, mentor contributors in the following years, write on our web site, ... We have posted everything you need to know for participating and our project ideas for you to have a look. We also appreciate any new project ideas brought up to us and narurally also contributors suggesting their ow idea. And we already have one extra project idea since last month: Make a native Printer Application from Gutenprint First, we are working on a prominent note that most modern printers are driverless on our front page and an (automated?) list of available driverless IPP printers. See the discussion in this issue report. Update: Michael Sweet has updated the front page now, adding a prominent hint that most modern printers are driverless and also linked a list of driverless printers right from the front page. Thanks a lot, Michael. The part of the web site for looking up (legacy, non-driverless) printers and drivers (the OpenPrinting database web app has moved to a new server at Oregon State University Open Source Lab (OSUOSL). As the old server did not receive a system upgrade for many years there were a lot of problems with the compatibility of the code (SQL and PHP) with the new, modern server. Fortunately, the people there, especially Violet Kurtz and Lance Albertson, both from the OSUOSL, helped a lot on doing this migration by doing the needed code changes. Thanks a lot to them. The UI of the web app did not change, but there are changes in the internal functionality. Instead of feeding the complete Foomatic XML data into the MySQL database and from this generate the PPD files which are identical with the ones we find in Linux distributions (they usually create them with the foomatic-compiledb script directly from the XML data which comes with the foomatic-db-engine package) we do the same as the distributions do also on the server. We pre-build the PPD files with foomatic-compiledb and serve only the content of the web pages from a (reduced) MySQL database. This saves us from too many SQL fixes to do and server responses, especially when downloading PPD files should be faster. Also the query.php script for machine queries got fixed and is fully working again. This is especially important as we soon want to add a query service for printer setup tools to find the correct Printer Application(s) for a printer based on its device ID. Note that the UI still needs some updating, especially removing obsolete links. If you find any bug, please report it on the bug tracker of the web app. CUPS Snap in the Snap Store The \"cups\" interface for Snaps of applications which print is completely implemented now! What is missing are simply only the next stable releases of the components of the Snap environment: snapd 2.55 and new stable releases of the core Snaps (core, core-base, core18, core20). Once they are out, the new \"cups\" interface is ready to use. See the progress of our work and the updated TODO list. As we will see the needed releases probably already before next month's news post, perhaps in around 2 weeks or so, I will describe here how the final concept works and how to snap an application with print functionality: Snaps are file systems in isolated sandboxes. A Snap is not able to access the file system of another Snap (like the CUPS Snap for example) nor it is able to access the file system of the host system (like for example the Unix socket of a classically installed CUPS). For exceptions from this isolation there are interfaces. They have well-defined permissions what a Snap can access in the outside world. Snaps of user applications, like LibreOffice, Darktable, ... have so-called \"plugs\": network, avahi-observer, ..., and cups. These plugs are connected (\"plugged\") to so-called \"slots\", most of the host system but some also of other Snaps (usually servers in a Snap, like the CUPS Snap). The packager of a Snap can decide which interfaces the packaged application plugs and so he can have maximum security without losing functionality of the application. He uploads the Snap to the Snap Store and when a user installs it on his system, the interfaces usually get auto-connected and the user can use the application without hassle. Now there are some interfaces through which you can do operations which are dangerous for the system. One of them for example is the cups-control interface, which snapd provided already from the beginning on and plugging it (to the system) allows your Snap not only to list the available printers and to print on them, but also to do any administrative tasks (creating and modifying queues, changing cupsd configuration, seeing and deleting other user's jobs, ...) on the system's classically installed (RPM, DEB, ...) CUPS. In classic systems you control this via the \"lpadmin\" group, but in the Snap world you do not have any system groups. To avoid that arbitrary developers can upload Snaps to the Snap Store which plug such \"dangerous\" interfaces and abuse them, compromising the system's security, only selected (not \"dangerous\") interfaces get auto-connected when installing from the Snap Store, other interfaces need to get connected manually by the user (requires \"root\" access to the system), or the developer of the Snap has to request a special permission for auto-connection by the Snap Store team (they manage the list of which interfaces are \"dangerous\" or not). The Snap Store team reviews the application and at least 2 members have to be in favor of the auto-connection for it to het improved. Now when I started to get printing into the Snap world several years ago, snapping CUPS but also looking into how snapped applications can print, I found out that the only way to print out of a Snap was through the \"dangerous\" cups-control interface. The snapper of an application had to plug this interface and request special permission from the Snap Store for the interface's auto-connection on the user's machines, or the user had to connect it manually, not really having printing \"just work\". In addition, this could lead up to very many special permissions from the Snap Store team and raise the probability that a developer abuses his permission by modifying his application. So I started developing, together with the snapd developer team, the new cups interface. All the development was accompanied by the snapcraft.io forum thread of the initial feature request which I started exactly one year ago, on March 18, 2021. There were two pull requests on the snapd code, the first got dropped and the second got merged around half a year after getting initially posted. After the merge, on February 7, 2022, I marked this thread as solved and started a second thread for the finalization. Now let us see how this interface works: An application with print functionality (like LibreOffice, Darktable, gedit, ...) plugs the cups interface. In contrary to cups-control the slot is not in the host system, but in the CUPS Snap, always the CUPS Snap, even if the user uses a classically installed (RPM, DEB, source, ...) CUPS on his system. This means that the CUPS Snap gets auto-installed (like a package dependency) during the installation of the application Snap when it is not already on the system. The application Snap then mounts the CUPS Snap's /var/snap/cups/common/run directory into its own file system's /var/cups directory and has this way access to the Unix socket of the CUPS Snap's CUPS daemon, as /var/cups/cups.sock. This interaction between the two Snaps is part of the cups interface. In addition, the cups interface sets the CUPS_SERVER environment variable in the application Snap's sandbox to /var/cups/cups.sock so that the application uses the CUPS Snap's CUPS. If there is no classically installed CUPS on the system, the CUPS Snap is running in its standalone mode and is the system's print environment, also for non-snapped, classically installed applications (for which it then creates a second socket as the usual /run/cups/cups.sock). So both the snapped and the unsnapped applications print happily via the snapped CUPS. But what if there is a classic installation of CUPS on the user's system, with lots of thoroughly manually created queues and even proprietary printer drivers which we cannot migrate into a CUPS-Snap-based system? In this case the CUPS Snap sees that there is a claasic CUPS configures and automatically starts in its proxy mode. This means the CUPS Snap's CUPS daemon is a proxy for the system's CUPS daemon. The CUPS Snap runs a helper daemon (named cups-proxyd) along with its CUPS daemon and cups-proxyd observes the system's CUPS and clones all its queues, as filterless pass-through queues but with the same PPD files as the original queues, to have the same options and printer properties. Every change on the system's classically installed CUPS is immediately synced into the Snap's CUPS. But why that complicated for the most common situation of having a classically installed CUPS on the system? Why running two CUPS daemons on one simple desktop machine? The Snap's CUPS daemon in this configuration is a firewall for the system's CUPS daemon, it protects it against administrative requests of the snapped application. In the beginning we told that the cups interface blocks administrative requests, but we did not tell how. snapd does not understand IPP (Internet Printing Protocol) and so it cannot filter out the unwished requests from the communication between the application and the CUPS daemon. So who is best for understanding IPP? CUPS! So I have implemented the filtering in the CUPS daemon, the so-called Snap mediation. The CUPS daemon, if it is new enough, 2.4.x in general, also some 2.3.x in case of Debian or Ubuntu packages, checks on each administrative inquiry it receives whether it is from a confined Snap (only these you can upload into the Snap Store without special permission). If so, it checks whether the client Snap plugs cups-control and only then it accepts the request. Requests from unsnapped clients or classic Snaps are not blocked. As we are explaining the mechanisms of the cups interface, our client plugs cups and not cups-control and so its administrative requests get rejected and our CUPS is safe. The CUPS Snap only exists with a Snap-mediating CUPS, at least at the time of launch of the cups interface with snapd 2.55, but actually already for many months, since I implemented the Snap mediation. This way with the cups interface forcing the application's CUPS communication through the Snap's CUPS we are for sure blocking the unwished requests. If we let the snapped application communicate directly with the system's CUPS, we cannot be sure that the administrative requests are blocked, as classically installed CUPS daemons can be too old or the package maintainer could have opted for building CUPS without Snap mediation. We need to keep in mind that Snaps are distribution-independent packages, and each distribution's classic CUPS packages can be different. Therefore wen need the CUPS Snap as proxy. This way we can safely install application Snaps. They plug cups and therefore can print but not mess up CUPS, whatever CUPS the user prefers to use. Developers can easily snap their applications with print functionality and upload them to the Snap Store, without questions asked and easily installable by the user, so that his printing \"just works\". Snapping an application with print functionality is easy, do not get turned away by these rather complicated inner workings. First, you start your snapping the same way as you are used to for applications without print functionality. Read about this part elsewhere. Second, in snapcraft.yaml let each app with print functionality plug the cups interface: or Third, add the placeholder content interface to trigger the auto-installation of the CUPS Snap. Simply add the following lines to snapcraft.yaml: Do not put this into any section, put it right after the header part for example. Simply copy and paste the whole blob of lines as you see it here. Nothing needs to get adapted to your particular Snap, nor you have to create any directories in your Snap for that to work. Note: Having to add these lines is only a temporary workaround. The default-provider functionality is planned to be added to the cups interface in snapd in the coming months. When this has taken place, all what is needed to use the cups interface is plugging cups as described in the second step here. Forth, build your Snap as you are used to, test it, and upload it into the Snap Store using your habitual method. If a user installs it, the CUPS Snap gets auto-installed and the cups interface auto-connected and printing out of the Snap \"just works\". DO NOT plug both cups and cups-control in the same Snap. This can mess up things, especially as CUPS' Snap mediation works \"per-Snap\" not \"per-application-in-the-Snap\", meaning that if one of the apps in the Snap plugs cups-control CUPS assumes the whole Snap plugging cups-control and allows all apps in the Snap to do administrative operations. See a complete example here. Thanks a lot to my colleagues in the Desktop and snapd teams of Canonical for the great collaboration and team work to get the cups interface designed and implemented: Ian Johnson, James Henstridge, Samuele Pedroni, Alex Murray, Alberto Mardegan And also thanks to Michael Sweet for the helping with the smooth iontegration of the Snap mediation into the CUPS code. I have talked a lot about Snap and integration of printing in the Snap ecosystem here in the news posts and also on many conferences, but Snap (from Canonical, the company behind Ubuntu) is not the only system for sandboxed packaging. Flatpak (comimg freedesktop.org, popular in the RedHat-ish world) is also common. I asked Zdenek Dohnal from Red Hat and he and Felipe Borges, a colleague of him at Red Hat told me about how it works with printing and Flatpak. As Snap, Flatpak packages are distribution independent. The developer uploads a single Flatpak of his application and everyone can use it, independent of the Linux distribution in use. First, Flatpak is only for packaging user applications, and not for system components, system or server applications, daemons, ..., or even a base system. So there will be no CUPS Flatpak, nor Flatpaks of Printer Applications. Especially this way Flatpak is not suitable as a platform to distribute printer and scanner drivers as distribution-independent packages. So currently we have no alternative to Snap to provide the complete \"printing just works\" experience. This is somewhat sad as there are Linux distributions which are not systemd-based and so are not compatible with Snap, and there are Snap deniers, too. Also users who trust more the \"original from upstream\" than a distro package of CUPS cannot follow their preference by a simple Flatpak install as we cannot provide a Flatpak of CUPS. Second, Flatpaked user applications communicate with the host system/the outside world through so-called Portals, so for printing they use the Printing Portal. But in contrary to Snap's interfaces the Portal is not an AppArmor permission to access a certain part of the host system (or another Snap) or a mount of certain parts of the host's (or another Snap's) file system, but instead, it is a D-Bus API which provides common GUI dialogs for common tasks (choose file, save file, print, ...), where the dialog comes from the desktop environment (GNOME or KDE) and so is the one of the desktop environment, a common dialog and is de-coupled from the user application via the D-Bus interface. So when using the GNOME desktop and printing from a flatpaked KDE app we should see GNOME's print dialog. Those under you who have followed the activity of the OpenPrinting project already for longer time, perhaps remember our effort on the \"Common Print Dialog\" (not the \"Common Print Dialog Backends\" we are currently trying to establish). That was the same idea, but only for printing that time. To not confuse users with different print dialogs for different applications, we wanted to provide the print dialog from the desktop environment (GNOME or KDE) and the applications shouting into the D-Bus in order to print, also with a well-defined D-Bus API. Unfortunately, we had to give up on this project as we had neither volunteers nor someone financing a developer for us. There is the portal frontend, xdg-desktop-portal which provides the D-Bus interface inside the sandbox and there are portal backends, one for each desktop environment, to provide the actual functionality, as the dialogs and also the communication with the host system. In order to print, the application has to call appropriate D-Bus methods, first for opening the dialog and getting the user's selection of the printer and the option settings back, and another method call to send the job data formatted according to the user's choices. Modern GNOME and KDE applications are supposed to use appropriate high-level APIs (Here is the one of GTK) which auto-discover whether the app is inside a Flatpak sandbox and print (and use other common dialogs) via D-Bus instead of popping up the GUI library's dialog. Problem here is that if we have older apps, non-GNOME/GTK/KDE/Qt apps, and especially closed-source apps, and generally apps not using the appropriate APIs. If they are free software we can at least patch them for the Flatpak, but this is rather invasive for packaging a user application. In addition, only interactive desktop applications which print through dialogs are covered. Non-GUI applications usually talk directly to CUPS (via libcups) or call command line utilities to print and so they need to get invasively modified for printing. In Snaps the user applications do not need to be changed, nor need to have Snap-specific functionality already included. snapd connects the original CUPS interface into the application's sandbox and so the application can do the same thing as it was doing without sandbox. So at least for me it seems that Flatpak is highly specialized for sandbox-packaging desktop applications with GUI, whereas Snap is more general, allowing to sandbox-package practically everything, especially allowing also the use for headless servers. Thanks to Zdenek and Felipe for their explanations and links about Flatpak. I am getting closer to the release, the list of items to fix or ideas to still add gets shorter. So we will see cups-filters 2.0 soon. This time I worked on the imageto...() filter functions again and corrected the centering of the image with print-scaling=none (commit) and the switching between fit-to-page abd no sacling with print-scaling=auto (commit). I also added support for grayscale (sGray 8-bit) PCLm printing support (commit, commit, commit, commit) and added PCLm output support to the gstoraster CUPS filter executable (commit). By the way, I got motivated to do this by discovering a driverless printer which supports only PCLm, the HP LaserJet M15. Usually, driverless IPP printers also support Apple Raster to allow printing from iOS devices via AirPrint. And finally I made the the universal CUPS filter work correctly with all PPD files. If a PPD file specified a driver filter in a *cupsFilter2: \"...\" line, the FINAL_CONTENT_TYPE environment variable was set to the output format of that filter (2nd word of the string defined in the *cupsFilter2: \"...\" line) and not to its input format, which would be what universal has to deliver. So before, the universal filter received a wrong format as its destination format. Npow the filter checks for *cupsFilter2: \"...\" lines and corrects from the given format to the input format of the corresponding line as destination format (commit). Also when installing cups-filters using the universal filter we install also the individual filters (the executables are little stubs anyway) as sometimes they are called by the PPD file (commit). Some smaller bugs and glitches got also fixed. The fixes on the imageto... filters are already backported to cups-filters 1.28.12 and so included in Ubuntu 22.04 LTS (Jammy Jellyfish), the other fixes do not apply to the 1.x series. Mainly missing now is a bunch of log leaks to stderr in image processing functions, some little known bugs, general code clean-up, license info in the source files, and then we are ready for a Release Candidate. I have also contributed to Ghostscript towards driverless printing this month. The changes will be available from Ghostscript 9.56.0 on, which will get released in a few days. First I have added new appleraster and urf output devices to let Ghostscript generate the Apple Raster (URF) format for driverless IPP printing (commit). The chabge was trivial, as Ghostscript already uses libcups to generate PWG Raster (with the cups or pwgraster output devices) and one can switch these libcups functions to output Apple Raster instead by changing a simple flag. Second, I have posted a feature request for an output device to generate grayscale (sGray 8-bit) PCLm output. The feature got implemented a few days later under the output device name pclm8. Ghostscript now supports all standard data formats for driverless IPP printing as output formats: PDF (pdfwrite, pdfimage8, pdfimage24, pdfimage32), PWG Raster (pwgraster), Apple Raster (appleraster, urf), and PCLm (pclm, pclm8). From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|4141| |ipp-usb|ipp-usb|1729| |ps-printer-app|PostScript Printer Application|2257| |ghostscript-printer-app|Ghostscript Printer Application|1143| |hplip-printer-app|HPLIP Printer Application|3847| |gutenprint-printer-app|Gutenprint Printer Application|3169| Currently released is 2.4.1. There will be further bug fix releases in the 2.4.x series. An important bug fixed recently is that with 2.4.1 (or earlier) you cannot create a print queue with lpadmin using a DNS-SD-service-name-based URI (output of driverless command) and the -m everywhere option to auto-generate a PPD for driverless printing (Issue #340, Issue #343). This is fixed now. I also discovered a bug that prevents printing to temporary queues for driverless printers on localhost (IPP-over-USB with ipp-usb, Printer Applications) from the GTK print dialog. I have found a fix for this, posted it as Pull request #353, and applied it as distro patch to Ubuntu's CUPS package. Problem here is that the GTK dialog does all the client's work on its own instead ofg using the convenience API's of libcups. GTK's implementation does not replace the network host name in the URI of the local service (coming from Avahi) by \"localhost\" when the service comes via the loopback (lo) device. In the pull request I let the CUPS daemon correct this when creating the temporary queue. Ubuntu Jammy Jellyfish (22.04 LTS) will come with 2.4.1, perhaps with 2.4.2 if it gets released in time for Final Freeze on April 14, 2022. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.12. We are continuing to polish and to fix bugs for the 2.0.0 release. I have especially done image centering corrections in the imageto...() filter functions, added grayscale PCLm output support, fixed the universal CUPS filter to work with all PPD files. I have also backported the fixes on the imageto... filters to cups-filters 1.x, included in the 1.28.12 release. Ubuntu Jammy Jellyfish (22.04 LTS) will ome with cups-filters 1.28.12. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.1.0. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-March-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - March 2023",
+ "url": "/OpenPrinting-News-March-2023",
+ "headings": [
+ "Linux App Summit 2023",
+ "GUADEC 2023",
+ "Google Summer of Code 2023",
+ "cups-filters 2.0b4 in Ubuntu 23.04",
+ "libcupsfilters and libcups 3.x",
+ "cups-browsed",
+ "Common Print Dialog Backends"
+ ],
+ "tags": [],
+ "snippet": "LAS 2023 in Brno, GUADEC 2023 in Riga, GSoC 2023, cups-filters 2.x in Ubuntu 23.04, libcupsfilters with libcups 3.x, CPDB 2.0b4, cups-browsed 2.0b4",
+ "content": "I am again late with this month's news, but now a very important step is done: The second generation of cups-filters has made it into Ubuntu, version 23.04, the Lunar Lobster! After a lot of hard work adding missing requirements, especially programs and scripts for automatic testing of each build and each upload, and after getting the all the code security-audited, the new packages landed in time on last Friday, 3 days before Beta Freeze yesterday (March 27). And between all of this I keep our Google Summer of Code contributor candidates ~~entertained~~ doing their assignments and familiarizing with the projects and now I am lining up our 2023 team of contributors and guiding them through their proposals. With the first beta of libcups 3.x out I have investigated the migration of libcupsfilters to the new API, and we are well prepared ... And, as last year, you will see me on several conferences: For sure on the Linux App Summit in Brno, Czech Republic, the GUADEC in Riga, Latvia, and the Ubuntu Summit, ... perhaps also on the Open Source Summit Europe in Bilbao, Spain or the Linux Plumbers Conference in Richmond, VA in the US ... For the Linux App Summit 2023 in Brno in the Czech Republic the schedules are published! My talk with demos of the state of the art of the Common Print Dialog Backends (CPDB) support in print dialogs and the \"Printers\" module of the GNOME Control Center, and discussion with the audience, will take place on Saturday, April 22, at 16:35 CEST. Unfortunately, due to the huge amount of great submissions and the limited time slots in only 2 rooms on 2 days, my Snap workshop and my OpenPrinting BoF did not get accepted. But it is not such a big problem of the BoF not being accepted, we will have our own one. To have more time to discuss with my colleagues and contributors on the printing area, Zdenek Dohnal (Red Hat), Marek Kasik (GNOME/GTK), Albert Astals Sid (KDE/Qt), Harald Sitter (KDE/Qt), I will have a meeting with them on (Update) Saturday, April 22, at 15:00 CEST (room/place TBD). Everyone who likes can join. I will announce any updates, changes, details on it in my next news post or a news flash here and on Mastodon, #LinuxAppSummit and #OpenPrinting. After a great first GUADEC for me in Mexico last year I will continue attending GUADECs. This year I do not need to cross the ocean, GUADEC takes place in Riga, in Latvia on July 26-31, as last year 3 days of talks, 2 days of BoFs and workshops, and 1 day of touristing. Yesterday the Call for Proposals had its original deadline, but as there were not enough proposals to comfortably fill all the time slots the submissions got re-opened, this time without showing any deadline, but their Tweet reveals that the extension is for a week, meaning that the deadline is April 4 now. So think in the next days about what you like to tell to the GNOME folks in Riga, what you want to teach in a workshop, what you want to discuss in a BoF, ... It is your chance now ... Also here I have submitted a talk to demo the printing-related GUI changes in GNOME/GTK and to discuss them with the audience. And if all works fine it will get snappy on the GUADEC ... The time window for GSoC contributor candidates to submit proposals has opened and the deadline is April 4. This means for our candidates to write their proposals and mentors to review them. Also mentors have to register and mark in the already submitted proposals whether they want to step up as a mentor for the respective project. Now all our candidates have decided on the project they want to do and are familiarizing with them and also have written drafts of their proposals. The most enthusiastic of them have already started on their projects weeks ago and worked with me and other mentors, often contributors of the previous years, on investigating of what has to be done and planning how to do it. Especially Akarshan Kapoor who is doing the scanning support in PAPPL has started off very well with his mentors Rishabh Maheshwari (Last year's contributor on eSCL support), Deepak Patankar (Mentor on PAPPL scanning also last year), and me. First, he updated PAPPL's documentation with the scanning API Bhavna Kosta had added in GSoC 2021. As the next step he created a list of all the printing-related functions of PAPPL and the ones of Bhavna's scanning-related API functions and added for all printing functions which had no scanning counterpart the appropriate scanning function. All this is now posted as a pull request on PAPPL. Now Arkashan is working on integrating Rishabh's eSCL parser and make incoming requests being distinguished between IPP for printing, eSCL for scanning, and general HTTP for the web admin interface. For this news post he writes: While working on the initial prototyping of a Sandboxed Scanner Application Framework, I encountered a task that required processing and segregating client requests. The way it works is that the client sends a request to the Application Framework, and the API must segregate the request into HTTP/eSCL requests. After creating an initial pathway for implementing this, I realized that I didn't fully understand the format in which the eSCL requests were received. Further exploration revealed that these requests were essentially XML requests and required an XML parser to extract information from them. The parser can be implemented through string matching and is currently being developed. Implementing this and combining it with the current Application Framework will be a checkpoint that leads to integrating it with another parser that parses various scanning capabilities. As reported last month all new packeges which are put into the Canonical-supported core part of Ubuntu (\"Main\") need a build test and an autopkgtest which are run on 6 architectures everytime when a new release of the package itself or any package depending on it gets uploaded. cups-browsed was still lacking both tests and the Common Print Dialog Backends (CPDB) packages were missing a build test. So I have created appropriate scripts and added them to cups-browsed and to the three CPDB packages. All these tests are run by make check called after building the repective package. The challenge for the build test for cups-browsed was to exercise cups-browsed in the way it is actually used without needing root access and ideally independent of the configuration of the system, so that make check also works on build servers for example and not only on fully equipped desktop machines. cups-browsed needs 4 further daemons around itself: CUPS to create print queues on, avahi-daemon to collect DNS-SD broadcasts of printers, dbus-daemon to receive notifications about new jobs from CUPS so that it can dispatch them to their destination printers, and ippeveprinter to emulate IPP printers. I have taken the (very sophisticated) build test script of CUPS (test/run-stp-tests.sh) as example for my test script. There I copy/link the system's CUPS files into separate directories out of which I am running my own CUPS instance on port 8631, as normal user. I especially have to copy the CUPS daemon executable (/usr/sbin/cupsd) into the separate directory so that AppArmor does not act on it. cups-browsed does not need to run as root, it only needs to have admin access to CUPS, so it is easy to run it attached to our separate CUPS instance. And for a private D-Bus there us the dbus-run-session utility. I was not able to create a private instance of avahi-daemon though, ending up with the need of a system's avahi-daemon. This works in most situations, especially as one can register services without being root, but on Canonical's build servers there is no avahi-daemon running and so I had to skip make check in the Debian/Ubuntu package of cups-browsed. Due to this special nature of cups-browsed and the fact that I run the same test script as autopkgtest (run on virtual machine with all needed packages installed), the Ubuntu MIR (Main Inclusion Request) approval team accepted the package into Main. And the tests also showed already what they are good for, they made me finding some bugs in cups-browsed, including even some crashers, which I have fixed now. I got also asked to try to run cups-browsed as normal user, which the tests showed that this actually works. cups-browsed only needs to be allowed to do adminstrative requests on the CUPS daemon, meaning the system user running cups-browsed has to be in the \"lpadmin\" group. It also needs a cache directory writable by the system user. The current Ubuntu package is now running cups-browsed as a normal user. But not only tests are needed, the code of each package promoted from Universe into Main is thoroughly security-audited by Canonical's security team: Coverity runs, code reviews, have daemons to run as root, SETUID, ... (see report in the MIR) This takes several hours of work for each package and when many new packages arrive close to Feature Freeze (1 month before beta, 2 months before release) the queue gets long. Easily a package cannot make it into Main for the desired Ubuntu version and it stays for the next version 6 months later. And we got lucky with the security checks, they got finished last Friday night, in time for the Beta Freeze yesterday (Monday, March 27). Thanks, Sebastien Bacher, for nagging the security team, thanks, Seth Arnold and Alex Burrage from the security team for expediting these packages, and especially thanks, Mark Esler, for your patience with me on the last package, cups-browsed. So Ubuntu 23.04, the Lunar Lobster, will already contain a first piece of the software for the New Architecture. We will not be running in the New Architecture, still using Debian packages of CUPS (2.4.2) and classic CUPS drivers installed as Debian packages, but we use everything with the 2nd generation of cups-filters. So we will most probably have some more bug fixes, as not every fix got backported to cups-filters 1.x. But the most important is that we have 2 \"small\" (non-LTS) releases of Ubuntu in which the new cups-filters will get used and tested, this helps a lot for a safer transition into the New Architecture in 23.10 (based on the CUPS Snap) and to CUPS 3.x in 24.04 LTS. The packages for the Common Print dialog Backends, cpdb-libs, cpdb-backend-cups, and cpdb-backend-file, did not make it into Main yet. Therefore CPDB is not yet used in GTK's print dialog. This will happen together with the general swithcover into the New Architecture in Ubuntu 23.10, to be released in October. I will try to set up a Sneak Preview of the New Architecture (CUPS Snap, CPDB, GNOME Control Center) via a PPA (Personal Package Arquive) soon, though. With libcups 3.0b1 available I have investigated on how well the code of libcupsfilters 2.x is prepared for the new CUPS library, and it seems that we are in a good shape ... First, Michael Sweet has prepared the migration to the new library very well, by his always excellent documentation, here the MIGRATING.md file in the new library's source package. The file describes everything what changed, which functions and data types got renamed, which got removed, also what the new names are. The removal of features is no problem at all for us, as the 2 removed areas are PPD support and non-destination-based listing of queues or printing. For the former we are perfectly prepared, as all PPD support is removed from libcupsfilters and so none of the PPD-supporting functions of libcups get called. And functions of the latter area were never used by libcupsfilters. So the main part of the migration is the renaming, but one can, after converting the code of libcupsfilters completely to the new API, easily create something like a libcups2.h file containing: and let configure.ac set HAVE_LIBCUPS2 if the code is built with the old CUPS library. Another point are interface variants. The old library (cups/array.h) had the following API functions: So there are 3 interface variants for creating a CUPS array. This is because Michael Sweet has started with the first one and later on realised that one can make (sorted) CUPS arrays better if the user can, in addition to a function for comparing two items, also specify functions for copying and freeing items, and also a hash function. So he added the other two interface variants, giving them new names, with added small integer numbers, to keep the original variant to avoid breaking the API. In the new API Michael has cleaned up, doing away with the variants and only keeping the most sophisticated one, with the simplest, original name, without number. This serves everyone, simply set parameters for functionality you do not want to NULL. It looks like this then: Here we will have to define some wrapper functions, simply defined inline in our libcups2.h file (or an accompanying libcups2.c file). There is one oversight in MIGRATING.md though: Also the APIs in cups/backend.h and cups/sidechannel.h will go away. The latter is not used in libcupsfilters (I have removed an unnecessary inclusion here) and the former only by the function cfResolveURI() in cupsfilters/ipp.c, but this can be easily fixed by using the new libcups3 API function httpResolveURI() (cups/http-support.h). In this case we also will not have to unset the DEVICE_URI environment variable. Here one can create a wrapper function in libcups2.c/libcups2.h, named httpResolveURI() which unsets DEVICE_URI and calls httpBackendResolveURI(). With all this libcupsfilters should work perfectly well in the new CUPS 3.x world. cups-browsed got a forth beta release centered in getting test scripts. Here I have created a script which serves both as build test (make check) to be run as non-root, with its own CUPS instance, and as CI or autopkgtest running as root with installed packages. It runs emulations of IPP printers to be picked up by cups-browsed to auto-create CUPS queues on them. On these queues a test job is printed and cups-browsed has to dispatch the job to the printer. This naturally made me doing several test runs and they revealed several bugs which I have fixed in this release: implicitclass backend: If no destination got reported by cups-browsed, retry after one minute, not the standard 5 minutes of CUPS. debug_printf(): Check for need of log rotation only if log file is set and opened, to avoid a crash. on_printer_modified(): Added NULL check to avoid a crash. ipp_discoveries_add(): Ignore duplicate entries. These are most probably caused by a bug in Avahi, having certain discoveries of a printer reported twice and others not. When the printer disappears Avahi reports the disappearal of each discovery correctly, leaving the duplicate entry untreated (removing only one instance of it) and cups-browsed assumes that the printer is still there, keeping its CUPS queue. update_cups_queues(): Reset counter for pausing CUPS queue updates. Otherwise after having updated the number of queues supposed to be the maximum for one run of update_cups_queues(), cups-browsed will never update any queue again. resolve_callback()/resolver_wrapper(): New thread only when printer found We move the check which resolver event we have (found/failure) already in the main thread (resolver_wrapper()) and launch a new thread only if we have found a new printer and have to investigate whether to add a queue for it or not. resolve_callback() only initiates this investigation now. This way we do not need to pass the resolver data structure (of type AvahiServiceResolver*) into the new thread, which caused segfaults. create_remote_printer_entry(): Corrected some memory freeing when a printer data structure is deleted, but this has not caused a segfault in the recent tests. Fixed issues reported by Red Hat Coverity tool (Pull request #6) There are more issues resulting from a Coverity run by Canonical's security team. They will get checked and fixed soon. The 4th beta release towards 2.0.0 was all about getting build tests (make check) added to fulfill the requirements for getting into Ubuntu Main. The tests of the backends start the backend and also the text-based sample frontend of cpdb-libs to check whether printers appear in the frontend's list and whether one can print on them. The test of the CUPS backend even runs its own instance of cupsd (like the tests of CUPS and cups-browsed also do) to let the backend discover the CUPS queues. In addition, cpdb-libs facilitates creating test scripts by installing its text-based demo frontend as a developer utility, with the name cpdb-text-frontend and by allowing to search for backends in an aleternative directory, specified by an environment variable. And the work on test scripts revealed some crash bugs which are fixed now."
+ },
+ {
+ "id": "post:OpenPrinting-News-March-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - March 2024",
+ "url": "/OpenPrinting-News-March-2024",
+ "headings": [
+ "Google Summer of Code 2024",
+ "Opportunity Open Source - 2nd edition!",
+ "CPDB CUPS backend Snap",
+ "Scanning support in PAPPL",
+ "Snap automation working well",
+ "SpliX 2.0.1"
+ ],
+ "tags": [],
+ "snippet": "Easter Egg in xz, GSoC 2024, Opportunity Open Source 2024?, CPDB Snap, PAPPL scanning, Snap automation, SpliX 2.0.1",
+ "content": "This Easter weekend was really eXZiting ... Mastodon is full of posts about the backdoor sneaked into xz/liblzma (CVE-2024-3094) by a co-maintainer who stepped in for the original maintainer suffering burnout. The compromised free software project is a widespread data compression library, performing better than the other libraries of this type, like bzip2 for example. This hobby project got a standard part of the operating system, used on practically any server on the world. Fortunately, the issue was discovered quickly, thanks to Andres Freund who discovered something going wrong when benchmarking Postgres changes. He investigated and finally reported his shocking discovery on OSS Security, and he posted on Mastodon causing a long thread where he also shortly explained how he came to xz as the culprit. Even Andres' report explaining the attack excellently, there were many articles, blogs, videos, ... giving more or less detailed explanations, like a video by Brodie Robertson, the Ubuntu Security Podcast (read also the text at the end of the page), a blog about the shell script-based obfuscation, FAQ as GitHub Gist with discussion, or summarizing it on a single page. Also articles about the strategies the attacker has probably used are there, for example a nice article about the social engineering by the attacker or explaining how the attacker tries to hide their location. It was really a sophisticated piece of engineering, hiding the binary-only (closed-source) backdoor code in a test *.xz file and hiding the code for the multi-stage decryption and extraction in the cryptic autotools build system and in a second *.xz file, and in the end making it only installed when the user/packager uses the release tarball and not a GIT snapshot, to make it not being discovered when auditing/testing the GIT. In addition, the components got added in several commits distributed over months. Thanks, Andres, for investigating and discovering this!! This shows one of the principal problems of free software: Some arbitrary hobby programmer creates something useful for them and thinks it is also useful for others, and so they publish it as free software. Now it gets picked up by other free software projects and ends up getting into all Linux distributions and the original contributor suddenly is maintaining an important part of the world's IT infrastructure. At OpenPrinting we are in a good situation, as nobody of us is about to give up, we only need to take care that there are no such \"Easter eggs\" hidden in any contributor's commits. Also, frequently attending conferences and meeting one's contributors there in-person helps to improve the relationships. But I have also good news: Anyone following us on Mastodon has perhaps seen that I am using the ubuntu.social server. The founder and maintainer of the server, Alan \"Popey\" Pope (thanks a lot), former employee of Canonical, active contributor to Ubuntu, and a Snap packager, has given up maintaining the instance and looked for somebody to overtake it, and Canonical has jumped in! Thanks a lot to Canonical and especially Philipp Kewisch, manager of the Community Team! So all my posts and threads I have linked in my news posts will stay available. So let us see what was exciting at OpenPrinting in March ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions The submission window for contributor proposals has closed yesterday and many proposals got done only close to the deadline, especially also of people who did not contact us before submitting. Those not contacting us usually have poor proposals and we do not consider them. We only select contributors with whom we have communicated before the submission, and the most important criterium is that they work well with us there, doing assignments well, having done vuluntary contributions, starting on their actual project early, ... All this raises them in our ranking for the selection, not the proposal. At OpenPrinting we had a good amount of candidates this year. ~15 have communicated with us in the weeks before the submission window and received assignments, building and modifying CUPS, issues, ..., some have even contributed valuable voluntary work starting last year. Here are especially to mention Rudra Pratap Singh who went above and beyond on Snap update and versioning automation, Biswadeep Purkayastha who made our libraries ready for libcups3 and currently makes CPDB backends snappable, Ankit Pal Singh who volunteered on preset support in Printer Applications and contributed comment preservation in cupsd.conf when it is modified by cupsctl. Rudra's and Biswadeep's work we have covered in more detail last month here. We have also Akarshan Kapoor and Kushagra Sharma returning to participate this year to continue their great work on scanning support for PAPPL and on CPDB support for print dialogs. If all works out fine, we will cover especially the desktop integration well, finishing and merging the CUPS 3.x support of the \"Printers\" module in GNOME Control Center (GSoC 2023 report), adding support for the New Architecture also to system-config-printer and getting CPDB support in LibreOffice (Mailing list thread) and Mozilla (Firefox, Thunderbird) (Feature request). Unfortunately, we have nobody to update KDE's Printer Manager (Issues #1, #2, #11). So we have many project proposals and naturally would like to have them all going, but for that we need mentors, many mentors, ideally 2 per project. So we need your help! If you are interested to help us mentoring, contact me (e-mail at the top left of this page) and I give you instructions on how to register. Please see our project idea list for what we are mentoring this summer. Please step up as soon as possible, as we do not need only your actual mentoring but also you being registered while the contributor slots are distributed, and if we do not have enough mentors on our list, we get less slots. Also note that you do not need to take full responsibility for a contributor's project but also can help mentoring, especially if you can contribute appropriate expertise. Thanks in advance to make this GSoC amazing! Many of you remember the Opportunity Open Source conference in the IIT Mandi in India which was grown out of the idea that Aveek Basu and me wanted to meet our GSoC contributors and motivate more people to join the free software community and GSoC. It was a great success and therefore we want to make it annual, meaning that we are now aiming for its second edition. Very first step is to find a place and a date for the event. It should be in India again, as most of our contributors come from there. So we started to brainstorm now on our \"Opportunity Open Source\" Telegram channel and currently the most promising candidates are the IIT Mandi, where we did it last year, and the IIT Kanpur. Most of our contributors are studying or have studied in Mandi, and even with Akarshan Kapoor, main on-site organizer last year, being on an exchange semester in Germany this summer, there are already others jumping in. Shivam Mishra, GSoC contributor and mentor in previous years, is studying at the IIT Kanpur and suggesting to run the conference there, expecting around 300-400 attendees (instead of the ~100 we had in Mandi). He tells that there \"has been a really active Open-Source community\". He also tells that the IIT Kanpur is larger than the IIT Mandi and closer to Delhi, and it is \"among the top 5 technical institutes in India\". Travel to Kanpur would also be easier than to Mandi, especially if it gets rainy. For the date we are aiming for the weekend after the UbuCon Asia 2024 which takes place in the JECRC University, Jaipur, India, on Aug 31 - Sep 2 (Sat - Mon), meaning that we will go somewhere inside Sep 6 - 8 (Fri-Sun). This way I (and also others, potential speakers) can attend both with one trip, and I can arrive in Kanpur already some days earlier for the preparation. Taking the weekend before UbuCon (Aug 23 - 25) would give me the opportunity to give a talk about this Opportunity Open Source in Jaipur and to attend aKademy 2024 in Würzburg, Germany, on Sep 7-12, but I also have to stay longer in India, and the risk of rain is higher. So these are our ideas for now. We appreciate a lot any suggestion or help. If you want to discuss and/contribute, please join our Telegram channel. End of last year I have investigated how to make a Snap of the backends of CPDB (Common Print Dialog Backends), especially the one for CUPS and ran into several problems, especially as we have to do with user daemons now and the frontend browses available D-Bus services to find all installed backends. So I started a discussion on the snapcraft.io forum and found out that several things need to be changed on CPDB. Biswadeep Purkayastha who was already volunteering for doing the Snap started doing these changes. We covered this here in the October News and in the November News. Biswadeep made good progress: 1. The printFile method of backends needs to pass the job data as stream (file descriptor or domain socket), not as file specified by a file path. Done. The data is now streamed through a domain socket. 2. The D-Bus methods getActiveJobsCount, getAllJobs, and cancelJob need to get removed from CPDB Done. 3. The file backend of CPDB cannot be used. We should discontinue its development and tell that it is for development and documentation only. Low-priority point, which does not stop us from snapping the CUPS backend, but we will do it before the final 2.0.0 release. 4. Filtering of the printer list in the dialog should be completely managed by the frontends, and not by sending signals to the backends, to allow different filtering on print dialogs which are open to the same time. This point is actually different, as we discovered later. The backend recognized from which frontend the signals came and so served different, individually filtered lists to each backend, so handling the filtering by the backend was not even the problem, and also has the advantage of sending less data to the frontemd. More a problem was that the frontend is also a D-Bus service, not only the backends. And the only thing the frontned D-Bus service does is sending signals to the backends to switch the filtering. Here the right way is to implement the filter switching as methods in the backend interfaces and remove the need of the frontends also being a D-Bus service to get a real Snap hell. Biswadeep is currently working on this one. 5. Add newly appearing backends while the dialog is open. Not yet started, will be Biswadeep's next point. Biswadeep's work is progressing well and available in pull requests. The pull requests for (1) and (2) are already merged. cpdb-libs: Pull Request for (1) and (2) (merged), Pull Request for (4) cpdb-backend-cups: Pull Request for (1) and (2) (merged), Pull Request for (4) Thanks, Biswadeep, for your great work! Akarshan Kapoor is continuing to work on the scanning support in PAPPL, to allow providing scanner drivers as Scanner Applications and the Printer Applications for multi-function printers also covering the scanner part. In the GSoC 2023 he created an eSCL parser and afterwards SANE driver retro-fitting support for pappl-retrofit. Currently he works on the implementation of the scanning API functions in PAPPL and will continue this in this year's GSoC. Thanks a lot, Arkashan! Thanks to the awesome work of Rudra Pratap Singh on the Ubuntu Snap automation GitHub action and naturally also on the Snaps themselves we have now deployed Snap update automation and Snap versioning automation on OpenPrinting's Snaps. See our detailed coverage in the January News. What is still missing, is to devide up our Snap GitHub repositories into 2 branches, a development one and a stable one and to have the automation running on the stable branch and the resulting packages uploaded to the \"candidate\" channel of the Snap Store, controlled by a Launchpad setup, as described in the second part of my Snap update automation workshop. Now, using the simple autobuild mechanism of the Snap Store web admin interface, the automation simply happens on the master branch and the resulting Snaps go into the \"edge\" (unstable/development) channel of the Snap Store. But this is good enough to observe whether the automation works correctly, and it actually does! So no worries any more about the frequent updates of QPDF or the many drivers contained in the Ghostscript Printer Application. They get all just updated and as long as they build the users get up-to-date software. Also the version numbers are nice - numbers, like we already know from Debian or RPM packages. Thanks for this amazing contribution, Rudra! I know, classic CUPS drivers are deprecated, but there are still enough people with legacy printers needing them. And this driver will live on as part of the Ghostscript Printer Application, so that Linux and Windows users will be able to continue to use their printers. SpliX is a CUPS driver for Samsung SPL2 printers and rebranded models from Xerox, Dell, Lexmark, and Toshiba. It was created back in 2006 by Aurelien Croc based on reverse-engineering the protocol. He worked on it continuously improving and updating it, especially also to support new printer models, until mid-2009, shortly after the 2.0.0 release. After that I continued maintaining it, just applying contributed patches for fixing bugs and adding some new printer models, no actual development. I did this until mid-2013. After that, nothing changed on SpliX, and distros simply included the latest revision, r315, of the Subversion repository at SourceForge, where SpliX was hosted. I am maintaining the printing-related packages of Ubuntu, and as I am working very closely together with the maintainers of these packages on Debian, most packages are synced, meaning that the Debian package is also used by Ubuntu without any changes. For SpliX there was a little mis-hap, the upstream source tarball used by Debian and the one used by Ubuntu were not identical, even both being the r315 revision of the Subversion repository. So we cannot use the automated syncing of the Debian package into Ubuntu and so have an Ubuntu package with really ugly version numbers, like \"2.0.0+svn315-7fakesync1ubuntu1\". These ugly version numbers have also caused some confusion, which gave us a bug report with the title splix version 2.0.0+svn315-7fakesync1ubuntu0.22.04.1 in jammy is higher than versions in mantic and noble I have fixed it by just doing a little correction on the version number, but do not want to continue with this uglyness for future Ubuntu versions and wanted to make distro packaging easier in general. So to stop with this nightmare I came finally around, 15 years after 2.0.0, to make a new release, catching up all the commits after 2.0.0 and including all non-Debian-specific distro patches from the Debian/Ubuntu package. It is 2.0.1, and as I cannot release on the old SourceForge site, I have moved the repo over to GitHub, under OpenPrinting. Side effect is also that the source code is managed by GIT now and not by Subversion any more. So anybody here packaging for a distribution, please update the package to this release."
+ },
+ {
+ "id": "post:OpenPrinting-News-May-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - May 2020",
+ "url": "/OpenPrinting-News-May-2020",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting 2020",
+ "Google Summer of Code 2020",
+ "Google Season of Docs 2020",
+ "Printer Application Framework/SDK -> PAPPL",
+ "Driverless scanning",
+ "Printing Stack Snap",
+ "CUPS",
+ "cups-filters",
+ "IPP-over-USB: ippusbxd and ipp-usb"
+ ],
+ "tags": [],
+ "snippet": "7 students for GSoC; LP accepted for Google Season of Docs; OpenPrinting/PWG Meeting; Progress of our projects",
+ "content": "During 4 days we have discussed, together with the Printer Working Group (PWG), our plans how we will continue the development printing (and scanning) with free software on Linux and similar operating systems and also about free printing-related standards, especially the Internet Printing Protocol (IPP). The OpenPrinting-related part was the first day (Tue, May 5). See the agenda. Due to COVID-19 we did not meet in person, but had a virtual meeting, using WebEx. The agenda was modified to make the individual meeting days shorter, adding a forth day. The topics we discussed are on the agenda. Slides of all presentations are linked there, too. Here is an excellent summary written by Smith Kennedy from HP and here are Ira McDonald's minutes of the OpenPrinting topics. There is no audio or video recording of the meeting. On May 4 Google has officially announced the accepted student projects, and we were lucky with the student slots, having received all the 15 requested slots for the Linux Foundation with 7 being for OpnePrinting. These are the 7 student projects working with us this summer: Linux GUI application (can be part of GNOME printer tool) to admin MF devices using IPP System Service Student: Lakshay Bandlish Mentors: Rithvik Patibandla, Michael Sweet, Ira McDonald, Smith Kennedy, Danny Brennan Common Print Dialog Backends (CPDB) Qt implementation Student: Priydarshi Singh Mentors: Dongxu Li, Nilanjana Lodh, Till Kamppeter, Deepak Patankar IPP scan (or virtual MF device) server (Scanner Application) Student: Aakash Lahoti Mentors: Alexander Pevzner, Thierry Hucahrd, Michael Sweet, Ira McDonald, Smith Kennedy, TIll Kamppeter General Printer Application SDK (PAPPL-based) Student: Jai Luthra Mentors: Dheeraj Yadav, Michael Sweet, Ira McDonald, Till Kamppeter Make Printer Applications configurable (via PAPPL) Student: Sambhav Dusad Mentors: Michael Sweet, Dheeraj Yadav, Ira McDonald, Till Kamppeter, Sahil Arora Speed/scaling optimization of cups-browsed Student: Mohit Mohan Mentors: Till Kamppeter, Deepak Patankar Extract raster data from PDFs for direct printing Student: Vikrant Malik Mentors: Sahil Arora, Alexander Pevzner, Thierry Hucahrd, Till Kamppeter They all started getting into their projects now and some have even startet coding. The Linux Foundation got accepted as one of the 50 mentoring organizations by Google! We have lined up and registered 19 mentors! So we will not have any problem with assuring continuous mentoring during the whole doc writing period. As umbrella organization we can get up to 4 project slots which we will distribute to the sub-organizations of the Linux Foundation. Here are the project ideas for OpenPrinting. Especially we want to get a tutorial written so that printer and scanner manufacturers have an easy guide to design and package their drivers as Printer Applications. Michael Sweet is not alone any more on the PAPPL project. After some e-mail exchange with Michael and me both Jai Luthra and Sambhav Dusad have started coding on their GSoC projects and Michael has accepted their first pull requests. Sambhav has added buttons for handling jobs and Jai has added DNS-SD discovery. Alexander continued the development of his \"airscan\" SANE backend, having many users testing their devices making up a longer and longer list of devices known to work. Especially now there will be only one entry per physical device even if it supports both eSCL and WSD and discovery is also much faster and the exact behavior is configurable via the configuration file. In addition, there is now the new airscan-discover utility included, to simply discover supported devices via command line. In contrary to the former separate tool this one is written in C now. And the WSD support got merged into the stable \"airscan\" GitHub branch. So we can count on a release and also on the start of the IPP Scan support development soon. On the snapd interface for the Printing Stack Snap we came to a solution. We settled on going the PulseAudio way, patching the CUPS daemon to check whether the inquiry is administrative, and if yes, if the client process is of a Snap which is not under classic confinement. In this case we reject the inquiry if the client Snap is not plugging the \"cups-control\" interface. The appropriate patch for CUPS I have committed to the CUPS Snap's GitHub. The snapd team is now working on the new interfaces. After that I have continued work on the Snap: Updated upstream packages: CUPS 2.3.3, cups-filters 1.27.4, Ghostscript 9.52, QPDF: 10.0.1 Let the standard domain socket (/var)/run/cups/cups.sock be used when the Snap's CUPS is the only one on the system, for maximum compatibility with client applications Made the libcups of the Snap read the Snap's configuration files, especially the client.conf with the domain socket actually used by the Snap Use the \"snap_daemon\" user to replace the unavailable \"lp\" system user to drop the privileges of filter and backend processes Dropped several modifications on CUPS which are now not needed any more, especially the removal of all chown() and chmod() calls For determining an admin group for the snapped CUPS, check first whether the host system has an \"lpadmin\" group, then \"adm\", and after that allow CUPS administration only to root. Added fixes for CUPS upstream bugs which Apple did not apply yet Fixed setup of fonts.conf file for the texttopdf filter Made cupsctl correctly working. The Snap is approaching to have all features and fixes needed for use as the standard CUPS of a Linux distribution, but for actual use we need to complete the Printer Applications in this year's GSoC, as classic drivers are not supported by a snapped CUPS. New release 2.3.3: Security fixes CUPS 2.3.2 did not get actually released. CUPS developer Steve Algernon from Apple was on this year's OpenPrinting Summit/PWG meeting but he did not give a presentation, so we have no new CUPS roadmap. Currently released is 1.27.4. No further releases. Ubuntu 20.04 is shipping ippusbxd 0.34. Unfortunately, on some multi-function devices, when querying the eSCL scanning properties, it comes to a segfault. I plan to issue a 0.35 release and use it for a Stable Release Update on Ubuntu 20.04. Later another bug got discovered and Thierry Hucahrd and Alexander Pevzner are working on it. I like to include the fix in 0.35, too."
+ },
+ {
+ "id": "post:OpenPrinting-News-May-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - May 2021",
+ "url": "/OpenPrinting-News-May-2021",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "Google Summer of Code 2021",
+ "Google Season of Docs 2021",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "Driverless Scanning",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "OpenPrinting Summit/PWG Meeting, GSoC, GSoD, CUPS Snap proxy mode, PostScript Printer Application, CUPS",
+ "content": "On May 4-7 we will had our annual meeting, the OpenPrinting Summit/PWG Meeting. Because of the Corona virus situation we again had a virtual meeting. Smith Kennedy from HP wrote up a great summary of the meeting. There are also the minutes from Ira McDonald. The slides of all presentations are linked on the agenda of the event. Google has officially announced the accepted student projects. The Linux Foundation got 19 student slots and so could accommodate all students they considered for mentoring. With this we can also run 5 student projects for OpenPrinting: cups-filters: Make sure all filter functions work without PPD files Student: Suraj Kulriya Mentors: Jai Luthra, Till Kamppeter, Dheeraj Yadav cups-filters: Convert filters to filter functions Student: Pratyush Ranjan Mentors: Till Kamppeter, Dheeraj Yadav cups-filters: Create a single, universal CUPS filter to replace the chain of individual filters Student: Pranshu Kharkwal Mentors: Till Kamppeter, Dheeraj Yadav GUI for listing and managing available IPP Print/Scan services (or DNS-SD-advertised network services in general) Student: Divyasheel Mentors: Till Kamppeter Firmware and other file handling in PAPPL Student: Bhavna Kosta Mentors: Jai Luthra, Till Kamppeter With our application for this year’s Google Season of Docs we did not get accepted. CUPS Snap in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse As reported in the April news I have worked out a security concept with the snapd developers to print from user application Snaps without allowing administrative access to CUPS. With this we can let developers upload applications to the Snap Store which automatically connect to the cups interface for printing, without the risk that such applications mess with CUPS. We have discussed the concept further on the snapcraft.io forum (this post and the following) to work out the details. Now only the finalization in snapd is needed. The final concept is here, only the paths for the CUPS socket needed to get adjusted. I have also presented my work on the CUPS Snap on the OpenPrinting Summit/PWG meeting. Features and fixes in the past month: The CUPS Snap is now based on Ubuntu Core 20 and not Core 18 any more. The Core20 base Snap did not support mDNS host name lookup. This got fixed now but the CUPS Snap also contains a workaround. Added libpaper support. Restricted the build architectures in the Snap Store to the actually supported ones: amd64, arm64, and armhf. Upgraded the built-in Ghostscript to 9.54. Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces Testing Turn classic CUPS drivers into Printer Applications Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap. Up to now, the CUPS Snap got installed from the Snap Store more than 1600 times! Note that it is still only on the Edge channel, there is not yet an \"official\" release. PostScript Printer Application in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse I have presented my work on the PostScript Printer Application on the OpenPrinting Summit/PWG meeting and Michael Sweet has also given a presentation about Printer Applications in general and PAPPL. Features and fixes in the past month: Following the CUPS Snap also switched to core20 and restricted build architectures also here. Also here added the workaround for mDNS host name lookup as I did for the CUPS Snap. Added checking of the user’s location via locale-related environment variables and based on this use A4 or Letter as default paper size when a new print queue is created, also posted appropriate feature request on PAPPL. Applied a patch for a PAPPL bug of changes of loaded media are not taken into account when printing. Updated the built-in QPDF to 10.3.1 and Ghostscript to 9.54. Some clean-up in snapcraft.yaml. Unfortunately, some things in the PostScript Printer Application are not working as expected due to bugs in PAPPL and/or in printer firmware: USB connection only uni-directional (This especially leads to polling option defaults and installable accessory configuration not working): This seems to be a problem (firmware bug) of my HP OfficeJet Pro 8730, for other printer models it is reported to work. When creating a print queue via command line, I cannot auto-select the driver (You cannot use -m auto when creating a print queue via command line): This works for USB-connected devices now, but for network devices a further fix is needed. For creation of GUI tools to easily find Printer Applications and set up printers we would need these improvements: Extend \"ps-printer-app drivers\" to also show supported device IDs Add subcommand to simply ask whether a given printer is supported With appropriate features added to PAPPL we will be able to also add the following: Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Once having these features implemented, the PostScript Printer Application is complete so far. Up to now, the PostScript Printer Application Snap got installed from the Snap Store more than 1000 times! Note that it is still only on the Edge channel, there is not yet an \"official\" release. Mopria has published the specifications of the eSCL scanning protocol! You can download it here. Principally it is the same as AirScan, the scanning part of Apple's AirPrint. As long as the hardware industry does not adopt IPP Scan, we can simply do our client/server scan architecture for Scanner Applications as snappable scanner drivers with eSCL. See our discussion thread on the OpenPrinting mailing list. Please subscribe here to participate in the discussion. sane-airscan got finally, two days before Final Freeze of Ubuntu Hirsute (21.04), accepted into the main part of the distribution and so it is now in default desktop installation. This will make the scanners in most modern multi-function printers, plus some stand-alone models (like Canon LIDE 300) work with Hirsute out-of-the-box. Currently released is 2.3.3op2. Michael Sweet presented his plans on CUPS 2.4.x and 3.x on the OpenPrinting Summit/PWG Meeting. CUPS 2.4.x is supposed to get shared printers reporting all required attributes/keys/values, OAuth 2.0/OpenID authentication, pkg-config support, snapcraft support, \"job-sheets-col\" and better \"media-col\" attribute support, TLS and X.509 improvements, and deprecate cups-config and Kerberos authentication. CUPS 3.x will be a major change in architecture, having the CUPS daemon split in two, a user daemon to handle local printing to USB printers and printers in the local network and a system daemon to share printers. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 17 months. Ubuntu Hirsute Hippo (21.04) comes with CUPS 2.3.3op2, the CUPS Snap and the PostScript Printer Application Snap use the current GIT master. Currently released is 1.28.8. I have also presented my work on cups-filters on the OpenPrinting Summit/PWG meeting. I have removed the duplicate PPD generator (for CUPS queues for driverless IPP printers) from libppd, keeping the one in libcupsfilters. In this one I have cleaned up the obtaining of human-readable strings, taking them from a PWF IPP standard repository which is included in the translation string files of CUPS. See the OpenPrinting mailing list thread about this. Currently I am working on improving the handling of color spaces and depths when printing to a driverless printer in Apple or PWG Raster foirmat. Formerly, the auto-generated PPD files of cups-filters provided choices in their \"ColorModel\" option to select color space and depth manually. To make the \"ColorModel\" option in the PPD mirror the \"print-color-mode\" IPP attribute and to make printing easier for the user I am switching to automatic selection. See this thread on the OpenPrinting mailing list and this thread on the Ghostscript developer mailing list. Update: First version, applied to ghostscript() filter function, posted (Details) Please subscribe to the OpenPrinting mailing list and/or to the Ghostscript mailing list to participate in the discussions. I have also merged Mohit Mohan's GSoC 2021 project of multi-threading support for cups-browsed and fixed several bugs in cups-browsed and the filters, many were fixed by GSoC student candidates as assignments. Ubuntu Hirsute Hippo (21.04) comes with cups-filters 1.28.8, also the CUPS Snap currently uses this version. The PostScript Printer Application Snap uses the current GIT master of cups-filters. Currently released is 1.0.3. Michael Sweet has given a presentation about Printer Applications in general and PAPPL on the OpenPrinting Summit/PWG meeting. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-May-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - May 2022",
+ "url": "/OpenPrinting-News-May-2022",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "Linux Application Summit 2022",
+ "OpenPrinting Micro-Conference on the Linux Plumbers 2022",
+ "GUADEC 2022",
+ "Google Summer of Code 2022",
+ "OpenPrinting Snaps and the Ubuntu Indaba with Mark Shuttleworth",
+ "CUPS Snap and snapd printing interface",
+ "Official Docker image of CUPS and Printer Applications",
+ "Approaching cups-filters 2.0",
+ "CUPS 3.x: Filtering and new D-Bus interface",
+ "ipp-usb: Printer does IPP-over-USB but not driverless IPP and driver vs. driverless",
+ "Contributions to Common Print Dialog Backends",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/CBPefa0Ckq8/hqdefault.jpg",
+ "snippet": "OP Summit/PWG Meeting, GUADEC, Linux Plumbers, GSoC 2022, \"cups\" snapd interface, CUPS in Docker, PPD-independent libcupsfilters 2.x, IPP-over-USB, HPLIP 3.22.4",
+ "content": "On May 17-19 we will have our annual meeting together with the PWG (Printer Working Group) again, the OpenPrinting Summit/PWG Meeting. Because of the Corona virus situation we will again have a virtual meeting, as in the last two years, with the side effect that everyone can participate, without needing to travel. Instructions for participation via WebEx are on the meeting’s page. The agenda is already put up, with the OpenPrinting part on the first two days. Links to the slides will be continuously added on the meeting page and we will link to any summary/outcome here in the next month’s news. I have been on this year's Linux Application Summit on April 29 and 30 in Rovereto, Italy, near the Lake Garda. The conference was successful. It was not only giving talks and listening to other people's talks but also the famous hallway tracks. Here I have, inspired by the critique on slow start-up of desktop application Snaps (Firefox and Chrome in Ubuntu 22.04 especially) and on the fact that there is only one Snap Store, especially discussed distribution-independent/sandboxed packaging, mainly with Heather Ellsworth and Robert McQueen, learning that the way to get OpenPrinting's original upstream CUPS and Printer Applications into image-based OS distributions is to make official Docker images from them. Such conversations are not recorded, unfortunately, but all the talks on the main stage (Auditorium) are recorded in two long YouTube videos, one per day: Friday, Saturday The BoFs did not get recorded. The descriptions of the two videos on YouTube contain a list of links to the beginnings of each of the talks. The links below are also links to the beginning of the talk in the two day's videos. Please see also our News Flash for more info about our talks. Links to the recordings Ubuntu 22.04 LTS (Jammy Jellyfish) Virtual Release Party OpenPrinting Talk about the New Architecture and what GUI/app developers need to know Getting Good: Gaming on Linux Snapcraft Secrets: The hidden power of desktop extensions Ubuntu Summit Announcement Thanks Thanks, Heather Ellsworth, for participating in the organization of the event and making me aware of it! Thanks, Ken VanDine for the original idea of the Ubuntu Summit announcement lightning talk. Thanks, Britt Yazel for MC-ing (Master of the Ceremony) the sessions in the Auditorium! Thanks, Heather Ellsworth, Monica Ayhens-Madon, Britt Yazel, Aniss, Kristi Progri, Dani, Caroline Henriksen for the great collaboration on the organization of the Ubuntu release parties. Thanks, Igor Ljubuncic for providing to me with the YouTube links, and especially with the time marks for each of our presentations! We got accepted for our forth Openprinting Micro-Conference on the Linux Plumbers Conference 2022 taking place from Monday September 12 to Wednesday September 14, 2022. Update: Linux Plumbers will be in-person again! Live on stage in Dublin!! It will be hybrid, so that speakers and attendees do not necessarily need to travel, but for micro-conference runners (Aveek Basu and me) they highly recommend to be there. And to everyone who wants to speak on or attend the OpenPrinting Micro-Conference, please consider to travel to Dublin. It is much easier to communicate, and much more fun!! The date of OpenPrinting’s turn is not yet determined, please keep an eye on the web site of Linux Plumbers. This year the GUADEC (GNOME developer conference) will take place on July 20-25 in Guadalajara in Mexico. But why do I write about this here on OpenPrinting? It will be my first time on The GUADEC! And then a GUADEC at such a nice place! I am not a GNOMie (GNOME developer, or am I getting one as I am managing the work on the GNOME Control Center Printing-and-Scanning module for the New Architecture?), but I want to help them to make printing from GNOME continue to \"just work\" with my talk about the New Architecture of printing and scanning. Here I will introduce the New Architecture and tell what is important for GNOME and GTK developers for applications with print functionality, print dialogs, and printer setup tools. I will also report the progress on the new Printing-and-Scanning module for the GNOME Control Center. Currently, we have to select the best contributor proposals of the many we received, find mentors for these proposed projects, assign the mentors who have stepped up, and then rank the proposals. After the deadline for that on May 12 (this Thursday) Google will assign slots to each mentoring organization and by this the proposals ranked highest will automatically be selected into the slots. There is no way for us to correct after receiving the slot count. Selected contributors/projects will be announced on May 20 (Friday next week). As in the other years we have loked for possible contributors already several months ago. We have let them done some exercises to learn about OpenPrinting, CUPS, cups-filters, driverless printing, ... let them also work on issue reports, mainly for cups-filters. Finally, they all have submitted proposals for GSoC projects. About the Ubuntu Desktop Team Indaba with Mark Shuttleworth I commented on the OMGUbuntu article about the Indaba that Mark did not mention that with Snap you can also package system-daemons and I made heavily use of it and with the Printer Applications one can distribute distro-independent hardware driver packages. On that I got an up-vote from Alan Pope, former Canonical employee who wants to move us to all-Flatpak!! On a Canonical-internal platform I commented the same and got a thumbs-up from Mark. And thanks, Heather Ellsworth and Monica Ayhens-Madon for this great Indaba! CUPS Snap in the Snap Store Finally! Everything for the new cups snapd interface is in place now. snapd 2.55.3 with the new interface and no show-stopping regressions in the stable channel of the Snap Store now and the CUPS Snap is appropriately updated for being used with this interface. For the launch of the interface I have posted a thread on snapcraft.io, describing how one uses the interface when making Snaps from user applications with print functionality and also how the interface actually works. Please see any updated details on how to use it there. Applications with print functionality can now be packaged in Snaps easily, by simply using the cups interface to allow the application to print. When such an application is downloaded from the Snap Store, the cups interface connects automatically. I have also posted a proposal for addition of how to use the cups interface to the snapcraft documentation on the \"doc\" forum on snapcraft.io. Graham Morrison is already on it. On the Linux Application Summit 2022 in Rovereto, Italy, I have, inspired by the critique on slow start-up of desktop application Snaps (Firefox and Chrome in Ubuntu 22.04 especially) and on the fact that there is only one Snap Store, discussed the methods of distribution-independent/sandboxed packaging, mainly with Heather Ellsworth and Robert McQueen. Especially knowing that from Snap, Flatpak, and AppImage (see also March and April News Posts) only Snap supports packaging system daemons, like CUPS, ipp-usb, and the Printer Applications. On systems (and for users/admins) who accept Snaps one can easily get the full printing system right from upstream, OpenPrinting, updated independently of the OS distribution, also after its release, and get support for new printers (and in the future also scanners) in a timely manner. Now let us go to Snap deniers, systems unsuitable for Snap (e. g. not systemd-based), or systems based on a minimal/immutable/atomic/image-based OS designed for applications being installed as Flatpaks. Here we are not able to provide straight-forwardly distribution-independent packages of CUPS, ipp-usb, and the Printer Applications. So printing is restricted to an OS-provided solution or even not possible at all. Robert McQueen suggested to publish an OCI-compatible container image of CUPS (and also images of the Printer Applications) on DockerHub, but official ones by OpenPrinting (there are many third-party ones. These could be run in said systems (including minimal/immutable/atomic OS) using a runtime like docker or podman. After the conference he sent me a longer e-mail about this idea and CCed it to the Flatpak mailing list. He suggested to use podman together with the systemd generator Quadlet for the CUPS daemon to start automatically on boot. This started a small discussion with further suggestions. Unfortunately, I did not find time to follow up on this yet, but will come back to this later. The next step in my preparation of the 2.0 release of cups-filters is the handling of cups-filters in environments which do not support PPD files, like CUPS 3.x and also in environments which support PPD files, like CUPS 2.5.x or older or driver-retro-fitting Printer Applications. First thought, when starting the development of cups-filters 2.x was conditional compilin, but this does not work out. How do we have a libcupsfilters without any PPD file support to use as distro package in a system with CUPS 3.x? But how still be able to install a (non-snapped, DEB package) retro-fitting Printer Application in such a system without needing to replace libcupsfilters by a differently built variant (is this possible in distros?) which supports PPDs, without needing a libcupsfilters generally supporting PPDs (and we all wanted to get rid of them)? So I thought out a design change in cups-filters: Currently the filter functions support PPDs, libcupsfilters depends on libppd, I will remove the PPD support from the filter functions, making libcupsfilters independent of PPDs and libppd, create wrapper filter functions in libppd overtaking the PPD support and calling the original filter function. So dependencies get reversed, libppd depends on libcupsfilters and libppd provides the PPD-supporting set of filter functions, libcupsfilters the PPD-free set, and that without code duplications. I started to do the restructuring with the cfFilterPDFToPDF() filter function (pdftopdf CUPS filter). Created a first wrapper filter function ppdFilterPDFToPDF() calling cfFilterPDFToPDF() with the latter not having PPD file support. I let the PPD file loader function directly translate the PPD file into printer IPP attributes for the call of the original filter function in libcupsfilters now and I have currently created a function to extract the requested paper size dimensions from job IPP attributes and options. Currently I am going through cfFilterPDFToPDF() to eliminate all direct PPD accesses and move them to the PPD loader/PPD-to-printer-IPP-attributes converter and to the wrapper filter function. This I will also do with all the other filters. There it should be less work then, as similar items are needed from the PPD. This will be the last major code change before the release. Once this done I will return to tidying up the code and finally release cups-filter 2.0b1. This way CUPS 3.x could use libcupsfilters without pulling any dependency of PPD file support. For Snaps and other types of sandboxed packages I will also add conditionals to libcupsfilters to skip building the support for unneeded data formats. In a future 2.x release, after 2.0 we will switch cfFilterPDFToPDF() from QPDF to Michael Sweet's PDFio. This way we will get rid of C++ as it causes binary compatibility problems from time to time. For doing this switchover PDFio need to provide all the feature which QPDF does, especially flattening of filled interactive PDF forms. When preparing the talk for the LAS 2022 in Italy I had another look on Michael Sweet's slides about CUPS 3.x from Linux Plumbers 2021. This made me think about the filtering/converting of print data formats in CUPS 3.x and also the D-Bus interface of the local CUPS server in relation to the D-Bus interface of the Common Print Dialog Backends (CPDB). So I started two threads on the OpenPrinting mailing list (not that you need to subscribe to the list to participate in the discussion): (Follow the \"Next Message\" links in each mail or get an overview of the full threads here.) CUPS 3.x: How we make it converting job data formats? This caused a longer discussion between Michael Sweet and me. Michael want to principally use the ipptransform tool (source) of (ippsample](https://istopwg.github.io/ippsample/). He tells that there are only a few formats to be converted. As input only PDF, plain text, JPEG, and PWG will be accepted and as output we need only the driverless standard formats PDF, Apple Raster, and PWG Raster. PCLM he considers as not needed despite there are some HP printers being driverless with PCLM-only. As PDF renderer he wants that there is Poppler support as with GPL2 this is the only renderer which can be shipped (at least as external executable, not linked in) together with CUPS 3.x code in commercial packages. with the AGPL of Ghostscript this is not possible. Ghostscript can be supported as alternative for OS distributions though (they all come with Ghostscript and this seems to be OK for Artifex). There will also be PDF pre-processing (similar to the pdftopdf CUPS filter, based on PDFio. It would be needed for watermarking and header/footer text but also flattening of filled interactive PDF forms. Even if cups-filters will not be used in CUPS 3.x I will continue on it as it is needed by CUPS 2.5.x and by Printer Applications. CUPS 3.x: Printing via D-Bus On the D-Bus interface which Mike Sweet mentioned to be in the local CUPS server of CUPS 3.x I was curious whether we could make the D-Bus interface of the Common Print Dialog Backends (CPDB) compatible with this one and so make the local CUPS server a CPDB backend by itself. Mike told that the D-Bus interface is more ample, continuing many IPP functions. So we will stay with different D-Bus interfaces for CPDB and CUPS 3.x. Recently, we got bug reports of users that their printers stopped working and it turned out that ipp-usb attached to them (because they support the 7/1/4 USB protocol of IPP-over-USB) but do not do driverless IPP printing. The IPP-over-USB standard requires that a printer and/or scanner supporting this USB protocol supports driverless IPP printing and/or driverless scanning (eSCL/AirScan, IPP Scan, WSD). The problem can be a firmware bug, either in the driverless print/scan support or that the 7/1/4 USB protocol is activated on a generally non-driverless device. The devices discovered up to now are the \"HP Laser\" (not \"LaserJet\") devices, printers re-branced from Samsung when HP acquired the printer division of Samsung. At least the HP Laser 107a and the HP Laser 135a are reported to have this problem. The printers seem to work via Wi-Fi though. Alexander Pevzner, author of ipp-usb, has immediately added the HP Laser 107a to the exclusion list (Issue #51) and I have suggested to add a feature to ipp-usb that if ipp-usb is not able to communicate with the device on start-up, to drop out immediately so that classic access will not get precluded (Issue #52). This also raised a discussion (mainly between Alexander Pevzner and Zdenek Dohnal) about whether the introduction of ipp-usb in Linux distributions should auto-migrate print queues with classic driver to driverless IPP-over-USB when ipp-usb supports the printer in question ((Issue #50). Here questions came up like migrating a working print queue with the risk that it will not work any more and also that a classic printer driver can have more features or higher output quality than the driverless approach. Also whether and how to ask the user was talked about. Wor on the Common Print Dialog Backends (CPDB) is continuing! I had posted a project idea for GSoC about adding this functionality to the print dialogs which are currently typically used: GTK, Qt, Chrome, ... and a contributor candidate, Gaurav Guleria (aka TinyTrebuchet) has already contributed to the cpdb-libs and CUPS CPDB backend projects: Add human-readable option/choice name support The original CPDB had only machine-readable option and choice names, making print dialogs only able to display standard options, like media size, media source, resolution, ... nicely. Now the human-readable names used by the print service (CUPS, ...) are made use of (Pull request #2, commit). Support for human-readable-choice-name and bug fixes In the CUPS CPDB backend added support for the options provided by CUPS/cups-filters (number-up, page-set, output-order, ...) which are available for any CUPS queue. Also provide human-readable names for these options and their choices and fixed some bugs (Pull request #8, replaces PR #7). Removed CUPS specific functions from frontend Removed some CUPS-specific functions from the frontend library, everything CUPS-specific should go into the CUPDS CPDB backend, the frontend part has to stay neutral (Pull request #3). Thanks, Gaurav Guleria, for your contributions. HPLIP 3.22.4 in all Printer Applications The HPLIP Printer Application (Snap Store) got another update of the underlying HPLIP version. It is now HPLIP 3.22.4. We continue using the Debian package sources to include more than 80 bug fixes not adopted upstream. Sorry again for the delayed updates due to this. It is always a lot of work for Debian printing package maintainer Thosten Alteholz to update the upstream source code and to adapt the patches where needed. Thanks a lot for this, Thorsten. The update adds explicit support for the new HP printer models which got released in the last two months. Note that most of those printers should also work as driverless IPP printers and therefore also work without the HPLIP Printer Application. Note that there are some former Samsung models re-branded after the acquisition of Samsung's printer division by HP (\"HP Laser\" not \"LaserJet\"). Note that they are not supported by HPLIP AFAIK and do not do driverless via USB (see above). It seems the only way to get them to work is driverless via network (Wi-Fi or Ethernet). The update worked out smoothly. If you have installed an HPLIP Printer Application version which still uses an older HPLIP and have the proprietary plugin installed, the plugin gets updated right after the installation of the new version of the Printer Application. Note that this can take some minutes and that during this time your printer will perhaps not work. After that, I have updated also the HPLIP used in the PostScript Printer Application (PostScript PPD files for HP printers, Snap Store) and in the Ghostscript Printer Application (HPIJS for non-HP PCL-5c/e lasers, Snap Store) to the Debian package source of HPLIP 3.22.4. In all the 4 Printer Applications (and also in the CUPS Snap) I have also fixed updated the included Ghostscript to version 9.56.1 and unlocked the state of the PAPPL to be used, returning to using the current GIT snapshot. This way all new features and fixes of PAPPL 1.2rc1 are included. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|4776| |ipp-usb|ipp-usb|2097| |ps-printer-app|PostScript Printer Application|2421| |ghostscript-printer-app|Ghostscript Printer Application|1334| |hplip-printer-app|HPLIP Printer Application|4511| |gutenprint-printer-app|Gutenprint Printer Application|3712| Currently released is 2.4.1. There will be further bug fix releases in the 2.4.x series. Some bug fixes were done, see changes below. Ubuntu Jammy Jellyfish (22.04 LTS) comes with 2.4.1. Ubuntu Kinetic Kudu (22.10 will most probably come with a later 2.4.x. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Currently released is 1.28.15. We are continuing to polish and to fix bugs for the 2.0.0 release. Currently I am restructuring to make libcupsfilters not supporting PPD files and not being dependent on libppd, to make it easily usable in PPD-free (CUPS 3.x or CUPS Snap) environments. For retro-fitting Printer Applications and other applications using PPD files, PPD-supporting wrapper filter functions, one for each filter function in libcupsfilters, will be added to libppd. See above for more details. The re-structuring and also a lot of other work (see everything here above) made me not doing any further bug fixes on cups-filters, so there is also nothing to backport to 1.x. Ubuntu Jammy Jellyfish (22.04 LTS) comes with cups-filters 1.28.15. Ubuntu Kinetic Kudu (22.10 will be the first Ubuntu coming with cups-filters 2.x. The CUPS Snap currently uses cups-filter's GIT master (2.x). The Printer Application Snaps also use the current GIT master of cups-filters. Currently released is 1.2rc1. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-May-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - May 2023",
+ "url": "/OpenPrinting-News-May-2023",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "Linux App Summit 2023",
+ "GUADEC 2023 in Riga",
+ "Ubuntu Summit 2023 in Riga",
+ "Google Summer of Code 2023",
+ "CUPS 3.x release postponed",
+ "Approaching final release of cups-filters 2.0.0",
+ "Test the GUI changes for the New Architecture",
+ "Common Print Dialog Backends getting into the dialogs",
+ "Handling reported security bugs with GitHub"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/3-_aUNZMvko/hqdefault.jpg",
+ "snippet": "OpenPrinting Summit/PWG Meeting 2023, LAS 2023 in Brno, GUADEC 2023 in Riga, Ubuntu Summit 2023 in Riga, GSoC 2023, CUPS 3.x only end-2024, Print GUI testing, CPDB in print dialogs, security bugs",
+ "content": "Update: Michael Sweet wins Google Open Source Peer Bonus for his CUPS project! Congratulations to him!! Lots of conferences during the last 4 weeks: the Linux App Summit 2023 in Brno, then home for a week and after that back to the Czech Republic for a week in Prague for Canonical's Engineering Sprint, another conference-free week again and this week we had our annual OpenPrinting Summit together with the Printer Working Group (PWG) again, but completely online, so no third trip within a month. Hot news from the OpenPrinting Summit, not so nice, by Michael Sweet, author of and maintainer of CUPS: He showed in his CUPS Plenary a nice roadmap for the CUPS 2.5.x releases, in contrary to our last micro-conference in the end of this year. So I have asked him what about CUPS 3.x and he told that he has pushed it out by one year, to end-2024 ... But nevertheless, we will all continue working on the New Architecture, the Printer and Scanner Applications, the Snaps, ... and I will switch Ubuntu 23.10, the Mantic Minotaur, as planned, to use the CUPS Snap as its printing system and the Printer Application Snaps as drivers for non-IPP-driverless printers. We have now configured our GitHub repositories to support private security bug reports and have made our experience with the first vulnerability reported this way, and together with the help of Canonical's Security Team we got the fix completed. I have written up my experience as a tutorial for free software projects using GitHub. And we will get a new team member: My colleague Amin Bandali, in the Ubuntu Desktop Team at Canonical responsable for the packaging of Firefox, got very interested in OpenPrinting. We talked a lot about it in hallway sessions on the Canonical Engineering Sprint, and he attended the whole OpenPrinting Summit and liked it a lot. He is interested in contributing the documentation for the libraries (libcupsfilters, libppd, libpappl-retrofit). Welcome on board! On May 16-18 we had our annual meeting together with the PWG (Printer Working Group) again, the OpenPrinting Summit/PWG Meeting. We presented and discussed our work of the last 12 months and what we plan to do next. Especially CUPS 2.5.x/3.x, use of OAuth with CUPS, cups-filters 2.x, Printer/Scanner Applications, Chrome OS, and the GSoC 2023 projects for the New Architecture were the main subjects of the meeting. Main news item of the meeting was the postponing of CUPS 3.x by a year. In contrary to the previous years we had no presentation from Artifex about Ghostscript and MuPDF. This is due to changes in the staff at Artifex after they got acquired by ePapyrus. I will try to obtain news about the future of Ghostscript from the new/remaining team and post here later. The time slot which got free by that I have made use of to report about cups-filters 2.x, filter functions, separating PPD file support into libppd, clean-up, release, ... in much more detail. A highlight was also the session about the Goggle Summer of Code with our contributors from 2022 presenting and demoing their work and praising me as their mentor. There will be written up summaries of the event in the coming weeks. I will post links to them in the June News. My second Linux App Summit 2023 has taken place in Brno in the Czech Republic, the city of the European Red Hat office. Recordings: Day 1, room 1, Day 2, room 1, Day 2, room 2. Direct links to all sessions are in the comments of the videos (thanks, Ban Jo @Enry211). Unfortunately, there are no recordings of room 2 on day 1. I have also added links to the recordings of all mentioned sessions in the April News On Friday morning I went by train from Vienna to Brno, a trip of only 2 hours, and so I already had lunch with my colleagues from Canonical and the Ubuntu community, Heather Ellsworth, Jeremy Bicha, Dennis Loose, Igor Ljubuncic, and Lucy Llewellyn. In the afternoon we also met Michal Kohutek, with whom we picked up the letters for the decoration of the release party (Ubuntu 23.04, Fedora 38, cups-filters 2.0). Then we all got to the pre-registration social event at Harry's Pivovar (brewery), where we met a lot of people, especially we met Jason Evangelho from Thunderbird (one of the sponsors of LAS) who was hanging out with us most of the time from then on and I also met Keywan Tonekaboni from the German c't computer magazine, who was very interested in my OpenPrinting work. Friday night and Saturday in the early morning in my hotel room I was chatting with Mohit Verma, GSoC contributor for the \"Printers\" module in the GNOME Control Center, and with Gaurav Guleria, GSoC contributor of Common Print Dialog Backends (CPDB) support in the print dialogs, via Telegram and I got some last bug fixes on the printing GUI code for my demo in the afternoon. Thanks a lot! On Saturday the conference started and keynote speaker Marcel Kolaja, member of the European Parlament, got Zdenek Dohnal's (Red Hat printing maintainer) and my help to get some papers for his talk (video) printed on the printer we had at the venue for my demo later that day. Also Jeremy Bicha asked me for some printouts later during the day. For the Canonical/Ubuntu Office Hours we decided spontaneously to not do an AMA (Ask Me Anything) at the booth, but instead, do a panel about Ubuntu and Canonical, similar to what we did last year. Heather Ellsworth, me, Dennis Loose, and Jeremy Bicha (seating order) talked about what is new in Ubuntu 23.04, and what we are working on, and to motivate people to work at Canonical, about how we got hired, how the hiring process is, and about how we work at the pioneer of work-from-home. There were not many attendees as it was at lunch time, but it is recorded, so that people can watch it (video). In the afternoon I met with Zdenek Dohnal and Marek Kasik (Upstream maintainer of GTK print dialog and \"Printers\" module in GNOME Control Center) about all things OpenPrinting and the Google Summer of Code. This was the first time I met Marek in-person. After that my talk and demo about the printing GUI, GNOME Control Center and also the Common Print Dialog Backends used in the GTK and Qt print dialogs has taken place. After some struggle with the projection from my laptop it all worked fine. the printer which Zdenek and Felipe have brought from the Red Hat office also worked. It was the last time slot of the day, right before the release party. So I started telling that we will have the release party for cups-filters 2.x after my talk, as the 2 distros, Ubuntu 23.04 and Fedora 38 are the first 2 with the new version of cups-filters. I explained the New Architecture and its GUI requirements and then demoed the GNOME Control Center and the print dialogs (video, slides). The day's program ended with the release party, officially for Ubuntu 23.04 and Fedora 38, both being the 38th releaso of each distro, but it was also the release party for cups-filters 2.x, as the 2 distros are the first ones using the new generation of cups-filters. There was a cake, one half with blue icing for Fedora and the other half with orange icing for Ubuntu, and the first cut was done together by Jiri Eischmann from Red Hat representing Fedora and Heather Ellsworth from Canonical representing Ubuntu. On Sunday I got interviewed by Keywan Tonekaboni from the German c't computer magazine. He wanted to know everything about my OpenPrinting work. It took 40 min, one time slot of talks, and afterwards I also sent him a longer e-mail with links to write-ups, News Posts, and conference videos. The main intention is an article about OpenPrinting in the magazine, but as Keywan has attended the conference, there is also a small news article (in German) about the LAS, also mentioning my OpenPrinting work in one paragraph. Some further interesting talks to mention: \"What’s next for the Linux App Ecosystem?\", Panel Discussion by Sriram Ramkrishna with Jason Evangelho (Thunderbird), Lubos Kocman (SUSE), Aleix Pol (KDE), Heather Ellsworth (Ubuntu/Canonical), Robert McQueen (GNOME), Felipe Borges (Fedora) \"Free & Open Source Software: Software Design For The Environment\" by Joseph P. De Veaugh-Geiss (KDE) \"GNOME Mobile Show & Tell\" by Jonas Dreßler (GNOME), Robert Mader (Collabora), and Tobias Bernard (GNOME) \"Snap performance optimization - The Firefox case study\" by Igor Ljubuncic (Canonical/Ubuntu) \"UnifiedPush - Push notifications for Linux\" by Volker Krause (KDE) \"Game development on Linux\" by Jesús Soto (Canonical/Ubuntu) \"We can’t spell BUGs without U\" by Heather Ellsworth (Canonical/Ubuntu) See also Mastodon, hash tags #LAS2023, #LinuxAppSummit, and #OpenPrinting. Update: Extra call for proposals (ends June 12) for BoFs and Workshops! Seems that they got an extra room for the weekend. GUADEC in Riga, Latvia, is approaching! Now the talks, workshops, and BoFs are selected and the schedules are available and my 2 proposals got accepted! The New Printing GUIs: GNOME Control Center and Common Print Dialog Backends Wed, July 26, 10:00 EEST, room 2 So right on the first day I will talk about the state of the art of the printing GUIs for the New Architecture, the \"Printers\" part of the GNOME Control Center and the Common Print Dialog Backends (CPDB) support in the print dialogs and will also demo the GUIs. Your app everywhere, just in a Snap! (Workshop) Sat, July 29, 12:30 EEST, room 2 This GUADEC will get snappy! In this 2-hour interactive workshop you will learn how to snap (= package as a Snap) your favourite applications! You will snap a simple GNOME application on your own laptop and after that we (me and Jesús Soto) will also help you to snap your applications. So if you have some free software application project and want to make it easily avcailable for your users, without them needing to compile, and without the goodwill of the maintainers of their distro, Snap is the right solution. This is distribution-independent, secure, and easy-to-use packaging, like on smartphones. More about Snap: The Powers, The People Note: Unfortunately, Heather Ellsworth is not able to attend GUADEC this year. Therefore Jesús Soto, also from the Canonical Desktop Team, replaces her as my co-speaker. I have already asked the organizers for updating the announcement of the workshop. Canonical/Ubuntu And as usual, I come with my colleagues, this time the Canonical Gang consists of Jeremy Bicha, Jesús Soto, Marco Trevisan, Mauro Gaspari, and me. There will be an orange Ubuntu booth again, as last year, a nice point to find us and to start interesting hallway sessions (Developers, not marketing people). And, in addition to my two sessions mentioned above, you will see my colleagues in these sessions: How GNOME Gets into Ubuntu by Jeremy Bicha Wed, July 26, 13:50 EEST, room 1 Jeremy's description: GNOME produces two major releases every year. Ubuntu also has two releases every year. In this talk, a longtime Ubuntu Desktop team member will discuss how GNOME features and bugfixes get into Ubuntu. Release Team BoF Sat, July 29, 12:30 EEST, room 1 This is a meeting of the GNOME Release Team, where Jeremy Bicha is member of. The site for the Ubuntu Summit 2023 is up! And it will take place in Riga, Latvia! Riga? Did we not have it already? Yes, the GUADEC will take place there, too, see above. So me and my colleagues from Canonical who attend GUADEC will visit Riga twice, experiencing it once in Summer and the second time in fall. And we will hopefully find some nice restaurants and bars to recommend to the rest of Canonical ... It will take place on the weekend between the two internal meetings of Canonical, the Roadmap/Product Sprint in the week before and the Engineering Sprint in the week after, so that Canonical employees having to attend the two Sprints are not away from their families for more than 2 weeks and many Canonical employees have no excuse to not be on the Summit ... So it takes place on Fri, Nov 3, 2PM EET to Sun, Nov 5, 6PM EET If you have something awesome to present on the Ubuntu Summit, please submit your abstract. The Call for Proposals (Update) opens on June 5 and ends on July 2. I will be in the organization team again and I am eager to see your submissions. Some weeks ago, Google has announced the slot counts assigned to each of the mentoring organizations and the accepted projects. Unfortunately, the Linux Foundation got only 12 slots for their 24 ranked proposals. This means that for OpenPrinting 6 of 10 ranked proposals got accepted. The accepted proposals for OpenPrinting are the following: OpenPrinting: CPDB support for application's print dialogs: Firefox, Chromium, LibreOffice Contributor: Kushagra Sharma Mentors: Till Kamppeter, Gaurav Guleria, Shivam Mishra, Rithvik Patibandla, Ira McDonald See below and also test it! Sand-Boxed Scanner Application Framework Contributor: Akarshan Kapoor Mentors: Till Kamppeter, Rishabh Maheshwari, Deepak Patankar, Ira McDonald GNOME Control Center: List and handle IPP print services for the New Architecture Contributor: Mohit Verma Mentors: Till Kamppeter, Marek Kašík, Zdenek Dohnal, Rithvik Patibandla, Ira McDonald Test it! Continuous Integration: Test Programs for libcupsfilters, libpappl-retrofit, libppd, CPDB, CPDB Libs Contributor: Pratyush Ranjan Mentors: Till Kamppeter, Deepak Patankar, Zdenek Dohnal, Ira McDonald Adding support for the new functionality of IPP Everywhere 2.x to libcupsfilters and CPDB Contributor: Gayatri Kapse Mentors: Till Kamppeter, Rishabh Maheshwari, Zdenek Dohnal, Ira McDonald Native gutenprint Printer Application Contributor: Yuvraj Aseri Mentors: Till Kamppeter, Solomon Peachy, Rishabh Maheshwari, Chandresh Soni, Ira McDonald Some of the other candidates already told that they want to participate in OpenPrinting voluntarily, like for example fixing bugs. Our contributors already have started their work on their projects and provided short write-ups about what they have done in the recent weeks: Kushagra Sharma (CPDB support for Mozilla, Chromium, LibreOffice, see below and also test it!): Made a feature request for Chromium, Mozilla and LibreOffice for CPDB support.collaboration started with chromium dev team of CPDB support. Completed design documentation for better understanding of CPDB for upstream developers. In upcoming week I will be working with CPDB team at OpenPrinting to start the coding process to whichever development team agrees for adding CPDB support to existing print dialog. Akarshan Kapoor (Scanning with PAPPL): The very first task that I had to implement was regex parsing for scan jobs following the eSCL Protocol in the C language. The challenge? Unlike C++ or Python, C does not come equipped with built-in regex parsing libraries. However, I have managed to surmount this challenge at a file-independent level. (The merge with the local code base is still pending.) The eSCL Protocol, or the network scanning protocol, forms an integral part of scanning functionality. It utilizes HTTP and XML for communication between devices, thereby making it a vital feature for transmitting both scan jobs/requests and scan features. In the context of regex parsing, it was essential to comprehend and process XML responses effectively. To do this, I delved into the different XML responses outlined in the MOPRIA Scan Specifications. These specifications define the format of requests to be text/xml and interact with the appended directory functionality. This posed an intriguing challenge, and I'm eagerly anticipating tackling more of these during my Summer of Code with Google and with OpenPrinting. Mohit Verma (GNOME Control Center \"Printers\", test it!): I am working on the project of \"List and handle IPP print services for the New Architecture\". I have completed the work of listing _ipps-system._tcp, _ipp-system._tcp, _ipps._tcp & _ipp._tcp print services and currently working on grouping the services together & making the entire process for finding and listing print services asynchronous. I am working with TIll extensively and he keeps on providing me valuable insights about my work by checking out my G-C-C build whenever required. Gayatri Kapse (IPP Everywhere 2.0 support): I have figured out what \"functionality implementation I have to do in libcupsfilters and user interface enhancement in CPDB. In libcupsfilters, I will incorporate the new attributes and their functionality specified in IPP Everywhere 2.0, ensuring seamless interaction with printers. For CPDB, I will enhance the user interface to support and display the new attributes, creating an intuitive printing experience.\" Currently I am going through the ipp-support in cups and then after figuring out where to code, I will start writing the logic and start testing it. Yuvraj Aseri (Gutenprint Printer Application): I am working on native gutenprint printer application, Gutenprint is a package of high quality printer drivers for Linux, BSD, Solaris, Macintosh OS X, IRIX, and other UNIX-alike operating systems. I have completed the framework of printer application. I have gone through codebase of libgutenprint to add functionalities in the applications. Currently I am reading the source codebase of pappl-retrofit to understand how to integrate the libgutenprint into printer application. As every year, CUPS author Michael Sweet has presented his CUPS Plenary on the OpenPrinting Summit/PWG meeting. When I browsed through the slides before the actual presentation I already saw that the releases of CUPS 2.5.x were scheduled at the end of this year (page 8) and there were no release schedules at all for CUPS 3.x (page 11+). So I asked Mike about the CUPS 3.x release while he was giving his talk and he confirmed that the CUPS 3.x release is indeed pushed out by a year, meaning that the release will be end-2024. This especially also means that Ubuntu 24.04 LTS will come with CUPS 2.5.x instead of 3.x. But as we will switch from the Debian packages of CUPS to the CUPS Snap already in Ubuntu 23.10 anyway, the New Architecture will already be reality in 24.04 LTS. So we are still heavily working on the New Architecture! And when CUPS 3.x will finally make it into the distributions, the Printer Applications as replacement for the classic CUPS printer drivers will be well established so that we get a smooth transition into the new CUPS. Also we will be starting already to test the new libcups 3.x in the Printer Applications. they do not need anything from libcups which is removed from version 3.x, especially as the retro-fitting Printer Applications are using libppd. Now having the new cups-filters in the first 2 distros, Ubuntu 23.04 and Fedora 38, first bug reports started to appear: All PDFs when printed come out mirror image (Ubuntu bug #2018538) I asked for the queue's PPD file from the people who observed the bug but did not yet get an answer. cups-browsed is using an excessive amount of CPU (Ubuntu bug #2018504) I am not able to reproduce it by myself, but I got debug logs from one of the people suffering this bug. Need to investigate. Brother DCP-J125 not printing after update to cups-filer 2.0b3 & 2.0rc1 (libppd issue #20) Here I already did deeper investigations. It occurs for PPD files which require the print data to be turned into PostScript, either for a PostScript printer or for a proprietary printer driver (here from Brother) and if the printer stacks up the printed sheets face-up and therefore needs the jobs printed in reverse order. In this case the ppdFilterPSToPS() filter function is actually not outputting any print data due to a wrong function being used for the output. This was most probably introduced with the conversion of the pstops CUPS filter to the ppdFilterPSToPS() filter function. At too many places the regular puts()/printf() got replaced by doc_puts()/doc_printf() where actually just a fputs()/fprintf() to outputfd had been needed. PDFtoraster - Printout of image files (.JPEG, .PNG) are not properly aligned and cropped (cups-filters issue #529) Not yet started the investigations. I will try to fix these bugs before the final release, at least if I get enough cooperations by the reporters and who else claimed to have observed the bug. I will also update all the Snaps, the CUPS Snap and the Printer Application Snaps, to use the new cups-filters components and check whether they are still working correctly. If all this works well and any occuring bugs are fixed I will do the final release. After the release of 2.0rc1 some newly discovered bugs got already fixed: In libcupsfilters the filter function cfFilterPDFToPDF() failed to correctly flatten filled interactive PDF forms in some files, losing the entered data (Issue #28). With the flattening actually done by QPDF I asked Jay Berkenbilt, maintainer of QPDF, for help and he pointed me to QPDF issue #949 where the same problem was reported. Jay fixed the bug and released QPDF 11.4.0, which I tested and this indeed fixed the bug. So I updated the documentation appropriately. In cups-filters we got our first private security bug report. It was that the (very rarely used) beh backend, a wrapper backend to handle errors of the actual backend, called the actual backend with the system() function. And this function takes a command line as a single string and not the arguments as separate strings, so it is easy to inject arbitrary commands by a forged job title. This is fixed and published now and with this I learned how to handle security vulnerabilities as upstream organization. I also added some missing #include lines in the backend/parallel.c file of cups-filters. I discovered this when I prepared libcupsfilters for libcups3 support cleaning up some things in it. And in cups-browsed we have first switched to pkg-config from the deprecated cups-config and second, fixed a glitch in the build system (Issue #12). Central part of the OpenPrinting work in this year's GSoC is to make the printing-related GUIs working with the New Architecture. Mohit Verma is adding support for IPP print destinations and Printer Applications to the \"Printers\" module of the GNOME Control Center, while Gaurav Guleria has added CPDB support to the GTK print dialog and is adding it also to the Qt one. And Kushagra Sharma is adding CPDB support to application-specific print dialogs, for Firefox, Thunderbird, Chromium Browser, and LibreOffice. This code needs testing, not only by the mentors of the GSoC contributors, but by as many people as possible, and so that everyone can easily install the packages with the modifications for supporting the New Architecture, I have created a PPA (Personal Package Archive) with all the modified packages for Ubuntu 23.04 (Lunar Lobster) on the x86_64, arm64, and armhf architectures (most PCs, laptops, mobile devices, and single-board computers, like Raspberry Pi). So one can simply include the PPA in one's system as described and install the packages. This PPA will get updated frequently, so come back at any time and see the progress. In addition, the PPA helps to demo the development on conferences (see my talks on LAS 2023 and GUADEC 2023 above, slides) and I will also use it to present the work to Canonical's design team, so that they can try it out and optimize the UI design of the \"Printers\" module of GNOME Control Center. GNOME Control Center The test version of the \"Printers\" module of the GNOME Control Center (package gnome-control-center in the PPA) currently only covers the main view, the list of available print destinations, not the Printer Application support in the \"Add Printer\" dialog. In the main view you will see: All available IPP print services/destinations Network printers IPP-over-USB printers Printer Applications Permanent CUPS queues, created manually or created automatically by plugging a (classic) USB printer or by cups-browsed If an IPP device (most likely a Printer Application) has more than one print destination, the destinations are listed together. So you will see all print destinations where you can print to with CUPS, both classic CUPS queues and IPP destinations for which CUPS creates a temporary queue when printing to them. The menu opening when clicking the button to configure an entry differs whether we have a classic CUPS queue or an IPP destination. For the former you will have, as before, the possibilities to set default option settings, remove the queue, ..., but for the latter you will simply only have the possibility to enter the destination's web admin interface, as there is no local CUPS queue to configure, but you can configure the service by its web interface. Common Print Dialog Backends The Common Print Dialog Backends (CPDB) you can test on the standard print dialogs of GTK and Qt 6.x. The packages to install from the PPA are gtk4 and qt6-base resp. In addition, you also need to install cpdb-backend-cups and cpdb-backend-file. The components of cpdb-libs should get installed automatically. Most GNOME or GTK applications, like gnome-text-editor, use the standard GTK print dialog. So simply print from them (Ctrl + P) and you are testing the CPDB-based print dialog. For Qt, unfortunately, most applications available for Ubuntu 23.04 use Qt 5.x, and the CPDB support is only available on our test version of Qt 6.x. So you need to find applications using Qt 6.x by the following command: For example you could install focuswriter for the test. Do not be disappointed that the GUI of the print dialog is not cute, we did not change it for adding the CPDB support and it is the original from when CUPS support was introduced to Qt ~20 years ago. Note also that some applications, as far as I know currently, Firefox, Thunderbird, Chromium Browser, and LibreOffice have their own print dialogs. As long as these do not appear in my PPA, you should use the standard GTK print dialog by clicking the appropriate link or button inside the print dialogs of these applications. Also note that desktop applications installed as Snaps or Flatpaks do not use your system's libraries, especially not the GTK and Qt you have installed from my PPA, but on the other side they often use a print dialog provided by the running desktop environment instead of their own print dialogs, so that if you are running Ubuntu's standard GNOME (or another GTK-based desktop) and you get the standard GTK print dialog when you print from your application, you most probably have the CPDB-enabled one from my PPA. Test example Here is a step-by-step HOWTO to test the new GUIs: Stop cups-browsed (to not get permanent CUPS queues generated for each IPP print destination): Include the PPA in your package installation sources: Install the packages (and focuswriter as Qt 6.x example): For being able to test even without having a printer at hand, install cups-ipp-utils: and run the IPP printer emulator ippeveprinter: This emulates a color IPP printer with duplex capability which understands jobs in Apple Raster (URF) and PDF. Printing to it makes the input file being dropped in the /tmp directory, without any conversion (original URF or PDF file). DNS-SD service name is testprinter. Create a classic CUPS queue via If you have a printer, make it available in your local network and/or connect it via USB. If your printer is not a driverless IPP printer (or a driverless printer which can also be used the classic way, like PostScript for example), install the appropriate Printer Application: Open the web interface of the Printer Application (http://localhost:8000/) either using a web browser directly or finding the Printer Application in the destination list of the \"Printers\" module of GNOME Control Center, clicking its configure button (with a gear icon), and choosing \"Web Interface\" (see also below). Create a print queue using the \"Add Printer\" button in the web interface (under \"Printers\", top-right. Now run or, if you are using GNOME as your desktop, start it by clicking the gear button in the quick settings panel which you get when clicking the upper-right corner of your screen. Choose the \"Printers\" entry in the list on the left. In the main area you see a list of the print destinations now. At least you should have the testprinter which you have created with ippeveprinter and testclassic which you have created with lpadmin. If you are so lucky that you have a printer at hand, you will see more entries, especially the print queues which you had created before starting this test and also entries coming directly from the printer itself (if it is a driverless IPP printer) or from the Printer Application you have installed and set up. For the Printer Applications you do not only get an entry for each of your configured print destinations within it, but one extra entry for the Printer Application itself. This allows to see its presence and access its web interface already before adding the first printer to it, especially to do just this. You can try this also by installing a Printer Application even without having an appropriate printer. Now each destination has a button with a gear on it. This is the configure button. Click it, and you will see one of two types of a menu, either with four or five entries, like \"Printer Options\", \"Remove Printer\", ..., or with only one entry, \"Web Interface\". If you get the former, you have a classic CUPS queue, which as before, you configure locally using the functionality of GNOME Control Center. In case of the latter you have an IPP print service. There is no local configuration for it, but it has a web admin interface. Click on \"Web Interface\" to open it in your browser. There is nothing new on how to configure classic CUPS queues, so I will not elaborate on that here. In case of the web interfaces, a web interface is required by the IPP standards, therefore you even get one for ippeveprinter, not a very useful one, but there is one. By the web interfaces you see where the print destinations come from, you know the manufacturer's interfaces of network printers, and Printer Applications show the one of PAPPL (example HPLIP). And if you see the web interface of a network printer and the URL is http://localhost:60000/, then it is IPP-over-USB, you have connected a driverless IPP printer via USB. Note that there are still some glitches, especially GNOME Control Center gets blocked while creating the print destination list or groups of destinations from a Printer Application are not clearly marked, lead entries of Printer Applications are not marked as such, no fax-out queues listed, ... Now open applications and trigger their print functionality (Ctrl + P). The print dialog pops up. If it is a standard GTK print dialog you should see all print destinations which you have seen in GNOME Control Center. In case of a Qt print dialog, only if the application is using Qt 6.x. Run for example Select printers, set options, print ... This all should work. Note that options can be different between IPP services and classic CUPS queues for the same printer. If you print on testprinter grab your \"printouts\" in the /tmp directory. Opening the print dialogs must have started the CPDB backends. Run and you will see entries for each backend in the /usr/lib/*/print-backends/ directory. Kushagra Sharma got now accepted as GSoC contributor with his project of adding CPDB support to several application's print dialogs. He gets mentored by Gaurav Guleria and me and he has already started working on his project. I have found for him the places and people in the upstream organizations of Mozilla (Firefox/Thunderbird), Chromium, and LibreOffice, to propose the switch of the print dialog from direct CUPS support to CPDB. Currently, we have reached out with the following activities: I posted a Feature request for Mozilla already some weeks ago. First discussion has started. I posted on the mailing list for LibreOffice, after some IRC chat on #libreoffice-dev on Libera.Chat. I am in contact with Piotr Pawliczek and Benjamin Gordon from the Chromium Paper I/O team and, after getting an appropriate hint via the developer Google group, Kushagra has created a design document and posted a feature request for the CPDB support on Chromium's print dialog. Benjamin is aware of the feature request. Kushagra is currently studying the code of the print dialogs and also finding the best agreements with with the upstream developers on how to implement the CPDB support. a very important maintenance task for free-software organizations is to handle reports of security vulnerabilities. Generally all the development of a free software project is public. Changes, independent whether for new features or to fix bugs, are committed into public code repositories. And all the work towards them is discussed on public platformas, mailing lists, discussion forums, conferences. Reporting a security vulnerability on a public bug tracker is counter-productive though, as not only the developers supposed to fix the bug but also potential attackers can read them and get aware of the bug before it gets fixed and updates made available for all major OS distributions. So we get here into a situation where also free software developers have to keep something confidential. To avoid potential attackers to get aware of a security flaw, such bugs need to get reported in private and their publication be embargoed until the bug is fixed and the package maintainers of the distributions having gotten a reasonable period of time to apply the fix to their packages. This is the common practice between the upstream free software projects and the downstream OS distributions. Therefore most bug tracking systems ask the reporter of a bug whether it is a security issue, or whether the bug should be reported publicly or in private. We at OpenPrinting, and also many other free software organizations and individual developers, use GitHub as platform to host the code repositories and track our bugs. Unfortunately, in GitHub, if you start a new repository or a new organization, private bug reporting is not available by default. It is supported though, but it is not intuitive how to activate it and how to tell who of the organization should have access. Also it is no obvious how to make the OS distribution's maintainers or security teams aware of a received security bug report. This makes many developers just fix the bug and commit the fix ... I discovered some weeks ago, when I reported a (regular) bug on PAPPL, that when clicking the button to report a new issue, that an extra page appeared where I can choose whether my issue is a regular bug, a feature request, or a security vulnerability. Such a page did not appear when reporting a bug on any OpenPrinting reporsitory. So I investigated what is different, and found out that private security bug reports must be activated under the security settings and bug report templates to generate selection page for the report type must be created. I also told Mark Esler of Canonical's Security Team about that and he was very happy about having learned about this, as Canonical is using GitHub heavily, too. Once done so, I quickly received the first security issue. It was easy to fix the actual bug, and one could also request a CVE number easily by a simple click in GitHubs interface for private security bugs, but then I ran into the problem on how to inform all relevant OS distributions about this report. It came the time of the Canonical Engineering Sprint in Prague where all the engineers of Canonical (~700) meet in a huge hotel for a week, including the Security Team. So I took the opportunity and scheduled a meeting with the Security Team in their room, exactly with Mark Esler, Marc Deslauriers, and Seth Arnold. They gave me a 25-min HOWTO on how to proceed, posting the report and the patch on the appropriate mailing list where all the responsible persons of the distributiins are subscribed and setting the publication date/end of the embargo and at the end of the embargo, regardless whether all the distros have actually done the update, publish the report by committing/merging the fix and posting on a public list specialized for that. I suggested them to give a workshop or at least a 50-min talk on the upcoming Ubuntu Summit, to help the several upstream application developers who attend the conference. Mark told that it took him only 25 min to explain that to me, but then I told him that his explanation was a HOWTO for an experienced upstream developer/organization lead and downstream packager, but on the conference we need a tutorial for less experienced application developers ... And now the last challenge was to manage who in our OpenPrinting team will be able to access the security bug reports, without making all of them owners of the organization in GitHub. But this I found out rather quickly. One has to create a team in the GitHub organization and make it the security manager. Mark Esler has also reported the problem of needing to create templates for getting a button to report a security issue to GitHub and that got fixed, so now one only needs to activate private bug reports in the settings. And, on the day after my meeting with the security team on the Sprint, he gave a lightning talk about all this and mentioned me giving him the hint about security bug reporting support in GitHub. So what you have to do is the following: Activate security bug reports for a whole organization or account By default, private vulnerability reporting is not active at all. This makes your users hesitating to report security vulnerabilities or reporting them publicly, like regular bugs, and it also makes developers just committing the fixes of such bugs. At a rather hidden place in your account's (or your organization's) GitHub settings you can activate private bug reporting. We recommend to activate it to your whole account/organization and get it activated by default for new repositories in it. This way you avoid that any repository stays without coverage. In the following URLs replace XXX by your organization's (would be OpenPrinting for me) or your user name (tillkamppeter for me), depending on where you want to apply the changes. Go to your organization's/account's start page: and then click \"Settings\" near the top, to get onto the settings panel of your organization/account: Then click \"Code security and analysis\" under \"Security\" on the left: Under \"Private vulnerability reporting\" check \"Automatically enable for new public repositories\" to make sure all repositories added in the future accept security bug reports, and click \"Enable All\" to enable this functionality on all already existing repositories. Activate security bug reports for a single repository If you are maintaining a repository in an organization where you have no appropriate administrator rights for, or if you do not want to accept security bugs on all your repositories, you can activate them also only for a single repository. Please replace also YYY by the name of the repository, for example cpdb-libs. Go to your repository's start page: and then click \"Settings\" near the top, to get onto the settings panel of your repository: Then click \"Code security and analysis\" under \"Security\" on the left: Now click \"Enable\" for \"Private vulnerability reporting\" and then \"Save changes\" at the bottom of the page. Ready for receiving private security vulnerability reports Now, when a user wants to report a new issue, clicking on the \"New Issue\" button on your repository's issues page they get asked whether the issue should be a regular, public bug report or a private security vulnerability report. Note that owners of the repository do not get asked this, but there is an alternative way to start a security bug report, clicking \"Security\" at the top of the start page of a repository, landing at and then clicking \"Advisories\" under \"Reporting\" on the left, getting onto On this page there is a button \"New draft security advisory\". Click it to start a new private security bug report. If you have activated private bug reporting for your whole organization or account, this is valid for all your repositories. Allow access to everyone who needs it Security bug reports mentioned above are only accessible to the owners of your organization. This is most probably not everyone in your developer team who should have access, for example as they would be the right persons to fix these bugs. So you have to define the security managers for your organization. Go to the organization's start page again: and click \"Teams\" near the top: Create a team and add all the people who need to access the security bug reports of your organization. These are the core developers of your organization, but also could be the security people of the major OS distributions, ... You can add/invite more people at any time later. Now go back to the start page and click \"Settings\" and then \"Code security and analysis\" again. Scroll down to find \"Security managers\". Enter the name of your newly created team into the search bar and add the team. Now the members can do everything in the security bug reports, commenting, proposing patches, ... Handling a security vulnerability report Once having done all the setup, you will sooner or later get your first vulnerability report, probably the sooner, the more your project is an essential part of the operating system. You find all your vulnerability reports to each repository when you click \"Security\" at the top of the start page and then \"Advisories\" under \"Reporting\" on the left: It is expected that you do the whole procedure within three months after the original report. First, check if your organization's security team is under the \"Collaborators\". If not, add it. Enter its name into the search line and confirm its addition. Fix the bug, but do not commit the fix to the regular, public repository. If you need more info from the reporter, especially if they have not supplied steps to reproduce the bug, ask via comments on the report. Do not discuss the bug on public mailing lists or forums. You can also discuss the bug with your security team colleagues by means of comments in the private bug report. If the report is done by someone external to your organization, there will appear a section \"Accept vulnerability report\" near the bottom of the report. If you, perhaps after some first investigations and discussion in your team, believe that it is actually a security problem, click \"Accept and open as draft\" to accept the report. If you have accepted and fixed it, use the appropriate button in the security bug report to let GitHub request a CVE (Common Vulnerabilities and Exposures) number for you. With this the bug gets registered in the central CVE database. Once having gotten the CVE number go to \"Collaborate on a patch in private\" near the bottom of the bug report and click \"Start a temporary private fork\" to get a private fork of your repository. Follow the instructions under the then appearing \"Collaborate on a patch\" to clone the private fork of your repository. Apply your fix to your local copy of the fork, then commit and push it. Make sure to include the CVE number in the first line of the commit message, for example The title after the CVE number could be the title of the bug report, or a one-line description of the fix. Add more lines to explain your fix. \"git push\" your commit. Now you can discuss the fix with your team colleagues and with the original reporter, and they all can also clone the private fork to test the fix and/or apply additional changes. Once done the first push into the private fork, in the bug report there appears a button \"Compare & Pull Request\". Click this button to get a private pull request attached to the bug report. Next step is to inform the responsible people of the major OS distributions, usually package maintainers and security teams, about the bug and the fix and give them a time period of around 1 to 2 weeks to provide updates with the fix for their distributions. Only after this time period (the embargo) expires, you publish the bug report and the fix. For this there is a non-public mailing list with the right persons subscribed to it. So you do not need to know all these people to either mail to them individually or add them to your organization's security team. The e-mail address of the list is distros@vs.openwall.org (or linux-distros@vs.openwall.org if the bug is Linux-specific). Please respect the list's policy. The email subject must start with the four characters [vs] to bypass their weird anti-spam filtering measures. The subject should also contain the CVE number and a one-line description of the bug. The mail body should contain a description of the bug, instructions to reproduce or exploit, if available, a link to the bug report (not yet working for most of the readers), the planned date for the publication, and the patch to fix the bug should be attached to the e-mail. Simply copy and paste the appropriate text content from the bug report. For the publication date the maximum is 14 days from the date of sending the mail, 7-10 days are preferable. Make sure that at that date a team member is available to do the publication. On the day of publication, first merge the private pull request, so that the fix gets committed to your public repository. If you want, spin a release of your repository now. Then click the button at the bottom of your bug report to publish the report. Now everyone can access it. The link to the report which you have put into your e-mail will work for everyone from now on. Send another e-mail, now, to the public list oss-security@lists.openwall.com, with the same subject and body as your first e-mail, no attached patch required any more if you instead add a link to the appropriate commit (the one from merging the private pull request) in your public repository. You always publish a security bug on the publication day you have chosen in your first e-mail, regardless of whether all distributions provide updates in time. This way you do not make the publication dependent on a distribution not doing their duty and do not get stressed on that distributions do not provide their updates. It is in the full responsibility of each distribution not to be covered on the day of publication. Now you are done with the security bug. This is at least what I did on our first security report. Thanks a lot to Mark Esler, Marc Deslauriers, and Seth Arnold from Canonical's Security Team for guiding me through handling security bug reports as upstream organization and for reporting to GitHub the need of creating templates to make security bug reporting possible in the regular issue reporting process. And thanks to the GitHub folks to quickly fix this."
+ },
+ {
+ "id": "post:OpenPrinting-News-May-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - May 2024",
+ "url": "/OpenPrinting-News-May-2024",
+ "headings": [
+ "OpenPrinting Summit/PWG Meeting",
+ "GUADEC 2024 in Denver",
+ "aKademy 2024",
+ "UbuCon Asia 2024 in India",
+ "Google Summer of Code 2024",
+ "CPDB CUPS backend Snap",
+ "Open Documentation Academy"
+ ],
+ "tags": [],
+ "snippet": "20 Years!! CUPS 3.x postponed to mid-2025, OpenPrinting Summit/PWG Meeting, GUADEC 2024, aKademy 2024, UbuCon Asia 2024, GSoC 2024, CPDB Snap, Open Documentation Academy",
+ "content": "This year is the 20th anniversary! The 20th anniversary? Of what? Of Ubuntu! Its first version 4.10 got released in October 2004. Of Canonical! The company behind Ubuntu. It got founded earlier in 2004. Of the Google Summer of Code! This year's edition is the 20th. Of Thunderbird! The famous e-mail clinet. Its 1.0 got released in December 2004. Of OpenWrt! Embedded operating system for routers. Started back in January 2004. And ... ... I got married in 2004, a really magic year. And I was already working with free software, but not aware of all these great things which happened in that year. This month we had our annual OpenPrinting Summit/PWG Meeting again, and, as usual Michael Sweet was reporting about the state of the art of CUPS, with an updated time line. Unfortunatly, things do not go as fast as thought about and therefore the sharing server, as the last component of CUPS 3.x to be released will only be ready mid-2025, in 1 year from now. And this is the date which marks when distros can switch over to CUPS 3.x, so that for Ubuntu the switchover will only happen in 25.10. Do you want to learn how to package software in the Snap package format? Most probably you will not look for resources here on OpenPrinting then, but rather at snapcraft.io. I had already talked about this with Graham Morrison, Snap documentation lead at Canonical, on the Ubuntu Summit last November and now, finally, after meeting him again on the Canonical-internal Engineering Sprint this month, I have created a page about the Snap workshops on snapcraft.io: Learn snapping! - Interactive Snap Workshops I will keep this page up to date with new workshops, updates of the existing workshops, announcements of next chances to attend in person ... So let us see what happened at OpenPrinting in May ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat On May 6-8 we had our annual meeting together with the PWG (Printer Working Group) again, the OpenPrinting Summit/PWG Meeting. The meeting was online again, as most of the participants were not able/willing to travel. All slides are available via links in the schedules. The first half of the meeting was dedicated to OpenPrinting, the second half to the PWG, mainly the development of the Internet Printing Protocol (IPP). In the OpenPrinting part there was no Ghostscript session again. Since having gotten acquired by ePapyrus Artifex has reduced the development activity on Ghostscript a lot and so there were only bug fixes. We used the time again for other topics, this year especially about desktop integration and software distribution methods (Snap, OCI). Most important session was Michael Sweet's CUPS plenary, where he always gives estimated timelines of the upcomimg releases of CUPS. Unfortuntaly, these do not match the last ones, presented on the Opportunity Open Source in September last year. The final 3.0.0 releases of the components are now estimated as follows: libcups3: August/September 2024 cups-local: February/March 2025 cups-sharing: April/May 2025 This means a further delay of another ~6 months. Note that for an integration in Linux distributions all the 3 components need to be available. It would be awkward to have a desktop distribution using the local server of CUPS 3.0.0 (with libcups3) and if a user wants to share their printers they have to install CUPS 2.x (with libcups2) and somehow the interaction between the CUPS 2.x daemon and the local server of CUPS 3.x has to get managed. libcups3 could get into use more quickly, for example in Snaps or OCI container images of Printer Applications. We had also 2 short talks by our GSoC contributors this year. Akarshan Kapoor has presented his work about scanning support in PAPPL and Rudra Pratap Singh his planned GSoC project of OCI containerization of CUPS and Printer Applications. There will be written up summaries of the event in the coming weeks. I will post links to them as soon as they get available. The next GUADEC is approaching! This year it will take place in Denver, Colorado, USA, on July 19-24! As usual it will consist of talks on the first 3 days, then workshops and BoFs for 2 days and to complete it, 1 day-trip day. The Call for Proposals has closed some weeks ago and the talks are already selected and scheduled, but not yet the workshops and BoFs. As in the previous years I will be there with a Canonical Gang, this time Ken VanDine, Marco Trevisan, Jeremy Bicha, and Aaron Prisk. And we all will meet our former colleague Heather Ellsworth (had moved on to Thunderbird last year). Living in Colorado Springs, one hour from Denver, this GUADEC is practically a home game for her (and she was actually involved in this location selection). I had also submitted 3 proposals. The Snap workshop and a talk about the Google Summer of Code got rejected, but my talk about Snap and Ubuntu Core Desktop will take place. It is Snap and Ubuntu Core Desktop - Desktop Linux, as easy as a smartphone! Fri, July 19, 15:15 MDT, Room 250 Turnhalle (Track 1) This talk is about Snap and the all-Snap desktop Linux distribution Ubuntu Core Desktop, how all this works, the motivations, advantages, challenges, and state-of-the-art ... I submitted the proposal for a 40-min slot, to allow for a generous Q&A, like Ken VanDine had on SCaLE (directly to Q&A), but unfortunately, I got only 25 min, as I got for this talk when I gave it on FOSDEM. As Ken is also on this conference, he will be most probably with me in the room and help answering questions. This year will be the first time that I attend the aKademy, KDE's annual conference! This is to raise awareness of the New Architecture for printing also under the KDE folks. Also they need to update their printing support, both in the printer setup tool and the print dialog, to allow for distros to switch to CUPS 3.x. The dialog got already done by Gaurav Guleria adding CPDB support and the KDE developer Mike Noe is on the KDE Print Manager, but to be sure it is better to let the wider KDE developer community know ... For that I have submitted a talk proposal to tell what the New Architecture is all about, what it requires from the GUIs, and the state-of-the-art of KDE's work on supporting it. Another point is that I will, together with my colleague Alex Lowe from Canonical, make the conference snappy. For that Alex has submitted a short (10 min) talk about \"why a [KDE] developer might want to release their software as a Snap\" and I have submitted my talk \"Desktop Linux, as easy as a smartphone! Just in a Snap!\" based on the one which I already have given on FOSDEM, but also telling about the state-of-the-art of KDE desktop session Snaps (which could make up a Kubuntu Core Desktop) if there are ones by the time of the conference. There was no CfP for workshops yet, but as soon as submissions for workshops open, Alex and me, we will submit my initial Snap workshop \"Your app everywhere, just in a Snap!\" but as a KDE edition. Alex will make KDE-based examples/exercises for that. I could also submit the workshop about Snap update automation in addition, to make the \"SnapKademy\" complete ... By the way, the aKademy 2024 takes place on September 7-12 in Würzburg, in Germany. As I already told in March I am working on a second edition of the Opportunity Open Source in India. Having again another conference in India, this time the UbuCon Asia in Jaipur on Aug 31 - Sep 2 (Sat - Mon) I am planning to run the Opportunity Open Source on Aug 23 - 25 (Fri - Sun), and most probably in the IIT Kanpur, and this way attend two conferences on one trip. Therefore I have submitted several talk proposals and got 2 sessions accepted: Desktop Linux, as easy as a smartphone! Just in a Snap! Sat, August 31, 11:35 AM IST, Main Hall The motivation, advantages, and concept of the sandboxed, immutable Snap packaging format is shown and how it is used to make up immutable all-Snap OS distros, the IoT distro Snap was originally designed for, Ubuntu Core, and the easily usable and maintainable Ubuntu Core Desktop. Your app everywhere - Just in a Snap! - Interactive Workshop Sun, September 1, 1:55 PM IST, Room 2 Interactive workshop to learn how to package applications in the sandboxed, immutable package format Snap to publish them in the Snap Store. Attendees will create simple Snaps in several hands-on exercises. Full schedules Special thanks to Youngbin Han from the Ubuntu Korea community and Ubuntu LoCo Council, who is leading the organization of the conference, for his great support. Lat week, the official coding period has started. Some of the contributors have started to work on their projects already earlier, others had their final exams for this semester in the last weeks and therefore are starting only now. I have created group chats on Telegram for each project to ease the communications between the mentors, the contributors and me. The OpenPrinting channel on Telegram is for general discussion and for my announcements. I have also taken care that there are mentors for everybody and I do not have to do all the mentoring by myself. And I have started to ask the contributors for write-ups for the OpenPrinting News, and several have written some lines: Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh This month, I have concentrated on deepening my knowledge by studying the Rockcraft documentation. Looking ahead, my next objective is to develop a production-ready CUPS container. To achieve automation in this endeavor, I am thoroughly reviewing the codebase of the ubuntu/desktop-snap project. My goal is to leverage their existing work to implement automated versioning and dependency updates for our container images. Additionally, I have successfully developed a Dockerfile for CUPS, enabling remote access from the host system to the CUPS instance within the container using the cupsctl --remote-admin command. Have a look at the github repository http://github.com/Rudra-IITM/cups-docker CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha This month I worked on the remaining part for the CPDB Snap. I finished making the necessary changes for filtering the printer list completely by the frontends and not by sending signals to the backends, and submitted a PR for the same. I am currently working on facilitating adding new backends while the frontend dialog is open. I am working closely with Till on this and hope to finish it as soon as possible to ensure everything is ready for the CPDB Snap. With respect to GSOC, I have finished setting up the development environment for LibreOffice, and am currently going through the code of the previous OpenPrinting contributor's work on the print dialog of LibreOffice. Biswadeep still mostly worked on the snappability of the CPDB backends, but finished the needed changes now (see below). Now he has started on his actual GSoC project. Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu Enhancing OpenPrinting's Security with OSS-Fuzz Integration Most of OpenPrinting's projects are predominantly written in C, which are prone to encounter memory violation bugs, and lack advanced testing methods like fuzzing. OSS-Fuzz, a well-recognized initiative for identifying vulnerabilities in open-source projects, is now being leveraged to bolster the security of C-based projects under OpenPrinting. This strategic integration aims to continuously detect and report potential threats. The current phase of integrating CUPS with OSS-Fuzz is primarily dedicated to rigorous validation and testing. Our approach involves developing fuzzing harnesses grounded on previously identified CVE vulnerabilities and refining existing unit testing framework into a more robust fuzzing infrastructure. This initial integration serves as a foundational step in our broader strategy to enhance the resilience of OpenPrinting’s projects through comprehensive fuzz testing. PAPPL API Bridging for Scanner Applications Contributor: Akarshan Kapoor My work was focused on developing the API for the Scanner object and Driver Interface, with an initial task to finalise the structure of scan APIs within the scanner and scanner-private header files. Key achievements include developing the Scan API object based on the Printer API object, tailored to eSCL scanning needs. I also updated the PAPPL job API object to accommodate both print and scan jobs by adding a reference to the scan object. Additionally, I created the scan driver API, modelled after the print driver APIs, but with callback functions and without support for vendor-specific options to align with PAPPL eSCL scanning protocols. Similarly, the options API structure was updated based on printer options and also excludes vendor options. The scanner headers for the public and private APIs were introduced, each with appropriately named header guard macros, patterned after their printer counterparts. Currently, I am enhancing the accessors file to provide accessor functions for the scanner object, following the format established in the printer accessor functions. Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal Here's the latest on my project: Understanding System Config Printer: I've been studying the current code and functions of system-config-printer to understand how it works. This helps me see what needs to be changed for the new architecture. Switching to the New Architecture: To update CUPS for the new architecture, we will need to change some existing functions in system-config-printer. This will make sure everything works well together. Understanding IPP Services: I've been reading about the IPP (Internet Printing Protocol) services that system-config-printer needs to use. This is important for making the necessary updates. Talking with My Mentor: I had a discussion with my mentor, Mohit Verma, who gave me an overview of how to start the project and suggested some functions I might need to write. His advice is helping me plan the updates. Next Steps: Right now, I'm focused on understanding the existing functions in system-config-printer. Next, I'll figure out and add the new functions needed for the new architecture. User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma User interface for using OAuth2 with printers and scanners This project is all about providing authentication support to the printers and scanners which can help us to save the client's files. I had figured the idea about adding this functionality to the print dialogs. The CPDB does not have authentication support, which may cause threat to client's data. It is important to use an authentication server and for this I am using GNOME online accounts (GOA). I had a discussion with GOA for using their server for authentication and it can be used to create or add an account which client needs to initiate for the authentication. To proceed with it setting up D-Bus communication, querying GOA for OAuth2 tokens. To use GOA as authentication server, the installation of few libraries are required such as 'libgoa-1.0-dev' for GOA and 'libdbus-1-dev' for D-Bus communication. Unfortunately, we did not get write-ups from everyone. Several have been deeply in their exams these days. Especially Arun Patwa (Braille) and Ankit Pal Singh (Gutenprint) have graduated. Congratulations to them! Biswadeep Purkayastha is volunteering on snapping the CPDB backend for CUPS since the end of last year and we ran into several problems, especially as we have to do with user daemons now and the frontend browses available D-Bus services to find all installed backends. Discussion on the snapcraft.io forum led to the need of some changes in the architecture of the Common Print Dialog Backends (CPDB) infrastructure and Biswadeep has done them all now! Thanks again, Biswadeep, for your great work! The changes are: The printFile method of backends passes the job data as stream via a domain socket now, not as file specified by a file path The D-Bus methods getActiveJobsCount, getAllJobs, and cancelJob got removed from CPDB The file backend of CPDB cannot be used. We decided to discontinue its development and will use it for development and documentation only Filtering of the printer list in the dialog is now done by D-Bus methods in the backend's D-Bus service and not any more by the frontend also being a D-Bus service and sending signals By a background thread the coming and going of backends is monitored and the printer list in the dialog appropriately updated Biswadeep provided the changes via the following Pull Requests which got all merged now: cpdb-libs: Pull Request for (1) and (2) (merged), Pull Request for (4) and (5) (merged) cpdb-backend-cups: Pull Request for (1) and (2) (merged), Pull Request for (4) (merged) I have posted the news on the thread in snapcraft.io and snapd developers Zygmunt Krynicki and James Henstridge are looking into how to proceed with the snapping. See also our coverage here in the October News, the November News, and the March News. OpenPrinting needs contributors for documentation urgently. Especially we have no documentation for the APIs of libcupsfilters, libppd, pappl-retrofit, and cpdb-libs. Finding contributors for documentation is not easy, Google Summer of Code is only for code contributions, Google Season of Docs is not suitable for us as we would have to hire the technical writer, and finding people just volunteering i tried, even some telling they would do, but they did not do in the end ... Now another chance came up for us: Recently Canonical has started the new \"Open Documentation Academy\" program and this seems to be a good way to find volunteer documentation writers. Central point of it is a GitHub repository, where organizations can post their documentation needs as issues, so volunteer writers can browse the issues and find documentation tasks they like to do. I have already posted one issue as an example, it is for API documentation of libcupsfilters. Here is the original on our GitHub and a manual copy at the Open Documentation Academy. This is a little awkward and several feature requests for improvements got posted. First idea was automatic copying of documentation issues, but this would need explicit permission from Canonical's IS team (they are owner of the https://github.com/canonical/ organization on GitHub). Then I brought in the ideas of registration and self-presentation of participating organizations and of listing documentation-related issues directly from their tracker. And the Open Documentation Academy is not only finding together organization's documentation needs and voluntary writers, but they support the writers with a lot of resources: Discussion forum, Weekly Office Hours (live discussion, recording on YouTube), Chat on Matrix, mentoring, guiding, ... We will post more documentation tasks in the list and hopefully will have a better presentation of ourselves and of our tasks in the program soon. Thanks Graham Morrison for this great initiative!"
+ },
+ {
+ "id": "post:OpenPrinting-News-November-2019",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - November 2019",
+ "url": "/OpenPrinting-News-November-2019",
+ "headings": [
+ "Google Code-In 2019",
+ "Google Summer of Code 2019",
+ "Google Summer of Code 2020",
+ "Future work of OpenPrinting: Printer/Scanner Applications and IPP System Service",
+ "Avahi local service support",
+ "OpenPrinting web site",
+ "CUPS",
+ "cups-filters",
+ "ippusbxd"
+ ],
+ "tags": [],
+ "snippet": "The Linux Foundation applied for Google Code-In 2019 but did not get selected, future work of OpenPrinting should concentrate in Printer/Scanner Applications and IPP System Service, CUPS 2.3.x in Ubuntu 20.04 LTS (Focal Fossa), cups-filters 1.25.11, for ippusbxd David Valleau will look into allowing classic USB access in parallel",
+ "content": "Aveek Basu and Till Kamppeter have conducted an application for the Linux Foundation as mentoring organization in the Google Code-In 2019 and, unfortunately, did not get selected. A web page got set up for the application, containing sample tasks of several work groups of the Linux Foundation, including many of OpenPrinting. The web page will stay available as a start for an application next year. We try to find out why we did not get selected but have no results yet. Till Kamppeter and Aveek Basu have attended the Mentor Summit in Munich on October 17-20, 2019. They have presented a lightning talk about the success of the students working for OpenPrinting and also a held a session to discuss current OpenPrinting work. We need to start with the student selection process soon, so that we can let them do assignments to compensate for the missed Google Code-In opportunity. We need to concentrate on Printer/Scanner Applications and IPP System Service from know on. This is urgently needed as Michael Sweet (Apple?) plans to drop PPD file support in CUPS 2.4.x (next cycle, ~1 year from now), at least according to the warning message which one gets from lpadmin when one creates a print queue with PPD file (-P or -m option, except -m everywhere). This is a substantial change in the printing architecture on Posix-style operating systems. Especially we need to create libraries to allow easy creation of Printer/Scanner Applications. They should provide: Acquisition of a port on localhost (or on all network interfaces for sharing). Managing the port numbers in a useful way. DNS-SD advertising of the services (printer, scanner, fax, config interfaces, ...) IPP server: Answering all types of requests and calling functions to do the needed interactions with the printer/scanner and the application-internal printer/scanner capability data. Processing and filtering the incoming job data: Printer Applications will take PDF and raster formats as input and convert to the printer's native format. Functionality of the filters in cups-filters should be moved into a library, to be available as API functions. Legacy interface functions: For filters/PPDs and for SANE drivers. Communication with printers and scanners, functionality of the CUPS backends. IPP System Service as a server, to allow configuration of the Printer/Scanner Application via an external GUI (IPP System Service client). Then there can even be a Printer Application for a legacy printer which cannot be auto-discovered in the network. The application starts only providing IPP System Service. As soon as the user has entered the printer's IP address via the configuration interface, the application connects to the printer and starts to offer IPP print service. Perhaps also a web server for legacy clients. Then commodity functions of the library for building up a configuration interface should add each interface element to both the IPP System Service server and the web server. IPP System Service as a client, for GUI (and also CLI) apps to configure IPP printers and also Printer/Scanner Applications. This will be a central part of printer setup tools in the future. For testing this we should create a native Printer Application from Gutenprint for example, or one for PostScript printers for which we have PPD files. We also should create a native Scanner Application wrapping SANE with its current driver collection. Additional things to do: Turn cups-browsed into a Printer Application: Instead of creating a local CUPS queue for a printer cluster emulate an IPP printer which prints to the cluster (and local CUPS picks it up automatically, but how to prevent local CUPS from seeing the member printers directly?). We can also pick up legacy CUPS broadcasts (or BrowsePoll from legacy servers) and provide these printers as IPP printers. Configuration of cups-browsed then also via IPP System Service. Overtake PPD support API functions and pstops filter as soon as they get dropped from CUPS, for legacy support in Printer Aplications and cups-browsed. SANE driver for IPP scanners, so that applications accessing scanners via SANE can also access IPP scanners and Scanner Applications. Documentation/Community reach-out: Design guidelines for printer and scanner drivers as Printer/Scanner Applications, instructions to do this with our new libraries. As soon as SANE is wrapped into Scanner Applications, move GUI developers to base their scan frontends on IPP scanning and not SANE any more. No further progress this month. We urgently need the localhost support for the Printer/Scanner Applications, as PPD support will go away within a year. We need to go through the new site now and look for things which are still missing or need improving. Please report any issue here. No further release. The development cycle of Ubuntu 20.04 LTS (Focal Fossa) has started and CUPS 2.3.0 is now synced into Ubuntu from Debian, meaning that 20.04 will be released with CUPS 2.3.x. The lpadmin command issues a warning message telling that PPD support will get removed in the next CUPS cycle (2.4.x) when one creates a print queue with PPD file (-P or -m option, except -m everywhere). Therefore we need to get Printer Applications working by then. Currently released is 1.25.11. Many releases happened during the short time to get bug fixes into Ubuntu 19.10 (Eoan), which was released on Thu, Oct 17. The upcomimg 1.25.12 release contains many fixes on the pdftops filter, especially to solve problems with grayscale jobs when Poppler is used as PDF renderer. These jobs print now reliably but can come out in color on color printers. To assure that grayscale printing on color PostScript printers works correctly, use Ghostscript or MuPDF (these are able to convert color to grayscale). See Issue #169. 1.25.12 also builds with no compiler warnings now (tested on Ubuntu 19.10). 1.25.11: Bug fix release for cups-browsed working correctly with legacy (IPP 1.1) remote printers 1.25.10: Bug fix release for a bug making cups-browsed crash 1.25.9: Important bug fix release, fixes infinite recursion in cups-browsed! DO NOT use 1.25.8! 1.25.8: Bug fix release, especially to solve problems with cups-browsed connecting to older IPP printers/servers and for compatibility with Ghostscript 9.27+ David Valleau from Chrome OS/Google cotributed some minor fixes. Thanks to him for this contribution. An important problem of ippusbxd is that while it is running, the printer is exclusively accessible via IPP-over-USB. Classic USB access in parallel (or at least when there is no ongoing IPP communication) is not possible. This makes the use of ippusbxd on multi-function devices awkward, as IPP-over-USB currently only works with printing and not with scanning, due to the fact that manufacturers did not adopt the driverless IPP scanning standard of the PWG yet (Issue #9). David Valleau will look into implementing this."
+ },
+ {
+ "id": "post:OpenPrinting-News-November-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - November 2020",
+ "url": "/OpenPrinting-News-November-2020",
+ "headings": [
+ "Lexmark second manufacturer (after HP) to certify IPP Everywhere printers",
+ "Google Summer of Code 2021",
+ "Google Season of Docs 2020",
+ "Linux Foundation Mentorship Program",
+ "PAPPL first beta release",
+ "PostScript Printer Application",
+ "CUPS",
+ "cups-filters"
+ ],
+ "tags": [],
+ "snippet": "PAPPL first beta, PostScript Printer Application, GSoC 2021, GSoD, LFMP, CUPS fork in Debian, cups-filters",
+ "content": "The days (months?, years?) of only HP being present on the PWG's certified IPP Everywhere printers list are counted. Lexmark has entered as second manufacturer, registering 92 IPP Everywhere v1.1 printers and with this the first v1.1 certifications at all. The total amount of printers in the list is currently 625. We are currently looking for project ideas for next year's Google Summer of Code. As mentioned last month student projects will only be half the timr (6 weeks). Google tells that this will probably attract more students, but for us it is a much higher workload as we have to find the double amount of students and get the double amount of students introduced and up to speed to get the same work done. For larger project we should also consider to run them under the Linux Foundation Mentoring Program instead of GSoC. Our OpenPrinting project is continuing well. Most pages of Piyush Goyal's project are already populated, merely only the scanning part is missing as its coding in our LFMP project is not yet completed. Next steps for the time being until IPP Scan gets far enough for being documented is to check whether everything is correct, recent API changes in PAPPL taken into account, design of existing Printer Applications, like the HP PCL and the PostScript Printer Applications explained, ... Our second LFMP project about IPP Scan is going on, with both Abhik Chakraborty and Rishabh Arya woring on the IPP Scan server/Scanner Application. Abhik is introducing Rishabh into PAPPL and the IPP server work. Mentoring will be mainly done by Michael Sweet. PAPPL made it to its first beta release, 1.0b1! So now it takes more or less the shape for the first stable release, having mostly the features and functionality needed to create printer driver packages in the new Printer Application format. 1.0 will not yet have scanning support. This will come in a later release. The devlopment of the PostScript Printer Application is going on and the application's TODO items get less. To fulfill IPP Everywhere requirements printing of PWG/Apple Raster input is streaming now, using PAPPL's built in Raster filter and raster callback functions to generate the PostScript for the printer, with the PPD's PostScript code snippets for the option settings inserted. Streaming instead of spooling means that the printing does not only start when the Printer Application has sucked in the whole job, but continuously picks up input data, filters it, and sends it off to the printer, raster line by raster line and as soon as the printer has enough data to print something it prints, in PostScript on completion of each page. This is less resource-consuming for large jobs and even would permit infinite jobs. Also printing of JPEG and PNG images uses PAPPL's internal image filter now, but PDF and PostScript input is handled by the appropriate filter functions of cups-filters. The creation of the PPD file list (currently we use ~4000 PPD files) was optimized to get the printer model names sorted in a human-friendly way (HP LaserJet 4, HP LaserJet 5, HP LaserJet 4000, HP LaserJet 5000 and not HP LaserJet 4, HP LaserJet 4000, HP LaserJet 5, HP LaserJet 5000) and to easily match the printer's device IDs with the PPD files even if the PPD file does not contain the device ID. Also the driver names for PAPPL's command line interface and config file are stable against changes in the PPD list, like the order or adding/removing some PPDs. My work on the PostScript Printer Application as the first non-Raster, retro-fitting, and many printers supporting Printer Application also has exercised PAPPL a lot and made me posting several bug reports (partially with patches) and feature requests on PAPPL and most of them Michael Sweet has fixed/implemented. Here are the most recent ones: Provide device ID to driver callback (Milestone for 1.0) Web interface: Button/Link to return to printer's main page from printer's config pages, also show print queue name on the config pages (Fixed) When printing colored PNG image in gray the image does not get correctly converted (Fixed) When printing an image with \"print-scaling=fill\" the image is not blown to fully fill the page but printed as with \"print-scaling=auto\" (Fixed) When printing JPG image with Printer Application the Printer Application crashes (Fixed) With PWG/Apple Raster input papplJobCreatePrintOptions() is called with num_pages = 0, clobbering the Duplex default setting (Fixed) Add tolerance to rounding errors when sending Apple/PWG Raster (Fixed) PAPPL-based Printer Applications do not DNS-SD-advertise their printers (Fixed) When printing to a network printer host name does not get resolved from device URI, job falls into infinite, uninterruptable (Fixed) Web interface: One can set Borderless Media, but setting not displayed (Fixed) More to be seen under the currently open and closed issues of PAPPL. Currently released is 2.3.3. On our fork of CUPS on OpenPrinting Didier Raboud (\"OdyX\"), maintainer of the printing packages on Debian, has posted pull requests for most of Debian's (and so also Ubuntu's) distribution patches and Michael Sweet has merged most of these pull requests so that future packaging will work without this \"patch hell\". First GIT snapshots got already packaged and released on Debian Experimental. Michael Sweet has also merged several other pull requests and fixed bugs which got originally reported to the original repository at Apple and there not taken care of. Here is the new CHANGES-OPENPRINTING.md of the fork: Currently released is 1.28.5. On the way towards 2.0.0 and driven by the further development of the PostScript Printer Application I have added the following new features: Moved IEEE1284-device-ID-related functions into the public API of libcupsfilters, also made the internal functions public and renamed them all to ieee1284...(), moved test1284 to cupsfilters/ Extended ieee1284NormalizeMakeAndModel() to a universal function to clean up and normalize make/model strings (also device IDs) to get human-readable, machine-readable, or easily sortable make/model strings Added filterPOpen() and filterPClose() functions which similar to popen() and pclose() create a file descriptor which either takes data to feed into a filter function or provides data coming out of a filter function. In cupsRasterParseIPPOptions() (called from filter functions used without PPD file) improved understanding of color mode options. Options \"output-mode\", \"OutputMode\", \"print-color-mode\", and choices \"auto\", \"color\", \"auto-monochrome\", \"process-monochrome\", and \"bi-level\" are supported now and default color mode is RGB 8-bit color and not 1-bit grayscale."
+ },
+ {
+ "id": "post:OpenPrinting-News-November-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - November 2021",
+ "url": "/OpenPrinting-News-November-2021",
+ "headings": [
+ "Google Summer of Code 2022",
+ "Practically all free printer drivers in Printer Applications",
+ "Your driver not in a Printer Application? - The Legacy Printer Application",
+ "Printer querying on the OpenPrinting web server",
+ "pappl-retrofit - The CUPS Driver Retro-Fit Library",
+ "Ghostscript Printer Application",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "CUPS Snap",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "Google Summer of Code 2022, all free drivers in Printer Application Snaps, Legacy Printer Application, CUPS 2.4rc1, PAPPL 1.1b3",
+ "content": "On November 5 the virtual Mentor Summit of GSoC 2021 has taken place and there the organization team of the GSoCs at Google has announced that we will have a GSoC again in 2022! But this time, for the 18th year, there will be several changes: Contributors, not only students: From now on it is not required any more to be a university/college student any more to code for GSoC. Anyone 18 years olde and older can do. Two project sizes: 16 GSoCs with ~350-hour projects, then one with ~175-hour ptojects, some tasks fit better into one size others into the other, no one-size-fits-all. Now we can have both. The organizations can select from these two sizes for each project idea they offer. Coding period flexibility: Before, there was a fixed time period of ~3 months in which the projects had to be done, also with fixed dates for the 2 or 3 evaluations. From 2022 on the period can be extended to 22 weeks on agreement between mentor and contrbutor, should there be some interruptions like exams, trips, sickness, different dates of mid-year break, ... This gives more people the chance to be able to participate. Now we have much more flexibility in defining projects and in selecting candidates, so much better chances in getting our projects done and finding more long-term contributors. Any suggestions for GSoC projects are welcome. We will start looking around for candidates and pre-selecting soon. Now we are an important step closer to using the CUPS Snap as the standard printing system and generally to use a CUPS which does not support PPDs and printers drivers (like 3.x): All free software printer drivers which are available in Debian packages (for Debian and Ubuntu) are now also available in Printer Application Snaps, so with the CUPS Snap and any future CUPS version there is no loss of printer support. There are four Printer Applications with nearly every driver in the Snap Store: PostScript Printer Application (Snap Store): Printer Application Snap for PostScript printers which are supported by the manufacturer's PPD files. User can add PPD files if the needed one is not included or outdated. HPLIP Printer Application (Snap Store): HPLIP in a Printer Application Snap. Supports nearly every HP printer ever made. Installing HP's proprietary plugin (needed for a few printers) into the Snap is supported and easily done with the web interface, and it gets automatically updated. Gutenprint Printer Application (Snap Store): High quality output and a lot of knobs to adjust, especially for Epson and Canon inkjets but also for many other printers, for example dye sublimation photo printers, in a Printer Application Snap. Ghostscript Printer Application (Snap Store): Printer Application with Ghostscript and many other drivers, for practically all free-software-supported printers which are not PostScript and not supported by HPLIP or Gutenprint. It contains all the printer for which there is no separate Snap. In addition, there is LPrint which supports many label printers (more label printer models supported by the Ghostscript Printer Application): LPrint (Snap Store): Supports Dymo LabelWriter and Zebra ZPL label printers, with all label-printer-typical options: Label modes, tear-off offsets, media tracking, media top offset, print darkness, resolution, roll selection, speed, ... Note that this is of the pre-PAPPL era and so does not use PAPPL with all its features. If there are any free software CUPS printer drivers left which are not in these Printer Applications and you think it would be great to have it there, please report an issue on the Ghostscript Printer Application. If you have manufacturer-supplied PostScript printer PPDs which are published under a free software license but not included in the PostScript Printer Application, please report an issue. For non-free-licensed PPD files simply install the PostScript Printer Application and use the \"Add PPD file\" functionality in its web interface to install your printers's PPD locally. If your printer still needs a driver which does not exist in any of the above-mentioned Printer Applications but is available for classic installation on your system (RPM or DEB packages, source code, ...) you can make your driver available in a Printer Application by installing the Legacy Printer Application. It is a part of the pappl-retrofit package and it makes drivers classically installed for the system's classically installed CUPS available in a Printer Application and this way for the CUPS Snap and any non-driver-supporting CUPS in the future. Note that this Printer Application cannot be put into a Snap and has to be classically installed instead, as otherwise it would not have access to your classically installed driver. This is especially of help for proprietary drivers for legacy printers, which are not updated any more by the manufacturers and so will not get converted to Printer Applications. Important for making printing \"just work\" for users is an ideally fully automatic setup of the printer. For driverless IPP printers (AirPrint, IPP Everywhere, Mopria, Wi-Fi Direct Print) this is no problem, they get auto-discovered by CUPS and made available as virtual, temporary print queues. Non-driverless printers which need a driver would need a way to get the correct Printer Application downloaded and installed. So a printer setup tool would need to discover the non-driverless printers, get their device IDs and send a query to somewhere to get as answer which Printer Application to install. The first idea for this was to get hardware-signature-based search added to the Snap Store, and an appropriate feature request got already posted, but after suggesting it near 2 years ago there seemed to be not much interest on that. And if one would try to revive the idea, it can still take rather long until it gets actually implemented. So I am looking into another approach: For years we could query printers and which drivers support them by the OpenPrinting web server, only that we usually only got told about which upstream source project supports the printer, not ready-to-use packages. Here we could improve and update to get what we want. The server allows human access (Printers page -> select printer make/model -> HP LaseJet 4050 -> select driver -> HPLIP) and also machine access: https://openprinting.org/query.php?type=printer&make=HP https://openprinting.org/query.php?type=printer&make=HP&model=HP-LaserJet_4050 https://openprinting.org/query.php?type=printer&make=HP&model=HP-LaserJet_4050&moreinfo=1 https://openprinting.org/query.php?type=printer&printer=MFG:HP;MDL:LaserJet%204050;&moreinfo=1 https://openprinting.org/query.php?type=driver&make=HP&model=HP-LaserJet_4050 The answers are in plain text (optionally XML, by adding &format=xml to the URLs). What we need is that this system tells about the Printer Applications to use not simply the drivers. A first approach I have already added to the human access interface: The driver pages, at least the ones of drivers which are contained in one of the 4 Printer Applications from OpenPrinting, contain a prominent link to the appropriate Printer Application. For example see the entries of HPLIP, Gutenprint, pxlcolor, hl7x0, Ricoh PostScript. Now one could think about adding all printers and drivers supported by the printer applications to the Foomatic database (the database behind the lookup system shown here). Probablem is that there are very many printers (~10000). Even if one creates a script to make this automatic it is very awkward. The human access interface gets a lot of \"boring\" entries, only carrying make and model names and driver relationships, no comments and no support quality info. In addition, we can run into scalability issues, getting the system, or the pre-build of PPDs very slow. We also would need to add a field for the Printer Applications into the database somewhere. And we need to update everything whenever we modify one of the Printer Applications. So I will try another concept: I will use the Printer Applications themselves and not a database derived from them to answer the queries. If you have a single Printer Application, you can find out whether it supports a given printer by simply querying it with the device ID of the printer: There will be no answer if the given printer is not supported, and if it is supported, one gets an answer like this: This is the internal driver name of the Printer Application for this printer, a human-readable description (the one which you also see in the web interface of the Printer Application), and the device ID as it is registered for this printer in the Printer Application. You see now that the device ID in our query does not match the device ID in the Printer Application. The one in the Printer Application is most probably the actual one of the printers, as it comes from HP's PPD file of the printer, which is included in the Printer Application Snap and the one in the command line simply comes from the top of my head (many years ago I worked in the office of Mandriva in Paris, and the daily-work network printer, and also subject of many tests by me, was an HP LaserJet 4050). Here we see that there is a fuzzy matching between the device IDs. This helps us to also do manual searches (user enters make and model names) and we also can match printers from which we do not know the exact device ID, but at least make and model as written on the printer's case. What I plan to do with this is to install all the Printer Applications (as most modern printers are driverless IPP there should not appear too many Printer Applications) from the Snap Store on the OpenPrinting web server, stop their daemons (the query works without the daemon), and let the auto-update mechanism of snapd and the Snap Store keep them always up-to-date. Now we extend the script behind the machine access interface (query.php) to allow querying all Printer Applications for a given printer. It would make a script like this being run (this is simplified a lot): Running it with 'MFG:HP;MDL:LaserJet 4050;' as argument results in: So all the 4 Printer Applications support it. Such an answer is naturally rare in real life, but it can easily happen with a standard laser printer supporting all the common PDLs, like PostScript, PCL 5e, and PCL-XL. So we will need to prioritize so that we can return the answers in desirability order. We will first check whether the manufacturer name in the answer is \"Generic\" and in that case only give a very low priority, as it is a generic match, for example by the PDLs in the \"CMD:\" field of the device ID. Results which contain the actual model name get higher priority. If this does not lead to a \"best\" answer, we will also prioritize between the Printer Applications. For example if it has manufacturer-supplied drivers it will get preferred, also more sophisticated drivers are preferred against simpler drivers. This will lead to the following priority order of our 4 Printer Applications: HPLIP PostScript Gutenprint Ghostscript HPLIP is a manufacturer's driver, PostScript is a collection of manufacturer-supplied PostScript PPDs, Gutenprint is a sophisticated, high-output-quality driver, and Ghostscript contains many simple, generic drivers for PCL and PostScript printers which are better supported by the other Printer Applications. So our querying printer setup tool would set up our HP LaserJet 4050 with the HPLIP Printer Application (and with this it will be used in PostScript mode). Most importantly the Test Printer Application included with pappl-retrofit, originally thought as a programming example and to test drivers whether they work in a Printer Application, was renamed to Legacy Printer Application as it serves also for making classically installed CUPS drivers available in a Printer Application. So one can install it on a system using the CUPS Snap to make available the classically installed printer drivers. So it can be used on production systems to support older, often proprietary drivers which did not get converted to Printer Applications (see also above). To make the new Legacy Printer Application pweform as best as possible we assure now that it never runs the driverless utility as PPD generator/backend if it is installed, as it does not make sense to support driverless IPP printers with a Printer Application, we create PPDs on-the-fly from *.drv files, and we use only CUPS backends for best compatibility with the drivers (side-/back-channel support, ...). The PAPPL backends can be used for testing by building with ./configure --enable-pappl-backends-for-legacy-printer-app. For streaming Raster or image jobs to PDF printers we make use of Ghostscript's new PDF Image and PCLm output devices now. the streaming got fixed in Ghostscript 9.55. This way printing on PDF printers needs less client resources and also some printers could start to print the job alreasy before all the job data is transferred (commit). With the conversion of the bannertopdf CUPS filter into a filter function in libcupsfilters (see below) we can now use a PDF-based dynamic test page. In contrary to the former bannertopdf CUPS filter the banner instruction file and the PDF template/background file can be joined into one, to ease the implementation of the Printer Application. When running in debug logging mode we now save a copy of the job data which goes to the printer (commit). The retro-fitting library has also received many fixes and improvements during the work on the 4 Printer Applications, especially for correctly listing the supported printer models in a user-friendly way, reliably auto-assigning the correct driver/model to a discovered printer, and also to prevent crashes: When setting up the driver verify and correct default resolution, especially the default resolution saved in the state file can get invalid if the driver is removed from the Printer Application and another one auto-selected. This causes crashes on shutdown (commit). Use device ID as display string (for \"Add Printer\") only if manufacturer matches (commit) On driver setup skip media sources/types/sizes without PWG name to avoid crashes (commit). When generating the driver list, never use a single \"*Product\" entry in the PPD file, as this entry is either the model name from the \"*NickName\" or something weird (commit) On driver setup corrected loop to go through the \"*cupsFilter(2)\" lines of the PPD, as only the first line got actually used (commit) Let system setup set the CUPS_SERVERBIN environment variable, as some CUPS filters rely on it (commit) Further development of the library will go with the development of PAPPL and the needs of the Printer Applications. Especially the following features will get implemented/supported as soon as they are implemented/fixed in PAPPL: Support for scanning. Needs support in PAPPL (Bhavna Kosta's GSoC project). Support for string/text-style vendor options. Needs support in PAPPL (Patch already applied in the Printer Application Snaps). Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Ghostscript Printer Application in the Snap Store I Added all the small, old, and mostly unmaintained printer drivers (Debian packages printer-driver-..., see output of \"apt search printer-driver-\" in Debian or Ubuntu distributions) to the Snap. This avoids cluttering the Snap Store with tons of Printer Applications, makes maintenance easier, especially less Printer Applications to rebuild after a change in the infrastructure (PAPPL, libcups, cups-filters, pappl-retrofit, Ghostscript, …), and less infrastructure overhead on the user’s machine if he has more than one printer. The drivers added are c2050, cjet, min12xxw, pnm2ppa, hpijs (non-HP PCL lasers only), c2esp, dymo-cups-drivers, foo2zjs, fxlinuxprint, m2300w, oki, pxljr, rastertosag-gdi, splix, brlaser, and ptouch-driver. I used the Debian source code of the drivers to get Debian's patches to fit the old code to the current systems and to fix the bugs, but I built the drivers by myself in the Snap to not pull in their dependencies (old Ubuntu 20.04 packages of the full printing stack including cupsd). With this and the 3 other driver-retro-fitting Printer Applications all printer drivers available in Debian packages are now also available in Printer Applications. I also make use of libppd’s *.drv file support in the Snap (commit) as several drivers use this format instead of actual PPD files or a PPD-file-generating executable and so we do not need to pre-build the PPD files. Also I discovered that the pdftops CUPS filter (needed by foomatic-rip for drivers which accept only PostScript) was missing and added it (it is actually only a little stub to call the pdftops() filter function in libcupsfilters). I did further testing, optimizing, and debugging on listing the supported printers and finding the best support for a given printer, both whether a Printer Application supports the printer at all and if so, which driver is the best. Listing and checking is fast and reliable now and it should be possible to do it on the OpenPrinting web server (see above). The Snaps of the 4 Printer Application also got some general improvements: Make use of libppd’s *.drv support in the Snaps (commit) More precise determination of files to include in the Snaps in snapcraft.yaml (commit) Patched dnssd CUPS backend in the Snaps to only report JetDirect/Port 9100 and not IPP or LPD, to avoid discovery of driverless IPP printers including other Printer Applications (commit) Switched to the PDF-based dynamic test page (commit) Corrected passing of arguments in the startup scripts for the Snaps, to make it possible to pass printer device IDs to the -o device-id=... option, needed for checking support of a given printer (see above, commit) CUPS Snap in the Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but now we have progress here. Most of the changes requested in the snapd Pull Request got implemented and I got asked to do a second real-life test of the current state of snapd. Everything is working as intended and the results of the test I have reported in the Pull Request. Together with the fact that we have practically all free software printer drivers in Printer Applications now we are very shortly before being able to use the CUPS Snap as standard printing system in Linux distributions, like Ubuntu 22.04 (Jammy Jellyfish). Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces (see above) Testing Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|3138| |ipp-usb|ipp-usb|621| |ps-printer-app|PostScript Printer Application|1798| |ghostscript-printer-app|Ghostscript Printer Application|516| |hplip-printer-app|HPLIP Printer Application|1859| |gutenprint-printer-app|Gutenprint Printer Application|1004| Currently released is 2.4rc1. This is a release candidate for the first feature release of CUPS on OpenPrinting. Thanks to Zdenek Dohnal (RedHat) for having taken the role of the release manager for the CUPS 2.4.x series. Ubuntu Jammy Jellyfish (22.04 LTS) will come with CUPS 2.4.x, if all works well as Snap. The CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. Ongoing discussion Feature Request: Implement printer profiles (Issue #207) Zdenek Dohnal (RedHat) writes: This issue is a placeholder for implementing printer profiles, which are needed for the case: CUPS temporary queues work only with LAN located devices, because the tech uses mDNS for device discovery. However, this situation isn't usually a case for enterprises, where their IT engineers tend to put printers into a separate VLAN - they do it because of security and monitoring. Without any migration plan, these use cases would be left behind if permanent queues are gone and CUPS temporary queues become the only technology in CUPS. The idea of printer profiles was introduced by Mike Sweet during email communication within OpenPrinting group and distro maintainers and presented during PWG F2F meetups. In good progress: Remove print filters and printer driver support (Issue #103) Here I have especially reported that we have most drivers in Printer Applications now. 2.4rc1 CUPS 2.4rc1 is a release candidate for OpenPrinting CUPS 2.4.0, which adds some further enhancements before the stable release. 2.4b1 CUPS 2.4b1 is the beta release for OpenPrinting CUPS 2.4 which contains several new features such as basic OAuth support, support for AirPrint and Mopria clients and support for running CUPS as a snap, several deprecations (Kerberos, cups-config), removals of old deprecated configuration file directives, and many bug fixes. Currently released is 1.28.10. In cups-filters we are getting closer to the 2.0 release. All filters which are not printer drivers are now converted to filter functions and the universal filter function is also added. Also all PPD-handling code from CUPS is moved into cups-filters to allow retro-fitting of drivers also after CUPS has dropped PPD file support. Several minor bug fixes and improvements got initiated by the work on adding the old, unmaintained printer drivers to the Ghostscript Printer Application. Now mainly clean-up is needed. Merged Pranshu Kharkwal's Pull Request for adding a universal filter function and CUPS filter to replace the chain of individual CUPS filters. Also did the build system integration for the new filter to easily choose between the universal filter executable or individual filter executables. Now all GSoC 2021 projects on cups-filters are merged. Ported CUPS’ PPD compiler (ppdc) into libppd (commit 1, commit 2, commit 3). This way also classic CUPS drivers using /usr/share/cups/drv/*.drv files instead of physical PPDs can get straightforwardly encapsulated into Printer Applications with pappl-retrofit now. So all PPD handling functionality of CUPS is ported to cups-filters now and all types of classic CUPS printer drivers can get easily converted to Printer Applications. Improved bannertopdf() filter function to integrate in pappl-retrofit more easily, to allow PDF-based dynamic test pages, easier to customize for the specific Printer Applications, no need of a PostScript interpreter (commit). Dropped support for CUPS < 2.2.2 and QPDF < 10.3.2 from cups-filters 2.x. Removed the obsolete urftopdf CUPS filter, as libcups supports Apple Raster already for some years now. Fixed bugs in the texttopdf() filter function which got discovered when developing the universal filter function. In pwgtoraster() with PPD do not modify the Raster header via IPP options (commit). Parse device IDs with spaces correctly (commit). Allow specifying CUPS filter/backend executable without full path in the filterExternalCUPS() filter function (commit). Let filterExternalCUPS() return 1 if filter is terminated by a signal (commit). Added \"FXOutputMode\" of Fuji Xerox to auto-mapping IPP attributes to PPD option settings (commit). Useful \"*Product:\" entries in the PCL-XL PPDs (commit). Removed “series” from printer model names when normalizing them to make it easier to search for support for a given printer (commit). Ubuntu Jammy Jellyfish (22.04 LTS) will most probably come with cups-filters 2.x. The CUPS Snap currently uses 1.28.10. The Printer Application Snaps use the current GIT master of cups-filters. Currently released is 1.1b3. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. After this release only changes for Windows compatibility got added. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-November-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - November 2022",
+ "url": "/OpenPrinting-News-November-2022",
+ "headings": [
+ "The first Ubuntu Summit was a success!!",
+ "The making-of",
+ "And the conference finally started ...",
+ "Thanks",
+ "OpenPrinting Micro-Conference on Linux Plumbers 2022 - The recordings",
+ "Google Summer of Code 2023",
+ "Google Summer of Code 2022",
+ "cups-filters Second Generation - First Beta Release!",
+ "Getting Cute - New UI for the Qt print dialog",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "/assets/images/brachiograph/master-of-the-brachiograph.jpg",
+ "snippet": "Ubuntu Summit 2022, OpenPrinting micro-conference recordings, GSoC 2023 announced, GSoC 2022 results, cups-filters 2nd gen. 1st beta release, Qt print dialog, CUPS, PAPPL",
+ "content": "You all probably know that OpenPrinting is all about reproducing graphical content from a computer on paper or similar flat surfaces. The hardware to do this contains more or less sophisticated mechanics to precisely position pixels on the surface of the output media. And this hardware is usually only affordable because it is produced in an industrial mass-production process and because its ink or toner refills are expensive ... Did you already think about why one does not construct a machine which puts the ink onto the paper like a human being, with an arm and a pen? Some kind of hand-writing machine, controlled by a computer? Have you perhaps already thought about building such a machine by yourself, from simple, cheap parts, much cheaper than the cheapest available printer? Did you already think about a huge conference hotel where you find free refills in each guest room and even more in the meeting rooms? On the first Ubuntu Summit in Prague this got reality: Daniele Procida, Canonical's Engineering Director for Documentation, is the creator of the Brachiograph (Ancient Greek: \"Brachio\" = arm, \"Graph\" = writer -> arm writer), a plotter made from a Raspberry Pi, 3 servos, and some household/office items, worth a total of ~12.50 EUR. He demoed the device at first on Monday and on Tuesday, it was the attendee's turn to build this device, in a 90-min interactive workshop. Originally Daniele only submitted the 25-min demo session to the Call for Proposals, but when I was reviewing submissions (I was in the organization committee of the Summit) and found his proposal I immediately contacted him, suggesting him to also submit a workshop, where attendees can actually build this device, and Daniele liked my suggestion and submitted the workshop. So I wrote another nice, positve review ... and got able to build such a plotter myself! So the workshop has taken place and I was so lucky that it was not to the same time as any of the 4 sessions where I was speaker/host of, so I actually attended it: Master of the Brachiograph Daniele Procida, master of the Brachiograph, explaining the wiring Shoulder and material The shoulder motor is already mounted on the base board, the other parts you see on the left Forearm The assembled forearm, with elbow motor on the left, clothes peg to hold the pen on the right, and wrist motor (pen up/down) at the top Assembling Putting it all together: Here the forearm gets fitted to the elbow Calibration The motors are wired to the Raspberry Pi now and the plotter gets calibrated with the help of a template sheet Plotting a photo And finally, photos turn into pieces of art!! The software running on the Raspberry Pi which controls it is completely written in Python and includes everything needed, especially also the functionality for calibration of the device and for converting raster images/photos into a line plot. Unfortunately, it does not contain a CUPS driver or even a Printer Application, but the simple mechanics, flex, non-linearity of the servos, hysteresis, and the fact that it is not able to plot straight horizontal or vertical lines, probably leave not enough precision anyway to plot things like normal-sized text in readable quality anyway ... Nevertheless it is an ineresting experience seeing this device plotting pictures and what it makes out of a photo is some kind of art ... And it is a low-budget first experience with robotics, not needing any expensive/sophisticated equipment, workshops, engineering skills ... All details you find on Daniele's web site, and as Daniele is Canonical's master of documentation it is all well described and easily understandable (and you see that it follows Daniele's Diataxis principle). Update: Recordings of most of the sessions are on YouTube. Unfortunately there were problems with the A/V in the breakout rooms (Karlin 1-4) on the first day and we could only use the recordings of 4 sessions there, from the ballroom we have recordings of all sessions. From the other days we could provide the recordings of all sessions. Note that we did not record the workshops, as they were highly interactive and watching them after the fact does not make much sense. Now I am back from Prague after 5 days of the Canonical-internal Engineering Sprint and 3 days of the Ubuntu Summit. All the hard work I had with it, promoting it, participating in its organization, creating and organizing the Snap tutorial workshop series, and preparing my 4 sessions really worked out and we ended up with an awesome conference! Back in March in Frankfurt, one Engineering Sprint earlier (Canonical does it twice a year, once per Ubuntu release), Ken VanDine (head of Canonical's Desktop Team, as long on GNOME as me on printing) gave a 5-min lightning talk announcing that, 10 years after the great era of Ubuntu Development Summits (UDS) ended, we are returning to have a conference with the community, this time calling it Ubuntu Summit (as there are more than only developers contributing). In that time the Summit was planned to be held in Vienna, Austria. I was already planning to go to the Linux Application Summit (LAS) in Rovereto, Italy to give a talk about the New Architecture and what needs to be done for it in the desktop environments. And as I am living in Vienna (so it had been a home game for me) I came to the idea to announce it on the LAS (Ken did not go there), the first time on a publicly accessible conference. A few weeks after Frankfurt Canonical's plans changed and Sprint and Summit were moved to Prague, but once formed my idea of the announcement I stayed with it and gave a 10-min lightning talk, an enhanced version of Ken's original one. Mid-July, 2 weeks before this year's GUADEC we formed the organization team for the Summit and had our very first team meeting via Google Meet. Mauro Gaspari from Canonical's Community Team was leading the organization and I was also in the team. Mauro was interested in my OpenPrinting work and conference and community experience with it and also in my UDS experience and asked me for staying in the line after the meeting. This led us to 3:30-hour 1:1 conversation (and for Mauro living in Taiwan it was midnight to 3:30am). I especially liked that the conference got as one of its session formats interactive workshops where the audience does exercises on their own laptops. So I ended up giving the ideas of doing a Snap tutorial workshop series with intro panel session, but also an OpenPrinting Community panel session, and a lightning talk about saving legacy printers on Windows via WSL. And all these ideas I turned into reality. So we all started reviewing submissions like hell, and I also started organizing the Snap tutorial workshop series. First I created some nice titles, for the whole thingie \"Your application everywhere, just in a Snap!\", for the starter tutorial (given by Heather Ellsworth, nick \"hellsworth\") \"Snapping like hell(sworth)\", and for my workshop \"Daemon Snapper's Workshop\". Then I had to line up teams, once the speakers for the workshops and second, the panelists for the Indaba-like intro, and in the end colleagues got tired of my inquiries on our internal chat channel of the Desktop Team ... And probably the organizers did not originally plan to pro-actively design sessions and sub-conferences and then search for speakers for them ... And my participation in the organization had also some nice side effects and by-products. Once asking around for workshop speakers in the community I asked Frederik Feichtmeier whether he would do the one about snapping Flutter apps. He declined as he is not into snapping, but picked up on the workshop idea and submitted \"How to build an Ubuntu Flutter Desktop App like LEGO\". Together with the actual snapping-Flutter workshop and another Flutter workshop independently submitted I \"accidentally\" created a Flutter workshop series ... And I have initiated the \"Let's build a pen-plotter\" workshop, too ... (see above). So I was the initiator of 6 workshops on the conference and I by myself was supposed to be on stage with 4 sessions (Snap intro panel, \"Daemon Snapper's Workshop\", OpenPrinting Community panel, WSL lightning talk) and this created a nice puzzle game for Philipp Kewisch, community manager at Canonical, who scheduled all the sessions, having to take care to have everything in the right order and no one of the speakers having to be cut apart to give two sessions at the same time ... For the OpenPrinting Community panel (\"OpenPrinting - Join the team to make printing just work!\") I also wanted to line up Aveek Basu (OpenPrinting Program Manager) and one or another GSoC mentor/contributor from India, but they were not able to obtain a Schengen visa to visit Prague. But fortunately, during the aftermath of this year's GSoC, I found out that Deepak Patankar, one of the mentors (and GSoC contributor 2018), moved to Amsterdam 2 months before the Summit, and so being in the EU already can freely travel to Prague! So I immediatly asked him whether he would like to come and I asked the organizers whether Canonical would pay, all 10 days before the Summit started, and all worked out and he joined the panel in-person! And Aveek could participate remotely. E-mail threads pre-interviewing the guests of both panel sessions to find out about what they will tell more or less and also discussing the flow of the sessions followed. Finally travelling to Prague I had the opportunity to meet all my colleagues already a week before the Summit on the Engineering Sprint. Usually serving for planning the next Ubuntu release, Lunar Lobster (23.04), the Sprint was for me mostly doing the final preparations for the Summit ... Especially worried about hosting panel sessions for the first time I had a working lunch with Heather Ellsworth, master of the Indabas, Mauro, and Philipp, and I also had a pre-meeting with the panelists of the Snap intro. I also had a meeting with all the speakers of the Snap workshops to coordinate the workshop content. Even the non-Canonical participants joined the meetings by Google Meet. And having brought along my tripod and my external webcam for these pre-meetings I was also able to enhance the November Ubuntu Desktop Team Indaba (about the Ubuntu release process) which was held in-person on the Sprint. Instead of the 4 participants sitting next to each other in the same room looking into the built-in webcams of each one's laptop, making up 4 frames with the same background, I have put the tripod with the external webcam in front of the 4, connected it to Heather's laptop, and so we have all the 4 in one single frame, conveying the in-person character of the Indaba! Playlist of all recordings on YouTube. Update: Impressions of the event: The Aftermovie! On the Sunday before the conference, in the morning, Deepak arrived and I had a walk through Prague with him and in the evening then we all met on the pre-conference reception in the rooftop bar of the hotel, finally getting together with all the friends and (former) colleagues from the Linux community, including those I have given a nice review for their submission and those I have lined up for the Snap series. And you remember me writing here three months ago about Heather Ellsworth introducing me to others back in 2019 (\"This is Till, making printing just work, on ...\")? Now she introduced me to Cassidy Blaede: This is Till, he makes printing just work, on any platform. On Monday, in the opening plenary by Philipp Kewisch and Mark Shuttleworth (recording on YouTube) my lightning talk about saving legacy printers under Windows was prominently mentioned but there was no mention at all of my Snap tutorial workshop series! Really a bug! So after Oliver Grawert's plenary talk \"An Ubuntu for a 10 ton steel press and your window shades, UbuntuCore at a glance\" (recording on YouTube), at the end of its Q&A, I grabbed the mic and shouted out my tutorial track. Was it not part of my work in Canonical's Desktop Team to fix bugs? Your app everywhere, just in a Snap!: On the Indaba-like intro panel (recording on YouTube) there were not only me as the host and Heather Ellsworth, Ken Vandine, Sergio Schvezov, Dani Llewellyn, and Graham Morrison as the invited guests, but Gustavo Niemeyer and Zygmunt Krynicki entered the panel as surprise guests, with Gustavo having originally declined my invitation to be on the panel due to the fact that he was not much involved in Snap any more. The conversation was going by itself and I did not need to ask much. The room was rather full during the session, in contrary to what I am used to on printing-related sessions on conferences. So my first panel session with me as the host was a success. The Snap tutorial workshops: After the intro panel there were 5 workshops taking place throughout the conference to learn snapping (packaging applications as Snaps). Those who never snapped in their lives were supposed to attend one of \"Snapping like hell(sworth)\" or the robotics/IoT-oriented \"Robotics and IoT deployment with snaps Workshop\" and those having attended one of these or already having basic snapping knowledge could attend the advanced workshops \"Daemon Snapper's Workshop\", \"Snapping desktop applications\", and \"Deploying Flutter apps on Linux Desktop\". The workshops are not just longer talks, they are interactive, attendees do exercises and examples on their own laptops. Unfortunately, in some tutorials attendees had problems setting up their systems, mainly due to the fact that everyone has another operating systen on their machines, but otherwise all was working fine. We should better have used the OS container/VM launcher Workshops for the workshops. Daemon Snapper's Workshop: My workshop which I did together with Sergio Cazzolato from Canonical's snapd team, was all about snapping daemons/system services. With my experience on snapping CUPS, ipp-usb, and Printer Applications I have decided that I give this workshop. I organized most of the workshop, creating its content and slide deck and Sergio coded the exercises based on my idea to create a super-simple daemon just receiving raw data on a network port and dropping it into a file, like a network printer listening for raw job data on port 9100 (on GitHub: Exercise, Completed). It was a success. The room was full and it seems that the attendees had the required pre-knowledge and also set up their systems appropriately, so that they could do the exercises right away. We also got some help on answering questions from Heather Ellsworth and Zygmunt Krynicki being in the room at least during a part of the time. OpenPrinting Community Panel on Ubuntu Summit 2022: After having a pre-meeting in-person Monday night on the Summit with Zdenek Dohnal from Red Hat and last-minute guest Deepak Patankar the session itself took place on Wednesday, an Indaba-like panel (recording on YouTube) with me as the host and Zdenek Dohnal (Red Hat/OpenPrinting), Johannes Meixner (SUSE), and Deepak Patankar (OpenPrinting) as in-person guests and Aveek Basu (OpenPrinting) as remote guest. Unfortunately, it had only low attendance but people liked it, especially Oliver Smith, Product Manager Ubuntu Desktop, participated well in the discussion and also Liam Proven from The Register was there. Save Legacy Printers under Windows with WSL and Printer Applications on Ubuntu Summit 2022: My lightning talk (slides, recording on YouTube) about Carlos Nihelton's OpenPrinting HOWTO to save legacy printers was perhaps the greatest success of all my 4 sessions. Many people came up to me praising this idea and it also got an article in The Register by Liam Proven! Also Craig Loewen from Microsoft attended it and liked the idea a lot! At the end of the talk I called Carlos Nihelton and Dani Llewellyn onto the stage to express my special thanks to them. Yes, we are sustainable! I also met a lot of people from the community, often old friends and colleagues, attended many great sessions, by Oliver Grawert about Ubuntu Core and Snap (recording on YouTube), by Craig Loewen from Microsoft about WSL (recording on YouTube), the production of a podcast (recording on YouTube, the published podcast) by the Linux Lads (they took my e-mail address for a possible OpenPrinting episode), playing with Mini Pupper, the little four-legged robot, building a pen plotter (see above) ... And especially I had a cute hallway session with KDE developer Harald Sitter and he wants to improve the user interface of the Qt print dialog. See below ... And I met Martin Wimpress (Ubuntu Mate, former head of the Canonical Desktop Team) and learned about his project to create an Ubuntu flavor named \"Butterfly\", with an all-Flutter desktop ... Thanks a lot to Mark Shuttleworth to initiate the revival of the Ubuntu Developer Summits as the new Ubuntu Summit. Thanks to Ken VanDine to promote this project. Thanks a lot to Mauro Gaspari, Philipp Kewisch, Heather Ellsworth, Igor Ljubuncic, Nathan Haines, Oliver Smith, Adam Szopa, Sarah Craddock, Claire Newman, and others for organizing this great Summit!! Thanks a lot to Mauro Gaspari to have the 3:30-hour 1:1 meeting with me to exchange ideas about what to do on the Summit. Thanks to Heather Ellsworth, Ken VanDine, Sergio Schvezov, Dani Llewellyn, Graham Morrison, Gustavo Niemeyer, and Zygmunt Krynicki to be my guests on my Snap intro panel. Thanks to Heather Ellsworth, Dani Llewellyn, Guillaume Beuzeboc, Sergio Cazzolato, Olivier Tilloy, Scarlett Moore, and Carlos Nihelton for being the speakers on the 5 awesome Snap tutorial workshops! Thanks a lot to Zdenek Dohnal, Johannes Meixner, Deepak Patankar, and Aveek Basu to be my guests on my OpenPrinting Community panel. And thanks to Heather Ellsworth, Mauro Gaspari, and Philipp Kewisch for their work lunch with me to learn about how to run an Indaba-like panel session. It helped me a lot for hosting my first two panel sessions. Special thanks to Mauro Gaspari and Aaron Prisk for their great work on editing the recordings of all the sessions, and saving most of them, especially also my Snap panel. Also thanks to everyone participating in any form on the Summit and making it an exceptional event!! The videos of the sessions on the Linux Plumbers Conference 2022 in Dublin are edited and ready for watching! Especially the recordings of the OpenPrinting micro-conference are available now: CUPS 2.5 and 3.0 Development Testing and CI for OpenPrinting projects Restricting access to IPP printers with OAuth2 framework Documentation for OpenPrinting projects Sandboxing/Containerizing alternatives to Snap for Printer Applications Note that the documentation session finished early and we already started on containerization in the documentation time slot, so therefore some of the containerization talk and discussion is in the video of the documentation session. I have also updated the summary of the outcome of our Micro-conference in our September News Post with the links. The program will take place again next year! Also the timeline is already published. And I will participate again with the Linux Foundation and OpenPrinting, there is enough on our roadmap. Also we started already with the selection and onboarding of the first contributor candidates. Potential project ideas are: Adding support for the new functionality/attributes of IPP Everywhere 2.x to PAPPL, libcupsfilters, Common Print Dialog Backends (CPDB), ... CPDB backend for IPP infrastructure/cloud printers Turn cups-browsed into a Printer Application Native Gutenprint Printer Application - Take 2 CI Testing programs for libcupsfilters, libpappl-retrofit, libppd, CPDB, ... Note that the need of GUI/Desktop integration for printing with OAuth2 is still to be discussed, as in 2023 the IPP/OAuth2 standard will be significantly enhanced as in the current incarnation essential featues are still missing. Here are the final results of this year's Google Summer of Code. We got a lot of work done! GNOME Control Center GUI for discovering non-driverless printers and finding suitable Printer Applications for them Contributor: Mohit Verma Mentors: Till Kamppeter, Michael Sweet, Pranshu Kharkwal, Divyasheel, Deepak Patankar Work Product PASSED Create new printer setup tool for the GNOME Control Center Contributor: Shivam Mishra Mentors: Till Kamppeter, Pranshu Kharkwal, Divyasheel, Deepak Patankar Work Product PASSED Adding Common Print Dialog Backends (CPDB) support to existing Print Dialogs Contributor: Gaurav Guleria Mentors: Till Kamppeter Work Product PASSED Scanning Support in PAPPL with eSCL Support Contributor: Rishabh Maheshwari Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar Work Product PASSED Scanning Support in PAPPL Contributor: Deepak Khatri Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar Work product not delivered. FAILED Converting Braille embosser support into a printer application Contributor: Chandresh Soni Mentors: Till Kamppeter, Samuel Thibault Work Product PASSED Add Avahi calls for discovering and resolving driverless IPP printers and Optimize the processes Contributor: Sachin Thakan Mentors: Till Kamppeter, Michael Sweet, Deepak Patankar Work Product PASSED Make a native Printer Application from Gutenprint Contributor: Sahil Kumar Dhiman Mentors: Till Kamppeter, Solomon Peachy, Michael Sweet Failed already on mid-term. FAILED In all the evaluations the contributors submitted, both mid-term and final, they praised their mentors, especially me, and also the work at OpenPrinting. Thanks a lot to all the contributors for their great work and also to the mentors for guiding our contributors through their projects. Also thanks a lot to Aveek Basu for contacting universities and colleges in India to find these amazing contributors. Organizing an amazing Ubuntu Summit and mentoring a great team of GSoC contributors is much more exciting work than the tedious clean-up of thousands of lines of code. This is probably the reason why the release got delayed ... ... but now, finally it is done: The first beta of the new generation of cups-filters is available! The cups-filters project is now split into several parts, similar to CUPS on its transition to the 3.x series. There are the following parts: libcupsfilters: The central library with the filter functions and some useful functions for printer drivers, human-readable strings and translation handling for IPP attributes, ... It does not contain any support for PPD files. libppd: PPD file support library providing the complete support for PPD files from libcups (2.x and earlier, see ppd/ppd.h), the CUPS PPD compiler and utilities (ppdc, see ppd/ppdc.h) and functions to convert PPD options into IPP attributes, to add PPD file support to the filter functions of libcupsfilters, to handle collections of PPD files, ... This library is only for legacy PPD and driver support, it should not motivate anyone to create new PPD files! cups-filters: Legacy CUPS filter/backend executables for CUPS 2.x. Uses both libcupsfilters and libppd. Any XXXtoYYY filters, foomatic-rip, driverless, ... braille-printer-app: The Braille embosser driver code plus Chandresh Soni's GSoC work to turn this code into a Printer Application. cups-browsed: Daemon to automatically create local print queues for network printers and remote CUPS queues and to create printer clusters. Will be turned into a Printer Application later (GSoC project?). libcupsfilters is completely free of PPD file support, same for braille-printer-app. libcupsfilters can be used for all kinds of Printer Applications and wherever print data or scanned data has to get converted. The Braille Printer Application is a native Printer Application, it does not use PPD files internally. libppd contains the complete PPD file support for Printer Applications which retro-fit PostScript PPD files or classic CUPS drivers. These Printer Applications are usually created based on pappl-retrofit. Distributions using the New Architecture for printing and scanning will not install libppd by default, as it is not needed any more. cups-filters provides the filter executables needed by CUPS 2.x or earlier. Most executables are just simple wrappers and all the internal workings have moved into the filter functions in libcupsfilters, and the PPD file support into libppd. This package requires libppd, but it is for PPD-based classic CUPS versions only anyway. cups-browsed is currently supporting and generating PPD files (for CUPS 2.x), and therefore also depending on libppd. In a later version, when it is turned into a Printer Application, the PPD file support will be removed. An important goal of the separation is to put all PPD support into their own project so that it can get discontinued later and this way we can easily stop maintaining the PPD file support code while all the other useful code of the former cups-filters will live on. libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got committed. Now all the code cleaning is done (filter/, backend/, and utils/ were still missing) and the license/copyright headers of all the files (both code and non-code files, like PPDs, *drv, MIME rules, ...) are switched to the new Apache 2.0 license (same license as CUPS). Also the source package documentation files (README.md, INSTALL, CHNAGES.md, COPYING, ...) got updated, new documentation files (DEVELOPING.md and CONTRIBUTING.md), and the new license files (LICENSE, NOTICE) got added. After that the actual separation has taken place. Studying how to best do the separation, especially conserving commit histories and avoiding clutter, I found this method on GitHub and the git-filter-repo tool. I did the separation thoroughly, one part at a time, with a lot of testing whether everything still builds and no files get missing or duplicate, did final adjustments in the source package documentation files, and released 4 of the 5 parts. And for the first time I assigned a GitHub discussion thread to each release. Now I need to also release pappl-retrofit and update the 4 retro-fitting Printer Application Snaps which currently do not build any more. In a hallway session on the Ubuntu Summit I talked with Harald Sitter from KDE about my GUI GSoC work for OpenPrinting, especially of Gaurav Guleria's project of switching both GNOME/GTK and KDE/Qt print dialogs to the Common Print Dialog Backends and also about that this does not change the GUI of the dialogs and the GUI of the Qt dialog is still of the early 2000s when the switchover to CUPS happened. Harald told that he wants to improve/modify the GUI and we agreed on getting at least a design similar to the GTK dialog. After being back from the Summit I sent him my OpenPrinting onboarding materials. From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|850874| |ipp-usb|ipp-usb|3106| |ps-printer-app|PostScript Printer Application|2660| |ghostscript-printer-app|Ghostscript Printer Application|2070| |hplip-printer-app|HPLIP Printer Application|6440| |gutenprint-printer-app|Gutenprint Printer Application|5193| Note: The installed base of the CUPS Snap sky-rocketed to ~850000 (factor of 10) due to the switchover of the Chromium browser Snap to plugging the cups interface. Now all Chromium Snap installations auto-install the CUPS Snap as dependency. Currently released is 2.4.2. There will be further bug fix releases in the 2.4.x series. In the last month there were mainly typo fixes in comments and other minor fixes, nothing in the actual code of CUPS. Ubuntu Lunar Lobster (23.04 will use some 2.4.x or 2.5.x release of CUPS. It is planned to use the Snap package of CUPS. The CUPS Snap (in the Edge channel) and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. The CUPS Snap in the stable channel is version 2.4.2. Currently released is 2.0b1. The first beta (2.0b1) of the second generation of cups-filters is now released. cups-filters is now split into 5 separate packages. See above for more details. cups-filters 1.x releases can happen depending on need of the ditros. Ubuntu Lunar Lobster (23.04 will use the New Architecture and with this use 3.x packages of libcupsfilters, libppd, cups-filters, braille-printer-app, and cups-browsed. CUPS will be included as Snap. The CUPS Snap is currently locked to the /e496badbf2 commit (from May 20) of cups-filter's GIT master (2.x) until the restructuring gets more tested. This lock will get lifted soon. The Printer Application Snaps use the current GIT master of cups-filters and currently do not build. They need to get adapted to the split repositories. Currently released is 1.2.3. In the last months the development of the 1.3.x series has already started. See changes below. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-November-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - November 2023",
+ "url": "/OpenPrinting-News-November-2023",
+ "headings": [
+ "Ubuntu Summit 2023 in Riga",
+ "FOSDEM 2024",
+ "Google Summer of Code 2024",
+ "Google Summer of Code 2023",
+ "Snap workshops",
+ "CPDB CUPS backend Snap",
+ "PAPPL 1.4.3"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/TtsglXhbxno/hqdefault.jpg",
+ "snippet": "Ubuntu Summit 2023 in Riga, FOSDEM 2024, GSoC 2024, GSoC 2023, Snap workshops, CPDB CUPS backend Snap, PAPPL 1.4.3",
+ "content": "Probably most of you have made their first desktop computer experience with Windows, and later on started working with a Linux desktop system. Many of your daily tasks which you formerly did under Windows you are doing under Linux now. Some work great, for others you wish your Windows back ... But having a look at this (stone-old, from Dec 2021) Linus Tech Tips video and especially Michael Tunnell's reaction video, printing is not the part where one wants to have Windows back. At 3:00 min Michael says There is no such thing like a pain-free experience of printing under Windows ... Linux printing is ridiculously good ... and at 14:25-17:25 min we get the confirmation that one can effortlessly print even with an oooold, non-driverless Samsung CPL-something ... Thanks Michael, I am looking forward to our Destination Linux episode ... But there is more on YouTube, this time on Ubuntu OnAir. After the Ubuntu Summit I have stayed in Riga for one more week, for Canonical's internal Engineering Sprint where all the engineers of Canonical, around ~700 people currently, meet twice a year, near the beginning of each Ubuntu development cycle. In addition to meetings inside and across the teams there are also lightning talks and workshops open for everyone on the Sprint. I have given two sessions this time, both not containing anything Canonical-confidential and so I got the permission to publish the recordings on Ubuntu OnAir. Here we go: Lightning talk: Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! Interactive workshop: Your app everywhere, just in a Snap! And last but not least, we have a nice video of the Ubuntu Summit 2022 in Prague, the Aftermovie, published shortly before this year's Summit as motivation to attend. And we have good news for users of NixOS: Now Snap is supported and so you cannot only install many application Snaps from the Snap Store but also our Printer Application Snaps to make all those ~10000 non-driverless legacy printers which are already working with common classic Linux distributions also just work with NixOS. And everyone is providing an advent calendar these days, unfortunately we did not make one at OpenPrinting, but there is one from the Ubuntu Summit 2023! See below ... So let us dive into what happened at OpenPrinting in November ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Update: Complete playlist of all 88 sessions! Recordings from the plenary room: Day 1, part 1, Day 1, part 2, Day 2, Day 3 And here is the Ubuntu Summit Advent Calendar: Recordings of the individual sessions in all rooms will be posted from today on until the end of this year on the Ubuntu Summit 2023 playlist on Ubuntu OnAir. Open 3 new videos every day (workshops on Wednesdays) for the coming 30 days. They are all edited by a professional editing team. Mastodon: #UbuntuSummit, #UbuntuSummit2023 Now it has taken place, the second Ubuntu Summit, this year in Riga in Latvia, and we in the organization team are already making our first thoughts on the third one ... Two and a half days of amazing sessions in 5 rooms in parallel. The speakers on this second edition were less Canonical employees but more people from the wider community, and not exactly an Ubuntu Summit but more a Summit about Linux and free software in general. Sessions Still making well use of the hallway track I succeeded to attend many sessions, most of those I originally planned to attend and listed last month here: Welcome to the Ubuntu Summit, Philipp Kewisch (Head of Community Team, Canonical), Mark Shuttleworth (Founder and CEO, Canonical), Nathan Haines (Ubuntu Community Council), Fri 11/3, 14:00 EET (video) From origins to open source: The journey of DreamWorks Animation's production path tracer, MoonRay, Randy Packer (DreamWorks Animation), Fri 11/3, 15:00 EET (video): Amazing presentation, with sample movie in the following break. Introducing Ubuntu Core Desktop, Ken Vandine (Core Desktop development lead, Canonical), Oliver Smith (Product Manager Desktop, Canonical), Fri 11/3, 16:30 EET (video): Nice overview of the state of the art of the development of Ubuntu Core Desktop, and Ken shouted me out when it came to the printing part, I got up and the audience applauded ... I have also answered the first user comment on the YouTube video of the recording. Alioli ROV Submarine Drone, Juanmi Taboada, 11/3, Fri 17:00 EET (video): How a remote-controlled submarine to explore and photograph potential SCUBA diving sites was developed and all being controlled with free software. And the next day there came the surprise event: We all could test-d(r)ive it in the hotel's pool (only 1.30 m deep, so no risk to implode it) ... What It's Like to Build an Open, Repairable Laptop, Daniel Schaefer (Framework Computer), Sat 11/4, 9:00 EET (video): We are sustainable! Last year we have recycled old printers and this year we have easily repairable and practically arbitrarily upgradable laptops on the Summit. I also had a hallway session with Daniel afterwards and he was demonstrating how easily hardware components could get changed. Windows Subsystem for Linux (WSL) - Make an awesome Linux environment directly on Windows, Craig Loewen (Microsoft), Sat 11/4, 9:30 EET (video) Improving Snap maintenance: Automating tag updates on new upstream releases of the app - Interactive workshop, Till Kamppeter (Canonical/OpenPrinting), Jesús Soto (Canonical), Sat 11/4, 12:00 EET (video, slides): My workshop about Snap update automation. Also Sergio Costas and Ken VanDine, both passionate snappers in the Ubuntu Desktop Team at Canonical, and Sergio having worked together with Heather Ellsworth on the automation method I have presented in this workshop, were in the room in case people need help on the exercises. Container craftsmanship: from a Pebble to a ROCK - Interactive Workshop, Cristovão Cordeiro (Canonical), Sat 11/4, 14:00 EET (video, slides, exercises): Right after my workshop there was a workshop for snapcraft-experienced snappers to learn packaging apps in OCI containers using rockcraft. I attended it as this could be a way to create an official OCI container of CUPS, based on the CUPS Snap. And the way how upstream software components are loaded for the container build is exactly the same as with snapcraft, so applying update automation here would require only modifying a few lines. Skynet or Star Trek, what’s the future of AI? - Panel session, Graham Morrison (host, Canonical), Andreea Munteanu (Canonical), Craig Loewen (Microsoft), Frank Karlitschek (Nextcloud), Juan Luis Cano Rodríguez (QuantumBlack, AI by McKinsey), Pablo Ruiz-Múzquiz (Kaleidos/Penpot), Sun 11/5, 9:00 EET (video) ScaniVerse: A New Horizon in Unified Scanning for Linux Systems Akarshan Kapoor (Indian Institute of Technology, Mandi, India), Sun 11/5, 11:30 EET (video): Akarshan presenting his GSoC work of this year in his own, special style. I have been in his talk especially also to help answering questions and I have remarked in the end that one should be careful with making the MetaScan frontend send the user's Scan to external internet services for analysis, for privacy reasons. Bringing Windows applications to Linux app stores, Merlijn Sebrechts (Ubuntu Community Council, Snapcrafters), Sun 11/5, 12:00 EET (video): WINE allows to run many Windows apps under Linux but needs some configuration and setup work. To make it easy for end users to simply grab Windows apps in the Snap Store, there is Sommelier, which this talk was about. I asked Merlijn what about having a \"app loader\" Snaps using Somellier which do not contain the (often proprietary) app but just load it from the Windows file system to run it uner Linux. He told that this is already possible, especially with Bottles and Lutris (31:48 min). Behind the Scenes of tox: The Journey of Rewriting a Python Tool with Over 10 Million Monthly Downloads, Jürgen Gmach (Canonical), Sun 11/5, 14:30 EET (video): Jürgen is nearly as long into free software as me, I started with SUSE 5.1 in 1997, he two years later with SUSE 7.0. Linux Lads live podcast recording, Shane, Mike, Conor, and Amolith (Linux Lads Podcast), Sun 11/5, 16:00 EET (video, actual podcast): This was great, the Linux Lads podcast produced live with audience interaction. I have taken a first-class seat (first row), with these signs \"content creators only\", but hey, this news post is content, and my talks and workshops on conferences, too, and so I was close to them and contributed. At 20:40 min I give an example how meeting on conferences causes actions and tell why the Linux App Summit 2024 will take place in Monterrey, Mexico, and at 45:25 min I give an example how conference attendees come well equipped for winter weather. Closing Plenary, Philipp Kewisch (Head of Community Team, Canonical), Sun 11/5, 17:30 EET (video) Hallway Track But most important of all is the hallway track (including any evening outings, meals, bar hangouts, ...). For me it started already one day before the official opening of the Summit, as I traveled already on Thursday, the day before the event started, to make sure to be there in time, even if the airline messes up my flight. I had an early morning flight, directly from Vienna to Riga, and there I met already Andrei Iosif of Canonical's Security Team. So this was not actually a hallway session but more an inflight session. We happened to have seats close to each other and swapping with one other passenger we were sitting together. He told me about Fuzz testing, a special method to test software with random input to find crasher bugs, buffer overflows and similar which can cause severe security risks. He introduced me to Google OSS-Fuzz a free-of-charge service for free software projects and the possibility to fuzz-test OpenPrinting projects. I arrived in the hotel at lunch time, and so I already attended the hallway track of the last days of Canonical's internal Product/Roadmap Sprint, where Canonical's managers meet twice a year for one week each time. So several colleagues from Canonical I have met already there and this way got more time to meet old and new friends from the community on the actual Summit days. Thursday evening I finally met with non-Canonical people for the first time on this trip. We had dinner in the old town of Riga, mainly colleagues of Canonical's Desktop Team, like Ken VanDine, Sebastien Bacher, Jesús Soto, Jean-Baptiste Lallement, ... also Jürgen Gmach of the Launchpad Team, but also several non-Canonical people, as for example Alan Pope (\"Popey\") or Martin Wimpress (\"Wimpy\"). And on Friday at lunch time, right before the start of the event I met Akarshan Kapoor, GSoC contributor on PAPPL Scanning (see below) and Monica Ayhens-Madon, formerly in Canonical's Community Team and currently at Thunderbird (LAS 2022, Ubuntu Indaba, Community Office Hours). Monica hugged me saying that this is a hug from Heather, and so I hugged her back, telling her to pass this hug back to Heather. On the event I had several nice hallway sessions: Daniel Schaefer demonstrating the repairability and upgradeability of Framework laptops, everything held together by magnets and screws which do not fall out when unscrewed, no soldered-in RAM, everything modular to separately exchange and upgrade, even while the machine is turned on and running ... Popey (Alan Pope) is proudly presenting his Steam Deck running Ubuntu Core Desktop, naturally hanging out a lot with Ken VanDine therefore. We had a little Raspberry Pi demo table during the whole conference, right in front of the door of the plenary room, with a Pi (4 or 5) connected to a large monitor, a keyboard and a mouse, and different things were shown there: Ken VanDine was naturally showing off Ubuntu Core Desktop on the Raspberry Pi 4 (did not work yet on the 5, Ken spent nearly the whole Engineering Sprint in the week afterwards to get this finally going). And our gamers one also found often enough showing off their work on the Pis. I met Diogo Constantino from the Ubuntu Portugal local community and we exchanged ideas about combining DebConf 2024 and UbuCon 2024, holding both, one after the other in Aveiro in Portugal. Originally DebConf should have taken place in Haifa in Israel, but this got canceled and the Call for Locations re-opened. Noah J. Chelliah met me on the hallway and asked me for an interview, for his \"Ask Noah\" podcast. So we immediately went to an unused conference room for a \"Noah asks\" and we recorded the interview, me telling him about OpenPrinting, how it started and what we are doing. The interview will get put into one of the next shows, but he told that he also interviewed more people, so it can take some weeks until it is my turn (Update: It will be episode 368 due on Tuesday, December 20, ~11:59pm UTC). Amolith (from the Linux Lads) has created scripting to get informed about new releases of software running on his server, Willow, and it seems that it covers more types of upstream release notifications than our Snap update automation, so I have a way to improve the Snap automation if needed. Monica Ayhens-Madon came up with a little penguin which she has bought in the old town of Riga and wants to give it to a good friend who collects penguins (Update: It is Jill from Destination Linux), but first, gave it a tour on the Summit, taking a lot of photos with many interesting people. See her thread on Mastodon (Update: The penguin has safely arrived at its Destination (Linux)! Thanks, Mathieu Comandon! Jill's thread on Mastodon, Jill's LWDW/linuxgamecast video). When leaving the closing plenary, Michael Tunnell from TuxDigital and one of the hosts of Destination Linux grabbed me in the crowd leaving the plenary room and invited me for an interview in one of the next episodes of Destination Linux (Update: The interview has been produced now and will be on the road as episode 351 from Monday, December 18, ~10pm UTC on). And during the closing party I met Graham Morrison, master of the Snap/snapcraft documentation at Canonical, and suggested to him to put up all my Snap workshop materials (slides, exercises, video links) onto the snapcraft.io web site for people to learn Snap or to give the workshops on more conferences, and he liked the idea ... See below. Blogs and podcasts Naturally there are many content creators, bloggers, podcasters, YouTubers, ... on such an event, and so we already have some nice stuff to read, listen to, and watch (taken from the internal list of the organization team): Akarshan Kapoor on dev.to The Ubuntu Summit 2023: Akarshan Kapoor, excellent GSoC contributor on scanning support in PAPPL this year and co-organizer of the Opportunity Open Source, attended the Summit and presented his GSoC work, and wrote a great blog article about the Summit, starting with his talk getting accepted, his travel to Riga, the people he met, ... he has really amazed us with this blog in his special style. I have left a nice comment on it, also to give readers a background about the great things which Akarshan did. Alan Pope Blog Heading to Ubuntu Summit 2023: Alan Pope (\"Popey\") announcing that he will attend the Summit. He also tells about what the former Ubuntu Developer Summits were and what the Ubuntu Summit 2022 was. Ubuntu Summit 2023 was a success: Popey's report from the Summit. He speaks positively about many aspects of the Summit, especially the organization, the choice of talks, the hallway track, Raspberry Pi vs. games and Ubuntu Core Desktop, gaming night. Ubuntu Core Snapdeck: Popey tells about Ubuntu Core Desktop running on his Steam Deck, what he was proudly presenting on the hallway track of the Summit. The Register Canonical shows how to use Snaps without the Snap Store - Despite what you may have heard, it's not as proprietary as the trolls think: Our special vulture, Liam Proven, talked with Igor Ljubuncic about Snap and the Snap Store and how to install Snaps without Canonical's Snap Store. Near the end he gives examples how Canonical is publishing how Snap works and how to use it, including a link to my workshop about Snap update automation. Ubuntu for Arm64 laptops (plus RISC kit) - Did you know there's an Asahi flavored Ubuntu? And Debian, too: Here the vulture writes about the talks about Ubuntu on non-amd64 platforms, Arm, Apple silicon (Asahi), RISC-V, ... Canonical reveals more details about Ubuntu Core Desktop - This new entrant in the immutable space is not a replacement for ordinary Ubuntu: And the vulture has also attended Oliver's and Ken's talk about Ubuntu Core Desktop and writes about this distro, including Popey's demoing on the Steam Deck in the hallway track. Ubuntu Budgie switches its approach to Wayland - Elementary OS going full speed ahead, but Parachutist Parakeet considers a new, post-Enlightenment glide path: And as last year, the vulture provided us with 4 articles! He met David \"Fossfreedom\" Mohammed and Sam Lane from Ubuntu Budgie and talked with them about how it will get switched over to Wayland. Destination Linux Video PodCast Episode #346: A very good recap of the event, target audience, extra fun activities. Episode #347: Interview with Simon Quigley starts with a very good review of the Ubuntu Summit. Focus on importance on networking, community, and great talks. Michael Tunnell on YouTube Ubuntu Summit 2023 Day -1 & 0 Day 1 Day 2 Day 3: Michael Tunnell's daily video reports from the Summit Ask Noah Podcast Episode #362: Noah speaks positively about the Summit and spotlights Rudra and the respectful and empowering community of Ubuntu. Also interviews Jon Seager on a few topics, primarily JuJu. 2.5 Admins Podcast Episode #168: Jim Salter talks well of the Ubuntu Summit, Jim mentions Canonical looking at the feedback and working hard to make major improvements. Great hallway track, podcasters. Probably this list will get longer next month. After many, many years I will attend FOSDEM again! The last time I attended it was in the early 2000s when I worked at MandrakeSoft in Paris, having only 90 min by train to get there. From Vienna I will have to take a 2-hour flight. FOSDEM (Free and Open Source DEveloper's Meeting) is a large conference. It is registration-free, anyone can just walk in and attend all the talks. There are more than 8000 visitors to enjoy more than 600 sessions in 36 rooms in parallel and ~60 non-commercial exhibition booths. There are a few rooms for plenary sessions, main track, and lightning talks with the sessions selected by the organizers of FOSDEM itself, but most rooms are the so-called devrooms. 59 free software community projects selected by a call for proposals for the devrooms have received a devroom and are responsible to fill it with sessions, usually via a call for proposals for presentations. These calls for proposals are currently open and depending on the devroom will close between Dec 1st and Dec 8. I have done 6 submissions, all for sessions which I have already given in similar form on other conferences, but I will naturally update them where needed. This is what I have submitted (with links to my most recent versions of these sessions): Desktop Linux, as easy as a smartphone! Just in a Snap! - Talk telling what Snap and Ubuntu Core Desktop are and how they work 55-min talk in Distributions devroom (already given on Opportunity Open Source, video, slides). Your app everywhere - Just in a Snap! - Interactive Workshop - Attendees learn packaging applications as Snaps, with exercises on their own laptops 55-min workshop in Distributions devroom (already given on Opportunity Open Source and Canonical-internal Sprint, video, slides). OpenPrinting - We make printing just work! - How it all started, what we have achieved, and what we are currently doing 50-min talk in Main Track (already given on Opportunity Open Source, video, slides) Save Legacy Printers under Windows with WSL and Printer Applications - Installing Printer Applications under WSL to support printers where Microsoft or the printer manufacturer do not supply drivers any more 15-min Lightning Talk (already given on Ubuntu Summit 2022 in Prague, video, slides) Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! - About the conference I have organized in India to motivate people to join free software 30-min talk in Community devroom (already given on DebConf 2023 in Kochi, India, video, slides) 15-min (or 5-min) Lightning Talk (already given on Canonical-internal Sprint, video) Most probably not all of these proposals will get accepted, especially the proposal for the workshop in the Distributions devroom is rather experimental, and also if the two sizes of the talk about the Opportunity Open Source get accepted, I will perhaps only give the long version. Next year we will have a GSoC again, and this time a very special one, the 20th GSoC!! It got announced a few weeks ago. I will participate again with the Linux Foundation and OpenPrinting, there is enough to do ... And we are already starting with finding and selecting contributor candidates. Potential project ideas are: Desktop integration: CPDB support for the print dialogs of Mozilla (Thunderbird/Firefox) and LibreOffice Desktop Integration: Update system-config-printer for the New Architecture of printing Desktop Integration: User interfaces for using OAuth2 with printers and scanners CPDB backend for IPP infrastructure/cloud printers Turn cups-browsed into a Printer Application Note that for general acceptance of CUPS 3.x and of the CUPS Snap we need to have a desktop integration for all desktops, not only for GNOME. Suggestions for any further project ideas are more than welcome. And if you like to be a GSoC contributor next year, please contact me (till AT linux DOT com). This year's GSoC came to an end and 4 of our originally 6 GSoC contributors have passed their final evaluations. They did awesome work which brought us a lot closer to have a smooth transition to CUPS 3.x and its PPD-less New Architecture. The projects still need a little work, but the contributors will finish this in their end-of-year breaks. And here are the final results: OpenPrinting: CPDB support for application's print dialogs: Firefox, Chromium, LibreOffice Contributor: Kushagra Sharma Mentors: Till Kamppeter, Gaurav Guleria, Shivam Mishra, Rithvik Patibandla, Ira McDonald Work Product PASSED Sand-Boxed Scanner Application Framework Contributor: Akarshan Kapoor Mentors: Till Kamppeter, Rishabh Maheshwari, Deepak Patankar, Ira McDonald Work Product PASSED GNOME Control Center: List and handle IPP print services for the New Architecture Contributor: Mohit Verma Mentors: Till Kamppeter, Marek Kašík, Zdenek Dohnal, Rithvik Patibandla, Ira McDonald Work Product PASSED Continuous Integration: Test Programs for libcupsfilters, libpappl-retrofit, libppd, CPDB, CPDB Libs Contributor: Pratyush Ranjan Mentors: Till Kamppeter, Deepak Patankar, Zdenek Dohnal, Ira McDonald Work Product PASSED Native gutenprint Printer Application Contributor: Gayatri Kapse Mentors: Till Kamppeter, Rishabh Maheshwari, Zdenek Dohnal, Ira McDonald Work Product FAILED Native gutenprint Printer Application Contributor: Yuvraj Aseri Mentors: Till Kamppeter, Solomon Peachy, Rishabh Maheshwari, Chandresh Soni, Ira McDonald Failed already on mid-term. FAILED Note that Gayatri's original project was \"Adding support for the new functionality of IPP Everywhere 2.x to libcupsfilters and CPDB\". This project turned out as not feasable and so I moved her to \"Native gutenprint Printer Application\", after mid-term, the project where Yuvraj failed on. Our contributors liked a lot to work with OpenPrinting and expressed it in their final evaluations for the mentors: Kushagra Sharma: Thank you for amazing guidance, OpenPrinting is an amazing team and working along side helped me learn a lot , I hope to keep contributing and keep in touch with mentors and fellow contributors Akarshan Kapoor: I express my profound gratitude for the invaluable guidance and unwavering support bestowed upon me by my mentors throughout the duration of the GSoC program. Their exceptional ability to simplify intricate concepts, their constructive critique on my contributions, and their genuine interest in nurturing my growth as a developer have played an instrumental role in making this journey immensely rewarding. The consistent check-ins and their willingness to address any obstacles or concerns that I encountered were particularly commendable. Nevertheless, there were certain instances when I felt slightly overwhelmed by the pace of progress, prompting me to suggest that incorporating more structured milestones or periodic evaluations could prove advantageous in future endeavors. In conclusion, I am profoundly appreciative of the knowledge they shared with me; their mentorship has indubitably left an enduring imprint on my personal and professional development trajectory. The mentors and the organization I encountered during my participation in GSoC left an indelible impression on me. The level of guidance, support, and communication extended to me was truly unparalleled, resulting in a seamless journey that proved immensely enriching. It became evident early on that their unwavering dedication lay not only in cultivating personal development but also fostering a conducive atmosphere for growth. Without a doubt, the mentorship offered and the program's well-structured framework exceeded all expectations I had harbored prior to embarking upon this endeavor. Consequently, I find myself overwhelmed with gratitude for being granted such an invaluable opportunity Mohit Verma: It was a wonderful expericence to work with OpenPrinting. I think they (the mentors) are the best out there. Pratyush Ranjan: I am really thankful for the support and response time, Till and Deepak gave me throughout the project. Workshop overview No need to meet me giving a workshop on a conference, you can do them all at any time. Click the links in this section and get a great snapper ... Snapcrafters and many upstream application projects need you ... Your app everywhere, just in a Snap!: Introduction into Snap packaging (snapping) with simple GNOME/GTK applications as example (video, slides) Daemon Snapper's Workshop: Snapping daemons and system applications (slides) Improving Snap maintenance: Automating tag updates on new upstream releases of the app: GitHub workflow to automatically update your Snap when an upstream source has a new release (video, slides) Links to the exercises and examples are on the slides. You need to have snapcraft installed and working on your machine, follow the instructions in the \"Setup\" section of the first workshop or use the virtual machine (~6 GB, *.qcow2) if needed. Stay updated on the official Snap workshop page on snapcraft.io! How I got into giving Snap workshops Back in mid-2022 when I joined the organization team of the Ubuntu Summit 2022 in Prague, I had a 3.5-hour 1:1 video call with the leader of the organization team, Mauro Gaspari, exchanging ideas of what we can do in this first Ubuntu Summit. And as he brought in that we could do 2-hour interactive workshops where attendees can try out the subject matter on their own laptops, I was immediately sold on that and formed the idea to do a workshop series on how to package applications as Snaps. Mauro liked this idea and I started to work on making it reality. And on the Ubuntu Summit 2022 in Prague, one year ago, it actually has taken place: One introduction panel and 5 workshops. All the speakers, including me, have put a lot of effort in designing the workshops and especially also the accompanying examples/exercises. Too much for presenting this only one single time ... The first workshop, the one to learn the basics, “Snapping like hell(sworth)”, originally given by Heather Ellsworth and Lucy Llewellyn, got already re-enacted as \"Snapping with Lucy\" soon after, only by Lucy on the DORS/CLUC in May 2023, in Zagrep, Croatia. Not actually knowing about Lucy's edition I also formed the idea to give Snap workshops. So I submitted \"Snapping like hell(sworth)\", renamed to \"Your app everywhere, just in a Snap!\" (the original name of the whole workshop series) on the Linux App Summit 2023 in Brno, the GUADEC 2023 in Riga, and the Ubuntu Summit 2023 in Riga, the latter 2 together with Heather. Only on the GUADEC it got accepted, but due to lack of audience I could not actually give it. But I have also organized my own conference this year, the Opportunity Open Source in the Indian Institute of Technology (IIT) Mandi in northern India. And there, after having done a quick pre-check, finding out that the 3 other employees of Canonical who also attended are interested and so I had an assured base audience, I actually gave it, but only the first half, as time restrictions only gave me a 60-min slot. I got a total audience of 12, what was very good, probably several got motivated by my talk introducing into Snap (video, slides). And finally I got the opportunity to give the workshop (video, slides) in its entirety on Canonical's internal Engineering Sprint, which happened in the week after the Ubuntu Summit 2023, also in Riga. Having ~700 engineers from Canonical on the event it was easy to get a significant audience, actually around 25 to 30 people showed up to get great snappers. And as there are only Canonical people, everyone had a suitable Ubuntu version on their laptop where they could install snapcraft and do the exercises. Nobody needed the virtual machine (~6 GB) which I have prepared already before the GUADEC. And so I found out how long the complete workshop actually takes. I made it in 2:10 hours. And on the Ubuntu Summit 2023 I actually got accepted for a Snap workshop, but for a more advanced one, \"Improving Snap maintenance: Automating tag updates on new upstream releases of the app\" (video, slides). I originally submitted it together with Heather, who originally created the update automation, but as she left Canonical, she was not on the Summit and I had to replace her by Jesús Soto. Some people were complaining that we had no beginner's workshop for Snap on this year's Summit. We are looking into fixing this in 2024 ... So together with the \"Daemon Snapper's Workshop\" (slides) I have now a repertoire of 3 (see below) and I will continue to give them on conferences and Engineering Sprints. Update: Now on snapcraft.io As one can easily also do these workshops by oneself at home, studying the slide decks and trying out the linked examples, the slides and examples should be made available on a place in the internet where interested people can easily find them. Therefore I have posted this section with all the links to slides, examples, and videos on the snapcraft.io Forum in the \"doc\" category. In addition I have pinned the post to keep it prominently visible. Thanks to Graham Morrison, responsible for Snap documentation at Canonical, for his support. We also plan to put everything onto a GitHub repo. And this will not only help to learn snapping, also everyone who likes to give a Snap workshop on a conference by himself could make use of these materials. On the snapcraft.io forum thread where I asked for help with the problems I talked about here last month a conversation with James Henstridge from Canonical's Desktop Team started. I have explained how CPDB exactly works, how it finds the available backends and how it communicates with them during the print dialog session in order to actually print a job. He also brought up some security concerns and I told him how we address them. Especially we found out that CPDB needs some changes: The printFile method of backends needs to pass the job data as stream (file descriptor or domain socket), not as file specified by a file path. The D-Bus methods getActiveJobsCount, getAllJobs, and cancelJob need to get removed from CPDB The file backend of CPDB cannot be used. We should discontinue its development and tell that it is for development and documentation only. Filtering of the printer list in the dialog should be completely managed by the frontends, and not by sending signals to the backends, to allow different filtering on print dialogs which are open to the same time. Add newly appearing backends while the dialog is open. Suggestions about how to make CPDB acually work with Snap were not made. I have asked Biswadeep to work on these changes and he will do so in December after his end-semester exams. PAPPL v1.4.3 is now available for download and is a bug fix release. Changes include: Added \"smi55357-device-uri\" and \"smi55357-driver\" Printer Status attributes to Get-Printer-Attributes responses. Fixed missing mutex unlock in DNS-SD code (Issue #299) Fixed \"printer-id\" value for new printers (Issue #301) Fixed DNS-SD device list crash (Issue #302) Fixed Set-Printer-Attributes for \"output-bin-default\" and \"sides-default\" (Issue #305) Fixed default \"copies\" value with papplJobCreateWithFile()."
+ },
+ {
+ "id": "post:OpenPrinting-News-October-2019",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - October 2019",
+ "url": "/OpenPrinting-News-October-2019",
+ "headings": [
+ "Linux Plumber's Conference 2019",
+ "Google Summer of Code 2019",
+ "Google Summer of Code 2020",
+ "Gutenprint as Printer Application",
+ "Avahi local service support",
+ "OpenPrinting web site",
+ "CUPS",
+ "cups-filters",
+ "ippusbxd"
+ ],
+ "tags": [],
+ "snippet": "Linux Plumber's Conference 2019 with OpenPrinting Micro-Conference, first project ideas for Google Summer of Code 2020, Gutenprint as native Printer Application, Avahi local service support continued, OpenPrinting web site switched over to the new design, cups-filters 1.25.7",
+ "content": "Till Kamppeter, Aveek Basu, and Rithvik Patibandla have held an OpenPrinting Micro-Conference on this year's Plumber's which has taken place in Lisbon, Portugal. Here we have discussed the current work of OpenPrinting: Driverless IPP Printing Driverless IPP Scanning Common Print Dialog Backends Printer (Scanner) Applications replacing current drivers Future of Printer Setup Tools 3D Printing Jake Edge wrote an excellent article on LWN. Thanks to Kate Stewart and Jeff Licquia for inviting us. Till Kamppeter and Aveek Basu will attend the Mentor Summit in Munich next week. We are looking into giving a lightning talk there. With the standards work of the PWG and after our discussion on the Linux Plumber's Conference, first ideas for next year's Google Summer of Code have come up: SANE driver for existing SANE-using apps to be able to access driverless IPP scanners (including Scanner Applications) Scanner Application Framework, to make Scanner Applications from SANE drivers Extend Printer Application Framework from a converter for legacy drivers to a general Printer/Scanner Application SDK, including direct, PPD-less printer applications, IPP System Service, web interface, C API library, ... Make a Gutenprint Printer Application but without PPDs and without Dheeraj's legacy printer driver converter, use only libgutenprint to get the printer capabilities. A built-in web admin interface could allow configurability. Turn cups-browsed into a Printer Application: Instead of creating a local CUPS queue for a printer cluster emulate an IPP printer which prints to the cluster (and local CUPS picks it up automatically, but how to prevent local CUPS from seeing the member printers directly). Can also pick up legacy CUPS broadcasts (or BrowsePoll from legacy servers) and provide these printers as IPP printers. Any further project ideas for the next GSoC are welcome. The developers of the Gutenprint printer driver suite started to discuss the development of a Gutenprint Printer Application to replace their current, classic printer drivers. The discussion is on the Gutenprint developer mailing list in this thread. The link will lead you to the message which started the discussion, go down the thread for the further messages. Trent Lloyd had some time again and promised to get the localhost support issue solved soon. He has answered on my pull request mid-September. He has even bought an IPP-over-USB printer for doing further work, but since then no futher reaction. After updating the web app for the printer/driver database for the new web site and the new OpenPrinting logo we have finally switched www.openprinting.org over to the new web site design! From now on the monthly news (like this page) and news items in general will be posted under \"News & Events\". No further release. Currently released is 1.25.7. Many releases happened during the short time to get bug fixes into the upcoming Ubuntu 19.10 (Eoan), to be released on Thu, Oct 17. 1.25.7: Bug fix release, fixing several crashes, pdftoraster not working with monochrome jobs, printing to clusters. 1.25.6: Bug fix release which especially fixes a bug when printing into a cluster but also soives other minor issues. 1.25.5: Bug fix release, mainly for cups-browsed not to die on left over locally generated queues of unclaen shutdown of the previous session. No further news."
+ },
+ {
+ "id": "post:OpenPrinting-News-October-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - October 2020",
+ "url": "/OpenPrinting-News-October-2020",
+ "headings": [
+ "First year of monthly news posts completed!",
+ "Google Summer of Code 2020 Mentor Summit",
+ "Google Summer of Code 2021",
+ "Google Season of Docs 2020",
+ "Linux Foundation Mentorship Program",
+ "CUPS Snap",
+ "PostScript Printer Application",
+ "Driverless Scanning and IPP-over-USB",
+ "CUPS",
+ "cups-filters"
+ ],
+ "tags": [],
+ "snippet": "PostScript Printer Application, GSoC 2021, GSoD, LFMP, PAPPL, CUPS fork, cups-filters 1.28.5",
+ "content": "It was exactly one year ago, October 2019, when I posted my first monthly OpenPrinting news here on our web site! Some will tell me now that I already started in September 2019, but the September 2019 news post was only a test for the new platform and it was already October when I wrote it as an exact copy of the original mailing list news post. Due to COVID-19 this year's Mentor Summit was much smaller and totally virtual, an 4-hour event. Aveek Basu and me have participated, leading a breakout session and having a lightning talk. Here also the GSoC 2021 and its new mode was announced. There will be a Google Summer of Code next year again, but it will be different. The 3-months student projects will be replaced by part-time projects, 6-weeks full-time-equivalent, to be done in a 10-week time-window. Stipends are appropriately reduced to the half amount, leading to the smae per-hour value. Google hopes to attract more students by this mode. For us as org admins and mentors it means more work, as we have to select more students and we have to work with more students when mentoring. Also we cannot post bigger projects. So let us hope that there will also be a Linux Foundation Mentoring Program for the larger projects. Our OpenPrinting project Tutorial and Design Guidelines for Printer/Scanner drivers in Printer Applications is going well. Piyush Goyal has already written a lot and will continue until December 5. He regularly posts Pull Requests on our web site GitHub and we have merged them. See his work on our web site. He gets currently a lot of input, from me with my PostScript Printer Application as example for a non-Raster and CUPS-driver-retro-fit Printer Application and from Michael Sweet by adding documentation to his PAPPL project. In our first LFMP project also Nidhi Jain has withdrawn, also due to suddenly re-started classes in her college and a COVID-19 case in her family. Our second LFMP project about IPP Scan is going on. Abhik Chakraborty on the server side and Rishabh Arya on the client side are in the middle of their work and have passed their first evaluations. We had some discussion between Alexander Pevzner, Michael Sweet, and me whether we should actually use IPP Scan as network protocol for sandboxed packaging of scanner drivers/Scanner Applications or better eSCL instead, as eSCL is already implemented as client and as server, but we came to the final conclusion of continuing with IPP Scan. We only will move the assignment of the remaining work somewhat. Alexander will complete the IPP Scan support in sane-airscan by himself and both students will work on the server side. The CUPS Snap project is currently still waiting for the snapd project to add the needed API extensions. After the Pull Request for the implementation of the interfaces got merged we are still waiting for the completion of the pull request for adding the API functionality so that a Snap can check whether a client Snap plugs the needed interfaces is still in the works. After having all needed filter functions and PPD file collection handling implemented in cups-filters and having the HP PCL Printer Application as example I have created a Printer Application for PostScript printers. It is now available as the ps-printer-app repository on the OpenPrinting GitHub. Currently it is a first working model, it will get much more functionality, especially for best user experience, added in the near future. See all the details of properties, planned features, known issues, and how to use in the README.md file. This Printer Application is especially a working model for A non-raster Printer Application: Destination format is PostScript, a high-level/vector format. Input data in PostScript or PDF is accepted and needed conversion is not done through an inbetween raster step. A Printer Application which uses the new filter functions of cups-filters 2.x. Filter functions are library functions derived from cups-filters and contain decades of development and refinement starting from the introduction of CUPS in 2000. A retro-fit Printer Application for classic CUPS drivers, in this case the simplest form of only PPD files for PostScript printers. It lists PPD files from repositories included in the Snap, loads the PPD needed for the actual printer, extracts options from the PPD to display them in the web interface, accepts job settings as IPP attributes, and inserts the PostScript code provided by the PPD correctly into the output data stream. A Printer Application which does not pass through raw (input format is printer's native format) jobs. To assure that always the PostScript code of the PPD file is inserted into the output stream, we call the printer's native format \"application/vnd.printer-specific\" which does not exist as input format, so \"application/postscript\" input is forced through the pstops() filter function. To do not need to re-invent the code for forking into sub-processes so that we can pass data through a sequence of filters, we create a filter function to send the data off to the printer and form a chain of the actually converting filter function (one of pstops(), pdftops(), imagetops(), rastertops()) and the with this filter function using the filterChain() filter function. The PostScript Printer Application has all PostScript PPD files of the foomatic-db and HPLIP projects built-in, so most PostScript printer PPDs which usually come with Linux Distributions. Note that some PPDs use certain CUPS filters for extra functionality. These filters are not included. The user can add additional PPDs without needing to rebuild the Snap. The Main Inclusion Requests (MIR) to get ipp-usb passed the Ubuntu security team and so made it to be the default IPP-over-USB implementation in the Groovy Gorilla, Ubuntu 20.10, released October 22, some days ago. So we have reliable IPP-over-USB in Ubuntu now. Unfortunately, the security team was swmped with requests and so did not come to processing the MIR for sane-airscan. So it will only get into the Main repository in Ubuntu 21.04, to be released in April 2021. As it is already in the Universe repository, it can still get easily installed in 20.10. Also upstream is always supplying the newest version in packages for common Ubuntu releases. Alexander Pevzner is continuing to take user reports and make the packages working with as many devices as possible. IPP Scan support is currently still worked on in sane-airscan. Currently released is 2.3.3. Due to dormant upstream development we have created a fork an OpenPrinting which will replace the original repository if Apple does not come back with the development. So for the time being CUPS is maintained by Michael Sweet and me. Michael Sweet has already committed a lot of changes and fixes and Debian has put the first packages of the fork into Experimental. Apple having stopped CUPS development got also talked about at Phoronix, at the German Linux Magazin, and on the Register. I have answered on the former two, telling that we have started the fork and that CUPS will live on. Currently released is 1.28.5. On the way towards 2.0.0 we have converted many filters to filter functions, having now pstops, pdftops, pdftopdf, ghostscript (replaces gstoraster, gstopdf, gstopxl), pclmtoraster, rastertopdf (replaces rastertopdf amd rastertopclm), rastertops, imagetopdf, imagetops, imagetoraster, and filterChain. With the PostScript Printer Application the filter function concept got its first real life use. Due to this I found and fixed many bugs, especially filterChain() got actually tested for the first time and so found some important bugs and fixed them so that filterChain() actually works now. Also the functions for handling PPD file collections in libppd got actually used for the first time and I spotted and fixed some bugs in them. The release of Ubuntu 20.10 (Groovy Gorilla) also made me fix some bugs in the 1.x series of cups-filters. 1.28.5: Bug fix release for a quick, potential crasher correction in cups-browsed 1.28.4: Bug fix release, mainly to solve CUPS performance problems caused by the IPP fax support of the \"driverless\" utility 1.28.3: Bug fix release to solve problems caused by an inconsistency between the resolvers for DNS-SD-based URIs"
+ },
+ {
+ "id": "post:OpenPrinting-News-October-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - October 2021",
+ "url": "/OpenPrinting-News-October-2021",
+ "headings": [
+ "Ubuntu 21.10 (Impish Indri) is coming!",
+ "OpenPrinting Micro-Conference on the Linux Plumbers 2021",
+ "The Summer of Printers in the Ubuntu Office Hours",
+ "Print Management GUI in Flutter",
+ "pappl-retrofit - The CUPS Driver Retro-Fit Library",
+ "ipp-usb Snap",
+ "CUPS-driver-retro-fitting Printer Applications",
+ "Printer Applications in the OpenPrinting printer/driver database",
+ "Gutenprint Printer Application",
+ "HPLIP Printer Application",
+ "CUPS Snap",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/8ZTI7kdPFLc/hqdefault.jpg",
+ "snippet": "OpenPrinting/GSoC in Ubuntu Office Hours, Gutenprint Printer Appl., HPLIP Printer Appl. supports HP's plugin, new print GUI in Flutter, CUPS' release plan",
+ "content": "This Thursday, October 14, 2021, is Ubuntu release day again! Ubuntu 21.10! Not a lot of new stuff in terms of printing (in addition to all printing- and scanning-related packages being up-to-date) but at least some nice things: The GTK print dialog finally lists virtual/temporary queues which CUPS generates for driverless IPP printers and Printer Applications. So if one uses only GTK-based applications, one does not need cups-browsed any more. But for now I continue providing cups-browsed, as Qt's print dialog is not cute. libcups is patched with the same algorithm for mapping standard IPP attributes to PPD option settings as I have created in libppd in cups-filters for the Printer Applications. So you can print to shared CUPS queues from your phone or IoT device and easily get the printout as you like it. And there will be a virtual release party on YouTube! Our micro-conference on Linux Plumbers 2021 was a success! We discussed a lot on our development plans. Especially Michael Sweet has presented his plans on how to go on with the CUPS development and the next releases. See the CUPS section below, Bhavna Kosta has presented her GSoC work on scanning with PAPPL. Here is the Recording on YouTube. We had the following sessions: Introduction Presenter: Aveek Basu Slides CUPS 2.4/2.5 Presenter: Michael Sweet Slides CUPS 3.0 Presenter: Michael Sweet Slides Print Management GUI Presenter: Till Kamppeter Slides Common Print Dialog Backends Presenter: Till Kamppeter Slides Printer/Scanner Driver Design and Development Presenter: Till Kamppeter Slides Scanning in PAPPL Presenter: Bhavna Kosta Slides Closing Session Presenter: Aveek Basu On last week's episode of the Ubuntu Office Hours we have talked about our success with the Google Summer of Code (see also the announcement here last month). Not only me and Aveek Basu have been in the virtual studio but also two of our GSoC 2021 students, Divyasheel (Printer management GUI) and Pranshu Kharkwal (Universal CUPS filter). Our conversation with host Monica Ayhens-Madon why and how we are doing GSoC, finding students, introducing them to our projects, getting them as developer community members, ... The students also told about their experience with us, we all have also given some tips to everyone who wants to participate in the GSoC, as student, mentor, or organization, and in the end we answered some spectator's questions from the Live Chat. And here is the Recording on YouTube. Thanks a lot to Monica Ayhens-Madon for inviting us! As Michael Sweet and me talked about the New Architecture (Driverless IPP, Printer Applications, R. I. P. PPD files, ...) in the Ubuntu Indaba in August and I also mentioned that the printer setup tools need to change for this, the host, Heather Ellsworth from Canonical, brought me together with Frederik Feichtmeier, who is writing a replacement for the GNOME Control Center completely in the Dart programming language with the Flutter GUI toolkit (the GitHub). He showed much interest in making the printing part of his tool to work with the New Architecture. I introduced him into everything, giving him links to my news posts, our GutHub, the slides (especially these ones) and video of the Linux Plumbers conferences, the Indaba, the Office Hours, ... His tool is a good candidate to soon get a printer management tool of the new generation. Thanks a lot to Heather Ellsworth for this contact! The retro-fitting library is practically complete and is used by 4 Printer Applications now: PostScript, Ghostscript, HPLIP, and Gutenprint. In the last month it only received some minor improvements, mainly to fit the needs of our 4 Printer Applications: If all page sizes of the PPD file have zero margins (especially no variants of the same size with and without margins) we do not show \"Borderless\" check boxes on the \"Media\" web interface any more, as there is nothing to switch (commit). Raster input resolutions are limited now, to avoid overloading clients by requesting extremely high PPD resolutions from them (Gutenprint PPDs have up to 5760x2880dpi). High quality is limitted to 1440dpi, normal to 720dpi, and draft to 360dpi. 1440dpi is good enough for drawings and 720dpi good enough for photos (commit, discussion on the Gutenprint mailing list). Remove duplicate entries in lists of media sizes, media types, and media sources (commit). Explicitly shut down CUPS backend on end of job before the dynamic data structure of the job is taken down, to avoid a crash when the Printer Application by itself closes the backend later (commit). Allow setting callback functions for extra system and printer setup steps. Especially extra buttons and pages can be added to the web interface. We use this for example in the HPLIP Printer Application to add a web interface page to install HP's proprietary plugin, and to auto-update the plugin when starting the Printer Application (commit). Further development of the library will go with the development of PAPPL and the needs of the Printer Applications. Especially the following features will get implemented/supported as soon as they are implemented/fixed in PAPPL: Support for scanning. Needs support in PAPPL (Bhavna Kosta's GSoC project). Support for string/text-style vendor options. Needs support in PAPPL (Patch already applied in the Printer Application Snaps). Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. ipp-usb is also available as a Snap in the Snap Store (229 downloads in the first 2 weeks) now! So making use of IPP-over-USB for easy driverless printing and scanning on USB-connected devices, one only needs to install the Snap and connect the printer to USB. You get an emulation of an IPP network printer and CUPS and SANE find it automatically. The Snap also offers configurability, logging, and user-editable quirks as a classic installation (see README.md). Note that the Snap is usually not needed on Linux distribution which have ipp-usb already installed and in working condition. Only if you have problems with the installed ipp-usb or simply want to always have the newest version, install this Snap then. Make sure to uninstall the system's ipp-usb (and also the obsolete ippusbxd). The challenge of making this Snap was to trigger ipp-usb on the appearing (and also the presence) of IPP-over-USB devices. In the classic installation of ipp-usb (via make install or RPM/DEB package installation) a UDEV rules file and a systemd service file (in systemd-udev/) are installed, so that the system automatically triggers the launch of ipp-usb when an appropriate device is connected or already present. A Snap is not able to do so. It cannot install any files into the system. It can only bring its own, static file system and create files only in its own state directory. These locations are not scanned for UDEV rules. So the Snap must discover the devices without its own UDEV rules, but it still can use UDEV. The trick is to do a generic monitoring of UDEV events and filtering out the USB devices with IPP-over-USB interface (7/1/4). If such a device appears, we trigger an ipp-usb launch. We also check on startup of the Snap whether there is such a device already and if so, we also trigger an ipp-usb launch. ipp-usb is run, as in the classic installation, with udev argument. This way it stops by itself when there is no device any more (and we do not need to observe the disappearal events of the devices) and it is assured that only one single instance of ipp-usb is running. To do this with low coding effort I use the UDEV command line tool udevadm in a shell script (snap/local/run-ipp-usb in the source repository). Once it runs in monitor mode to observe the UDEV events. Then we parse the output lines to only consider the ones for a device appearing and run udevadm info -q property on each device path, to get the properties and filter the 7/1/4 interface. In the beginning we use udevadm trigger in dry-run mode to find the already passed appearal event of a device which is already present. So the shell script is an auxiliary daemon to start ipp-usb when needed. We use the same method in the HPLIP Printer Application to automatically load firmware files into USB devices. See also the README.md file and the \"How to add or workaround a udev rule\" thread on the snapcraft.io forum. I came to the idea with udevadm monitor by myself, but Oliver Grawert (\"ogra\" in the snacraft.io thread) came to the same idea earlier. I got only aware of it by him reacting to this thread. On all the 4 currently available retro-fitting Printer Applications, PostScript, Ghostscript, HPLIP, and Gutenprint, the following improvements were done: No log rotation: As PAPPL rotates already after a rather small portion of log, we decided to de-activate PAPPL's log rotation completely in the Snaps. To avoid filling up the disk, the default log level is \"Error\" (can be changed in the web interface of the Printer Application). Maximum of 256 instead 32 vendor-specific options in PAPPL: As the Snaps of the Printer Applications build PAPPL by themselves, I have patched the hard-coded maximum for the number of vendor-specific options in PAPPL (a single number) as many PPD files (especially Gutenprint but also some high-end PostScript printers) have more options. This assures that always all options get available. See also our discussion on the Gutenprint mailing list. Use CUPS' backends and not PAPPL's: This gives the following improvements: Quirk workarounds for USB printers with compatibility problems are used. The quirk rules can get edited or new rule files added in /var/snap/*-printer-app/common/usb/ Additional network protocols: IPP, IPPS, LPD. Especially one can send PostScript output to the printer via encrypted IPPS. The SNMP discovery can get configured via /var/snap/*-printer-app/common/cups/snmp.conf Stop building libjpeg9 in the Snaps: The libjpeg8 from Ubuntu Core 20 works well enough and the Snap Store's build servers have difficulties to load the upstream source tarball from the original web site, requiring triggering several rebuilds manually until the Snap gets into the Snap Store. The libjpeg9 build was overtaken from the hp-printer-app Snap (where it also had been removed later). I had also posted a request for the Snap Store allowing auto-connections of all interfaces of the Printer Application Snaps and it got approved. So the Snaps can get easily installed from the Snap Store. To help users finding the correct drivers for their printers we always had the OpenPrinting printer/driver compatibility database. Now, as most of the legacy drivers listed there are in one of the four retro-fitting Printer Applications, we have now links to the appropriate Printer Application in each of the driver entries of drivers which are contained in one of the Printer Applications. So now people can finally install the desired driver on practically any Linux distribution (HPLIP, Gutenprint, pxlcolor, hl7x0, Ricoh PostScript). Gutenprint Printer Application in the Snap Store, 520 installations via Snap Store One of the most important printer driver suites in free software has made it into a Printer Application (and also into the Snap Store) now. It is known for its high output quality, adjustability, and support for third-party papers and ink sets. Now one can easily install its newest version on nearly any Linux distribution and easyily print from any IPP-capable device (like phones) but adjust all its options via web interface. It supports more than 3000 different printer models, especially inkjet printers from Epson and Canon, dye-sublimation photo printers, PCL 4/5c/e laser printers, but also some other printers. In addition it provides generic support for the different PCL flavors, everything which is supported by the Gutenprint CUPS Raster driver. Some of these printers are probably also driverless IPP printers, but you can still use this Printer Application then as perhaps you could get better output quality. The challenge when encapsulating this driver in a PAPPL-based Printer Application was that some PPDs (higher-end Epson inkjets) have around 120 options whereas PAPPL only supports 32 vendor-specific options by a hard-coded array. Fortunately, one only needs to change one number in PAPPL's source code to change this limit. So at least in Snaps, which build their own copy of PAPPL one can adjust the limit. So in all retro-fitting Printer Application Snaps I have changed it to 256. It is more a problem in distribution packages, where the PAPPL package is not modified. Here the Printer Application automatically switches to the simplified PPDs of Gutenprint. Another point which could cause problems are the high resolutions (uo to 5760x2880 dpi) which the driver uses. If we let the Printer Application simply use these, this can make clients (those which send jobs in Apple Raster or PWG Raster) render their jobs in such extreme resolutions and slow down the devices, slow down the printing and the data transfer, or even crash the client device. Therefore we limit now all retro-fitting Printer Applications to 1440 dpi for high, 720 dpi for normal, and 360 dpi for draft quality. 1440 dpi is good enough for fine drawings and 720 dpi good enough for photos. The higher resolutions are used only internally now, for the driver to use a sophisticated, fine-grained dithering. Both these issues got discussed on the Gutenprint mailing list (free-of-charge subscription required to discuss on the list). HPLIP Printer Application in the Snap Store, 1316 installations via Snap Store The HPLIP Printer Application experienced two substantial changes during the last month: The Snap uses the source code of the Debian package and not the upstream one and the Printer Application supports installing the proprietary plugin via web interface now, also in the Snap. Source code from Debian HPLIP's original source, as it comes from HP's web site has many bugs, unfortunately. The HPLIP developer team has a bug tracker at Launchpad and the bugs got reported there but it seems thatb the developers are not reviewing and merging the proposed patches. Therefore the Debian package of HPLIP (which is also used by Ubuntu) has 81 patches, partially originating from the Debian and Ubuntu developers but also from RedHat/Fedora developers. As it would be a lot of work to add the patches to the HPLIP Printer Application repository to be used in the Snap build, we have simply switched to Debian's GitLab repository as source instead of the original upstream tarball, as on Debian's repository the patches are already applied. This way in the HPLIP Printer Application Snap all these bugs are fixed and thanks to Debian's re-packaging of the original source, the code is totally free software (HP's original code contains a closed-source library even without the proprietary plugin). Support for the proprietary plugin Unfortunately, HP has some (cheaper) laser printers which do not work with totally free software. They either need their firmware loaded everytime when they are turned on ot they need a closed-source driver for their proprietary print data format. For this HP has issued a proprietary plugin which joins all these extensions for all devices needing it in a single package. On a classic HPLIP installation (as it usually comes with Linux distributions) one can install the plufin with the hp-plugin utility, or when setting up the printer with hp-setup. Now the plugin can also be used with the HPLIP Printer Application Snap. In the web interface (see screen shots in the Snap Store), on the front page, under \"Other Settings\" there is an \"Install Proprietary Plugin\" button now (and at the entries of all printers which need the plugin is a \"Plugin\" button). Clicking one of these leads to a web interface for installing the plugin, and also for updating, removing, and re-installing. One needs only to click the appropriate buttons, accept the license (on initial install) and the plugin gets installed. Once the plugin in place, the USB is observed (as with ipp-usb above, as we cannot install UDEV rules out of a Snap) to upload the appropriate firmware file if a USB printer which needs it appears (or is already there when starting the Snap). If the Snap gets updated by one with a newer HPLIP version, the plugin gets updated automatically. When installing the HPLIP Printer Application classically one can also install the plugin via web interface, but only if the Printer Application is running as root. Automatic updates of the plugin only happen when (re-)starting the Printer Application, also only as root. Running as non-root the web interface page only shows the status of the plugin, and the user has to install with ho-plugin of the (then also classically installed) HPLIP. As scanning support in PAPPL is not ready yet, scanning on multi-function printers is not yet supported. CUPS Snap in the Snap Store, 2832 installations via Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but unfortunately, they are very busy currently but the merging into snapd is expected still in October, so that for the full developemnt cycle of Ubuntu 22.04 LTS (J. J.), starting end of October, it will be available for testing and deciding whether said Ubuntu version will come with the CUPS Snap as standard printing environment, and naturally uploading of applications which print into the Snap Store will get easy and fully automatic, without any manual review and permission needs. Michael Sweet has done some clean-up on the Snap support of CUPS and I have tested it with the CUPS Snap. All is working correctly. Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces (see above) Testing Turn classic CUPS drivers into Printer Applications (see progress above) Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|2832| |ipp-usb|ipp-usb|229| |ps-printer-app|PostScript Printer Application|1663| |ghostscript-printer-app|Ghostscript Printer Application|318| |hplip-printer-app|HPLIP Printer Application|1361| |gutenprint-printer-app|Gutenprint Printer Application|520| Currently released is 2.3.3op2. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 20 months. Ubuntu Impish Indri (21.10, release this Thursday, Oct 14) will also come with CUPS 2.3.3op2, the CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master. As outcome of our OpenPrinting Micro-Conference on the Linux Plumbers 2021 on Sep 20, 2021 (see Michael Sweet's slides) we will proceed with the development of CUPS as follows: CUPS 2.4 Feature highlights: Official AirPrint/Mopria printer sharing support OAuth support Explicit container support (Snap for now) pkg-config support Deprecated cups-config and Kerberos (will be removed in 3.0, replaced by OAuth) Release schedule: Beta in the end of September 2021 Release Candidate in October 2021 2.4.0 in November 2021 Patch releases every 2 months from January 2022 on 2.4.1 or 2.4.2 in Ubuntu 22.04 LTS Release Manager: Most probably Zdenek Dohnal (RedHat) CUPS 2.5 Feature highlights: OAuth support in cupsd OAuth callback for desktop - D-BUS API - Good for containers to do it with DBUS-API TLS/X.509 improvements Centralized localization - OSes usually have their own localization services Other container technologies - Docker, AppImage, Flatpak Release schedule: Beta in the end of September 2022 Release Candidate in October 2022 2.5.0 in November 2022 Patch releases every 2 months from January 2023 on 2.5.1 or 2.5.2 in Ubuntu 23.04 Release Manager: Most probably me (Till Kamppeter) 2.5.x is probably the last 2.x. CUPS 3.0 Feature highlights: 100% free of PPDs! New architecture of separate modules: Command line utilities: lp, lpstat, lpadmin, lpinfo, ... Local server: Runs as normal user, only temporary/virtual (auto-generated queues) pointing to IPP printers/Printer Applications, spooling filtering, only on domain sockets, D-Bus (protocol similar to CPDB backend, merge with it?) Sharing server: Runs as root, only permanent queues, web interface, network, accounting CUPS library, to be used by all the components above Release schedule (development together with 2.5): Beta in March 2023 3.0.0 in October 2023 Ubuntu 24.04 LTS is the first PPD-free Ubuntu! Currently released is 1.28.10. Current development work is finishing up, testing, debugging this year's GSoC student projects, improving and optimizing the rules for mapping job IPP attributes to PPD option settings, and smaller feature needs appearing during the CUPD driver retro-fitting work (but most is already done for this). Now we also need to clean up and sort out things to be able to do a first 2.x release of cups-filters. Merged Pratyush Ranjan's Pull Request for converting the texttotext CUPS filter into a filter function. Now the filter function conversion work is completed! Make cupsRasterParseIPPOptions() work correctly together with printers with PPDs, especially to not mis-interprete the weird \"Resolution\" variant choice names of Gutenprint (like \"301x300dpi\"). Clean \"Eastmak Kodak Company\" to \"Kodak\". In IPP-attributes-to-PPD-options auto mapper rules considering “ColorMode” also with prefix (like “cupsColorMode”) now. Fixed PPD URIs when generating dynamic PPDs, so that they do not depend on the absolute path of the dyanamic PPD generator. Deal with too large custom page size limits in PPD files when creating PPD cache Also several minor bug fixes were done. Michael Sweets PDF file handling library PDFio is a good candidate to replace QPDF in cups-filters, to eliminate the need of C++ and therefore make the code easier to maintain. I discussed this with Michael on the Linux Plumbers and we discovered that two important features were missing and he suggested me to post feature requests: Generate streaming output (vs. file output) (Feature requst, already implemented) Flattening filled interactive PDF forms and annotations in PDF files to get a static PPD file with fields filled (Feature requst, Michael is investigating) Ubuntu Impish Indri (21.10) will come with cups-filters 1.28.10. The CUPS Snap currently uses 1.28.10. The Printer Application Snaps use the current GIT master of cups-filters. Currently released is 1.1b2. After this release mainly only bug fixes and additions for Windows compatibility got added. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-October-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - October 2022",
+ "url": "/OpenPrinting-News-October-2022",
+ "headings": [
+ "Today is Release Day, of Ubuntu 22.10 (Kinetic Kudu)!",
+ "Ubuntu Summit 2022",
+ "Google Summer of Code 2022",
+ "Common Print Dialog Backends 2.0",
+ "CUPS Snap and snapd printing interface",
+ "Approaching cups-filters 2.0",
+ "pappl-retrofit",
+ "OpenPrinting web server",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "snippet": "Ubuntu 22.10 Kinetic Kudu, Ubuntu Summit, GSoC 2022, CPDB 2.x, \"cups\" snapd interface, cups-filters 2.0, retro-fitting Printer Applications, foomatic-db daily snapshots, PAPPL 1.2.3",
+ "content": "It is not yet switching to the New Architecture for printing and scanning, but has a lot of nice new features, mainly GNOME 43 with a new quick settings panel, Ubuntu Desktop section in System Settings, Nautilus and System Settings with window layout adapting to the window size, improved dock, ... Also the audio stack is based on the new PipeWire which has less bugs than the old PulseAudio and makes especially Bluetooth audio devices work more reliably. To learn more about the new Ubuntu release, watch tomorrow's Desktop Team Indaba about the Kinetic Kudo release. Heather Ellsworth will receive Philipp Kewisch, Adam Szopa, Oliver Smith, and Ken VanDine from Canonical to tell about the new features of Ubuntu itself and Rudra Saraswat from Ubuntu Unity, which got official flavor with 22.10. And as always, if you are watching live via YouTube or Twitch, you can use the chat facility to ask questions. Update: Ubuntu blog about 22.10 There are less than 3 weeks now until the first Ubuntu Summit! And you really should come to Prague and attend it. There are a lot of good reasons. Update: The exact schedules are available now!! All sessions in the Ballroom (plenary room) will get broadcasted/streamed live and recorded, all sessions in the breakout rooms (Karlin 1-4) will get recorded, workshops (Palmkova 1, 2) are interactive, hands-on sessions and so remote participation does not make much sense. Therefore they will not get recorded. But if you come to Prague, have your laptop (with EU plug adapter) handy if you want to attend one or another workshop. Call for Proposals has ended Two weeks ago, the call for proposals has ended and we got a lot of exciting submissions! Nearly all the submitters got already informed whether their proposal got accepted or not, and now a part of the organization team is solving the difficult puzzle of scheduling all the workshops (90 min, interactive), talks (50 or 25 min), and lightning talks (10 or 5 min) into 7 rooms and 3 days. Especially important is to fulfill the many dependencies between the sessions, not only that 1 speaker cannot present in 2 rooms at the same time, but also that a talk about a given subject has to be delivered before the workshop of the same subject or the workshop for the basic knowledge of a subject has to come before all the advanced-topics workshops ... And if you really cannot make it to this exciting event, there is some limited remote access to it, too. All the sessions happening in the plenary room (the largest of all the rooms) are broadcasted and one can ask questions via chat (like on the Ubuntu Indabas). Unfortunately, we cannot have remote live speakers and we cannot broadcast the sessions in the breakout/workshop rooms (and for the workshops it does not make much sense to attend remotely anyway). OpenPrinting is in Prague, too Yes, we are always in need to extend our developer, designer, document writer, ... community and the Ubuntu Summit is all about that kind of community. Therefore we will present our activity, our plans, and our needs in the session OpenPrinting - Join the team to make printing just work! Update: Wednesday, Nov 9, 14:00 - 14:50 CET, Karlin 2 There I will be accompanied by Zdenek Dohnal from Red Hat, Johannes Meixner from SUSE, and Deepak Patankar, former GSoC contributor and now mentor, presenting about their contributions and their integration in OpenPrinting. And after our presentations, we have an extended questions and discussion part. Depending on the room where this session will take place, we can also connect Aveek Basu from OpenPrinting and one or another (former) GSoC contributor. And if there is more discussion time needed, we can create spontaneous BoFs to continue the discussion. Unfortunately, I was not able to get BoFs pre-scheduled. We also will help all these attendees who have relatives or friends who are still stuck in Windows (and also WSL developers who need to boot into Windows for testing), to make their old printers working again. I will show in a 10-min lightning talk that one can easily run our Printer Application Snaps in WSL under Windows, as described in our HOWTO. So do not miss Save Legacy Printers under Windows with WSL and Printer Applications Monday, Nov 7, 17:40 - 17:50 CET, Ballroom Carlos Nihelton, author of the HOWTO, will also be present. Let's build a plotter! Tired of listening to four people talking about paper I/O? Do you prefer to do it with your own hands? No problem, Daniele Procida, director of documentation at Canonical, has created a DIY plotter made out of parts for ~12.50 EUR, the Brachiograph, and in the workshop Let's build a pen-plotter Tuesday, Nov 8, 16:00 - 17:30 CET, Palmkova 1 he will teach the attendees to build such a plotter by themselves. Control unit for the device is a Raspberry Pi, and the device itself consists of cheap servos, clothes pegs, paper clips, wood sticks, and a pen. And did you remember that refills for commercially available printers are usually expensive? For this device the refill is free, you find it all over the conference hotel ... I will attend the workshop and report about it next month ... Your application everywhere, just in a Snap! Or are you developer of a free software application and need a way to easily distribute it to as many users as possible? Without need of the goodwill of distribution package maintainers, without the requirement of your users to install the newest version of their distro in order to get the newest version of your application? Without you needing to test your application on 10 or more different distros and platforms? And as a little extra, your application can also be used easily under Windows, via WSL, without you needing to ever touch Windows for testing it. The solution is to package your application as a Snap (we also say \"snapping it\") and put it up in the Snap Store. The basic idea is similar to smartphone applications in the App Store or Google Play Store, its origin is even in the good old times when Canonical was developing a smartphone running Ubuntu Touch. The Snap is an encapsulated, distribution-independent package containing everything what it needs and which can be easily installed in many OS distributions, like a smartphone app. And even system services can be distributed as Snap, like CUPS and our Printer Applications. Do you want to learn how? Then do not miss our series of Snap tutorial workshops. In each workshop one topic of snapping applications is treated and they are not simply talks, but hands-on workshops. You bring your laptop and do the exercises and examples by yourself! And we will answer your questions ... Intro panel session: Your application everywhere, just in a Snap! Monday, Nov 7, 14:30 - 15:20 CET, Karlin 3 Following workshops are available: Snapping like Hell(sworth) Monday, Nov 7, 16:00 - 17:30 CET, Palmkova 2 The basics of snapping, for everyone who is new to Snap ROS Deployment Workshop Tuesday, Nov 8, 14:00 -15:30 CET, Palmkova 2 Also for those who are new to Snap, but here Snap is used for IoT/Robotics Daemon Snapper's Workshop Wednesday, Nov 9, 11:30 -13:00 CET, Palmkova 1 Snapping of system services and utilities Snapping Desktop Applications Wednesday, Nov 9, 14:00 -15:30 CET, Palmkova 2 Make Snap packages of GUI applications, based on either GNOME/GTK or KDE/Qt Deploying Flutter apps on Linux Desktop Wednesday, Nov 9, 14:00 -15:30 CET, Palmkova 1 Snapping Flutter-based applications Note that if you have no knowledge about Snap, you should first attend one of the first two workshops before you dive into the advanced topics of the other three. And to get some deeper knowledge, there are also many talks about Snap available. And do not forget to bring your board games, gaming-related tinkering, and your knitting projects (life jackets are supplied, though)! And there is no conference without social events/evening events. On the Ubuntu Summit we will have: Sunday, Nov 6, 18:30 CET: Sunday evening reception - Many of us arrive already on Sunday, so meet and greet, get your badge, and avoid the lines on Monday moring. Monday, Nov 7, 20:00 CET: Kinetic Knitter's Session - Knitting together, bring your project (Knitting needles are allowed in your carry-on) Tuesday, Nov 8, 19:00 CET: Gaming night - Games, games, games, both analog and digital! Bring your board/tabletop/card games but also your gaming-related tinkering projects, (like Raspberry Pi for retro-gaming). We have many tables for playing and also monitors, keyboards, mice, and a projector for bringing your digital gaming contributions onto the large screen. Wednesday, Nov 9, 20:00 CET: Closing party on a boat - To celebrate the (hopefully successful) completion of the first Ubuntu Summit. And we are not docked, we are actually cruising. I hope to see you all in Prague and not that you will read here next month what you have missed ... For the first time we are in the forth month of coding, as all the OpenPrinting projects got extended by at least 4 weeks. The 4 projects extended by 4 weeks have ended now and all the contributors have passed. Links to the work products are below. In our GNOME Control Center sub-team (Mohit and Shivam) we have no news from the UX/UI design team from GNOME, but I have reported the UX design needs inside Canonical and it will get worked on them in the development cycle for Ubuntu 23.04 (the design work will naturally also get upstreamized). And now we have forth editions of the contributor's little summaries (and results/work products if available): Converting Braille embosser support into a printer application Contributor: Chandresh Soni Mentors: Till Kamppeter, Samuel Thibault Work Product PASSED As now our gsoc work have been submitted i have created the printer apllication which is now working with detecting various printer using web interface. raw printing can be done using printer application for format such as .brf .ubrl, and debugging is going for filter conversions. Adding Common Print Dialog Backends (CPDB) support to existing Print Dialogs Contributor: Gaurav Guleria Mentors: Till Kamppeter Work Product PASSED I have added CPDB support to the Qt print dialog after discussion with the Qt development team and opened a merge request: https://codereview.qt-project.org/c/qt/qtbase/+/437301. I have also fixed some bugs with the CPDB backend of the GTK print dialog. Discussion with the Qt upstream developers on their mailing list: Initial post, thread \"Adding CPD support to Qt print dialog\" Merge request for CPDB support in the Qt print dialog: Qt Merge Request #437301 Merge request for CPDB support in the GTK print dialog (a lot of discussion with maintainer Marek Kasik has happened here): GTK Merge Request #4930 Scanning Support in PAPPL with eSCL Support Contributor: Rishabh Maheshwari Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar Work Product PASSED I have completed developing the functions required for the eSCL parser and I have defined the data structures and helper utilities to use them. Along with Deepak, we will successfully implement a scanner application which uses eSCL protocol. Add Avahi calls for discovering and resolving driverless IPP printers and Optimize the processes Contributor: Sachin Thakan Mentors: Till Kamppeter, Michael Sweet, Deepak Patankar Work Product PASSED Last month I worked on driverless utility. I have completed the new implementation for service discovery which removes ippfind as a dependency for discovering ipp/ipps printing devices and uses avahi APIs directly. It also includes optimization of the discovery process, which is only resolving relevant services but not all browsed services. Currently, I am working on moving this optimization logic to a commonplace similar to other avahi APIs. Scanning Support in PAPPL Contributor: Deepak Khatri Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar (See Rishabh Maheshwari) GNOME Control Center GUI for discovering non-driverless printers and finding suitable Printer Applications for them Contributor: Mohit Verma Mentors: Till Kamppeter, Michael Sweet, Pranshu Kharkwal, Divyasheel, Deepak Patankar Work Product (preliminary) I have completed the work of implementing the functionality for querying the OpenPrinting web server to get the details of supported Printer Application. The list of supported apps are displayed in a window which has the most appropriate app preselected along with a \"Recommended\" tag. With the work on our request on adding IPP operations to request discovered devices and available drivers from Printer Application as the server completed , we will now be able to make IPP requests to discover devices and add them . This also means that from G-C-C we can now make IPP requests for adding a device. I will be moving ahead and updating the method of discovery of devices of Printer Application by creating IPP requests to Printer apps. I will also be expanding the cups-pk-helper DBUS interface to get details of Printer Apps in G-C-C via a DBUS call. With this, we will complete the functionality of Adding a new printer in a Printer App, along with opening their web interfaces from G-C-C. Further discussion happened on Mohit´s issue report: GNOME Issue report #1878: Allow to add new printers via Printer Applications cups-pk-helper changes: cups-pk-helper PR #7: Added discovery of Printers via lpinfo, PAPPL and Printer Applications Create new printer setup tool for the GNOME Control Center Contributor: Shivam Mishra Mentors: Till Kamppeter, Pranshu Kharkwal, Divyasheel, Deepak Patankar Hi, I have completed the integration of functionality of listing available IPP services with the GUI functionality of managing IPP multi function devices using IPP system service and also done with fine tuning of the hybrid module. Currently I'm working on integrating Mohit's work of getting details of discovering devices to add them. Feature requests so far: #1877: Improve setting of IPP options #1879: Do not show setting of drivers for IPP printers #1911: Printers: Make adminurl available for IPP printers While our GSoC contributor Gaurav Guleria is working on adding CPDB support to the print dialogs (see above) he has continued to do fixes and improvements on the CPDB framework itself: Fix for new requirement of glib that the glib headers should no longer be included inside extern \"C\" { ... } blocks (PR #11) Fixes for code reliability, like crash guards, function reporting success/failure, ... (PR #12) In the discussion on the merge request for CPDB support in the GTK dialog, Marek Kasik asked about how tto handle translations of option/choice names and here I suggested that they should be provided from CPDB (and the CPDB CUPS backend takes them from CUPS) and Marek Kasik agreed with that. I also presented the API functions of cups-filters to obtain these strings, which the CPDB CUPS backend could use. Gaurav Guleria will now work on the implementation. The API in cups-filters is implemented in the files cupsfilters/catalog.[ch] and it uses the translation tables of CUPS, which also contain the strings for all standard IPP attributes and their enumerated values, and it also can obtain printer-specific strings from a printer via IPP. I had originally designed it for the PPD file generator for driverless IPP printers which is used by cups-browsed and by the driverless utility. I am also thinking about later creating a separate IPP strings/translations project on OpenPrinting which collects translations via Weblate (we are already using Weblate for system-config-printer). Also this functionality to provide human-readable strings and their translations will get included in the 2.0 release of the Common Print Dialog Backends. CUPS Snap in the Snap Store Last month we told here that there is a bug in snapd due to which seeded Snaps (being part of the standard installation/ISO image of the OS) cannot use the cups interface (and have to stay with cups-control for now. There will be no rush to fix this bug. Instead, we have planned to let snapd handle the dependency of the cups interface on the CUPS Snap internally to not need the pseudo-content interface any more and that to be implemented within the Ubuntu 23.04 development cycle (before Feature Freeze mid-February 2023). This also does not only work around the bug but pone also needs to only plug cups in snapcraft.yaml, no additional section for the dependency on CUPS is needed. But note that the bug really only concerns the Snaps contained in the standard installation of Ubuntu, if you Snap your application, you can use the cups interface for printing without any problems. We get even closer now. I have done most of the cleaning up of all the code to get a unique coding style and to make it more readable, as described last month. This has now be done for the complete libcupsfilters, libppd, and for foomatic-rip. When the complete code is cleaned, the current cups-filters project will be split into several parts, similar to CUPS on its transition to the 3.x series. There will be the following parts: libcupsfilters: The central library with the filter functions and some useful functions for printer drivers, human-readable strings and translation handling for IPP attributes, ... It does not contain any support for PPD files. libppd: PPD file support library providing the complete support for PPD files from libcups (2.x and earlier), the CUPS PPD compiler and utilities (ppdc) and functions to convert PPD Options into IPP attributes, to add PPD file support to the filter functions of libcupsfilters, to handle collections of PPD files, ... This library is only for legacy PPD and driver support, it should not motivate anyone to create new PPD files! cups-filters: Legacy CUPS filter/backend executables for CUPS 2.x and earlier. Uses both libcupsfilters and libppd. Any XXXtoYYY filters, foomatic-rip, driverless, ... braille-printer-app: The Braille embosser driver code plus Chandresh Soni's GSoC work to turn this code into a Printer Application. cups-browsed: Daemon to automatically create local print queues for network printers and remote CUPS queues and allows to create printer clusters. Will be turned into a Printer Application later (GSoC project?). libcupsfilters is completely free of PPD file support, same for braille-printer-app. libcupsfilters can be used for all kinds of Printer Application and wherever print data or scanned data has to get converted. The Braille Printer Application is a native Printer Application, it does not use PPD files internally. libppd contains the complete PPD file support for Printer Applications which retro-fit PostSctipt PPD files or classic CUPS drivers. These Printer Applications are usually created based on pappl-retrofit. Distributions using the New Architecture for printing and scanning will not install libppd by default, as it is not needed any more. cups-filters provides the filter executables needed by CUPS 2.x or earlier. Most executables are just simple wrappers and all the internal workings have moved into the filter functions in libcupsfilters, and the PPD file support into libppd. This package requires libppd, but it is for PPD-based classic CUPS versions only anyway. cups-browsed is currently supporting and generating PPD files (for CUPS 2.x), and therefore also depending on libppd. In a later version, when it is turned into a Printer Application, the PPD file support be removed. An important goal of the separation is to put all PPD support in their own project so that they can get discontinued later and this way we can easily stop maintaining the PPD file support code will all the other useful code of the former cups-filters will live on. libfontembed is merged into libcupsfilters now as it is only used by the cfFilterTextToPDF() filter function, really nowhere else, it has also no package which depends on it in Ubuntu (neither in Main nor in Universe). Its code (a lot for being a part of the texttopdf CUPS filter GSoC project) has also a lot of TODOs, so it probably is not ideal for general use but serves well in the text filter function (commit). As a last change/improvement in the functionality I moved the filter functions for calling external filter executables back from libppd to libcupsfilters (now with the name cfFilterExternal() and ppdFilterExternalCUPS() being a wrapper), as it is also useful in native printer applications, as it allows using filters written in non-C languages or proprietary, closed-source filters. Also added support for System V interface scripts to the function (they are similar to CUPS filters but take input from named file, not from stdin). This was inpired by the work of GSoC contributor Chandresh Soni on the Braille Printer Application where he needs to embed shell-script filters into the native (not using PPD files) Printer Application (commit). Also several smaller fixes got done, like removing some unneeded, leftover portability code files commit and header files (commit). libcupsfilters needs the new Ghostscript 10.00.0 now. This got reflected now in the README file and in comments in the source code (commit). cupsfilters/catalog.h received a comment telling where the human-readable and translated strings for the IPP attributes and enumerated values come from. This information was only in ppd/ppd-generator.c (commit). There was also a bug report about pages in custom sizes rotated by 90 degrees for fitting the orientation. This came from the fact that Ghostscript's built in CUPS/PWG/Apple Raster output device tries to match the given page size dimensions with the ones of the PPD file, even if the size is custom. I have fixed this by not matching the page size dimensions against the PPD if the size is custom (commit). Michael Sweet released PAPPL 1.2.3 with a correction for string-type user-settable options (passwords, fax numbers, ...). With this and after getting some help from him I am noe able to do the Printer Applications without patches on PAPPL and pappl-retrofit! I updated pappl-retrofit and the Printer Applications appropriately (commit). I also updated all the 4 retro-fitting Printer Applications for last API changes in cups-filters (Merged libfontembed, cfFilterExternal() in libcupsfilters, see above) and updated the included Ghostscript to version 10.00.0, which has especially a faster PDF renderer and latest support functionality for PPD-less printing. Michael Swwet also added a feature to auto-select the A4/Letter default by locale and earlier there was already support for localization/human-readable strings and SNMP-based ink-level checking. So now I have everything to be able to get all my planned features into pappl-retrofit and the retro-fitting Printer applications, but cups-filters 2.0b1 first ... On the OpenPrinting web server the daily snapshots of foomatic-db are back, s it is easy again for distributions to package foomatic-db. Thanks a lot to Violet Kurtz from the OSUOSL for implementing this! From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|87811| |ipp-usb|ipp-usb|2956| |ps-printer-app|PostScript Printer Application|2595| |ghostscript-printer-app|Ghostscript Printer Application|1967| |hplip-printer-app|HPLIP Printer Application|6097| |gutenprint-printer-app|Gutenprint Printer Application|4911| Currently released is 2.4.2. There will be further bug fix releases in the 2.4.x series. Some bug fixes were done during the last month, see changes below. Ubuntu Kinetic Kudu (22.10 got released today with 2.4.2. The CUPS Snap (in the Edge channel) and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. The CUPS Snap in the stable channel is version 2.4.2. Currently released is 1.28.16. The restructuring of the code to separate the siamesian twins of the filter functions and PPD file support is completed and we also have done a lot of testing and bug fixing. Now we are finally polishing the coding style and updating the license/copyright headers for the 2.0.0 release. See above for more details. As cups-filters 2.0.0 will not make it into Ubuntu 22.10 we have continued with further bug fix backport releases in the 1.x series. Ubuntu Kinetic Kudu (22.10 got released today with 1.28.16. The CUPS Snap is currently locked to the /e496badbf2 commit (from May 20) of cups-filter's GIT master (2.x) until the restructuring gets more tested. The Printer Application Snaps use the current GIT master of cups-filters and so are the first application for real-life testing. Currently released is 1.2.3. In the last months the development of the 1.3.x series has already started. See changes below. 1.2.3 General bug fix release. See changes below. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-October-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - October 2023",
+ "url": "/OpenPrinting-News-October-2023",
+ "headings": [
+ "Ubuntu Summit 2023 in Riga",
+ "Google Summer of Code 2023",
+ "CPDB CUPS backend Snap",
+ "libcups3 support",
+ "CUPS 2.4.7",
+ "PAPPL 1.4.2",
+ "libcups 3.0b2"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/-fx_T4GIsX4/hqdefault.jpg",
+ "snippet": "Ubuntu Summit 2023 in Riga, GSoC 2023, CPDB CUPS backend Snap, libcups3 support, PAPPL 1.4.2, CUPS 2.4.7, libcups 3.0b2",
+ "content": "Probably many of you are using a modern driverless multi-function printer and scanner device, and it does not only print but also scan perfectly on your Linux system, or you have your driverless printer connected via USB and it also just works without any device-model-specific driver. This works especially thanks to Alexander Pevzner's excellent voluntary work of creating the IPP-over-USB daemon ipp-usb and the SANE backend sane-airscan for driverless scanning with both the eSCL and the WSD standards. For a longer time he has been very busy with other things and so he was keeping his OpenPrinting work in \"maintenance mode\", but now he showed up again and worked on some issues in CUPS and cups-filters. And he has also written an amazing article (Original, Google-translated to English) about his work, how he got into it, and especially praising me for my cooperation with him. And thanks a lot to Anton Gladky, without his hint on the DebConf2023 I had never got note of it. Some days ago, Alan Pope (\"Popey\"), a former colleague of mine at Canonical, and owner of the ubuntu.social instance of Mastodon, posted on Mastodon asking for help which printer to buy. I read the busy thread and answered several times, telling about OpenPrinting's list of driverless printers, confirming that the Xerox somebody else suggested is actually on the list, warning about (mainly HP and Canon) printers which stop scanning when they run out of ink/toner, ... Confirmed by most people answering down the thread it turns out that currently Brother is the best choice, and there especially laser printers. These are reliable printers which perfectly work as driverless IPP printers and scanners with all operating systems and devices, and especially they seem just to be designed to do their job of printing and scanning and not to suck lots of money out of the users by making them buying lots of over-expensive ink and toner. Especially I found another thread about a purchase of a color laser multi-function printer from Brother and also answered there, telling that we have currently 657 Brother printers on our list and this answer was my most successful Mastodon post! 21 people favorited and 16 people boosted my post! And here is a YouTube video where someone is showing how to set up printers with YaST (SUSE) but there is something wrong with it ... Just watch the video, read the description only afterwards... So let us now start with what we did at OpenPrinting in October ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. The Summit is coming close, I am already in Riga since yesterday and today at 2pm EET (CET) it will actually start. A lot of exciting stuff is waiting there in 5 rooms for 2.5 days. And there will be also a surprise! The best of all is that one will meet each other again, like last year on the Ubuntu Summit 2022 in Prague in these 3.5 days (many arrived early, to enjoy Riga, get rid of jet lag, have a margin for flight delays, attending the Canonical-internal Sprint before the Summit ...). And on the conference itself I will give my third Snap workshop! It is Improving Snap maintenance: Automating tag updates on new upstream releases of the app On Saturday, November 4, at 12:00 - 13:00 EET in Beta 2 It is all about having your Snap get automatically updated in the Snap Store when any of the underlying upstream projects issues a new release. This helps users of Snaps to always have the latest and greatest versions of their apps. It is an easy-to-apply GitHub action/workflow, developed by Heather Ellsworth who was in Canonical's Desktop Team, in the Snap Squad. If you are developing an application and snapping it or are snapping applications for developers who do not snap by themselves (like the Snapcrafters do) you should not miss this session, as applying the automation will ease youe life. If you want to attend it, to make use of the time (60 min) efficiently, I want to ask you to download the slides and follow the instructions under \"Setup\", so that you have forked the example GitHub repositories. Also it is easier to do the exercises when having the slides at hand to browse and copy-and-paste. By the way, I plan to apply the method also on the OpenPrinting Snaps. Especially the Ghostscript Printer Application with its ~20 parts will benefit a lot from it. But it will us also get an Ubuntu Core Desktop with always up-to-date printing stack. And do not think that this will be an Ubuntu Summit without any OpenPrinting session, GSoC contributor Akarshan Kapoor will tell about his GSoC work on scanning support in PAPPL in the talk ScaniVerse: A New Horizon in Unified Scanning for Linux Systems On Sunday, November 5, at 11:30 - 12:00 EET in Sigma Akarshan presents his work on scanning support of this summer, the addition of scanning support to PAPPL to be able to make scanner drivers available as Scanner Applications, emulators of deriverless scanners (PAPPL PR #249), the retrofit of SANE drivers (GitHub repo), and his new MetaScan (GitHub repo). I will be in the room with him and help answering the questions. There are a lot of great sessions to choose from, often several in parallel in different rooms. To help attendees through all this, the schedules display, nicely hacked by Canonical's Community Team manager, Philipp Kewisch, has a facility that you can mark interesting sessions with a star. These will get listed under \"My Conference\" in chronological order then, so that you do not miss what you plan to attend. I have marked up to now (only to get an inspiration, not sure whether I will attend them all): From origins to open source: The journey of DreamWorks Animation's production path tracer, MoonRay, Randy Packer (DreamWorks Animation), Fri 11/3, 15:00 EET Introducing Ubuntu Core Desktop, Ken Vandine (Core Desktop development lead, Canonical), Oliver Smith (Product Manager Desktop, Canonical), Fri 11/3, 16:30 EET Alioli ROV Submarine Drone, Juanmi Taboada, 11/3, Fri 17:00 EET What It's Like to Build an Open, Repairable Laptop, Daniel Schaefer (Framework Computer), Sat 11/4, 9:00 EET Windows Subsystem for Linux (WSL) - Make an awesome Linux environment directly on Windows, Craig Loewen (Microsoft), Sat 11/4, 9:30 EET Feature detection for games, letting machines figure out system requirements, Mathieu Comandon (Lutris), Sat 11/4, 11:30 EET Container craftsmanship: from a Pebble to a ROCK - Interactive Workshop, Cristovão Cordeiro (Canonical), Sat 11/4, 14:00 EET Dark matters: The security abyss of distroless containers, Cristovão Cordeiro (Canonical), Sat 11/4, 16:00 EET Snapshot in time: Leveraging Snap and Flatpak to preserve our software legacy, Mathieu Comandon (Lutris), Sat 11/4, 16:00 EET How to launch an open source software?, Ömer Faruk Aydin, Sat 11/4, 16:30 EET Join the RISC-V revolution, Heinrich Schuchardt (Canonical), Sat 11/4, 17:00 EET Skynet or Star Trek, what’s the future of AI? - Panel session, Graham Morrison (host, Canonical), Andreea Munteanu (Canonical), Craig Loewen (Microsoft), Frank Karlitschek (Nextcloud), Juan Luis Cano Rodríguez (QuantumBlack, AI by McKinsey), Pablo Ruiz-Múzquiz (Kaleidos/Penpot), Sun 11/5, 9:00 EET ScaniVerse: A New Horizon in Unified Scanning for Linux Systems Akarshan Kapoor (Indian Institute of Technology, Mandi, India), Sun 11/5, 11:30 EET Bringing Windows applications to Linux app stores, Merlijn Sebrechts (Ubuntu Community Council, Snapcrafters), Sun 11/5, 12:00 EET Open Source for Sustainable and Long lasting Phones, Luca Weiss (Fairphone), Sun 11/5, 12:00 EET Behind the Scenes of tox: The Journey of Rewriting a Python Tool with Over 10 Million Monthly Downloads, Jürgen Gmach (Canonical), Sun 11/5, 14:30 EET Linux Lads live podcast recording, Shane Kitt (Linux Lads Podcast), Sun 11/5, 16:00 EET In addition to these lots of awesome talks and workshops and hopefully also a great hallway track, there are also 3 evenings and on all these there will also be events not to be missed. On Friday, right after leaving the last session at 18:00 EET in the hallway between the conference rooms you will directly be on the first one, the Welcome Reception/Opening Mixer Have some after-session chat with appetizers and form groups to have dinner in the nice old town of Riga afterwards. Saturday evening, from 20:00 - 23:00 we will be gaming like hell in the Gaming Night In the 2 workshop rooms (Beta 1 & 2) opened up to one we will play board games, video games, Foosball, and Air Hockey. And you can contribute: Bring your board games, gaming consoles, and other gaming devices!! Also on Saturday there will be a Special Demonstration What exactly, will be told through the event. There are 2 sessions of it, at 21:00 and 22:00, room to be announced. And after two and a half days of amazing, exciting, eshausting, ~~boring~~, ... talks and workshops, we will celebrate the success of the second Ubuntu Summit on the Closing Party on 19:00 - 23:00 EET in the Digital Art House, walking distance from the venue (so no party buses). Drinks and a dinner buffet will get served. So see you in Riga! Or attend remotely via live streams and recordings. And keep up-to-date via Mastodon: #UbuntuSummit, #UbuntuSummit2023 Now we are close to the end. Having extended the deadline for all the now 5 OpenPrinting contributors it is time to write the final reports. Their deadline is Nov 6, Monday next week. Due to his participation in the Ubuntu Summit Akarshan Kapoor already finished one week earlier and so his report is already posted. He succeeded with the addition of scanning support to PAPPL and so we will soon see first Scanner Applications. And from Kushagra Sharma, GSoC contributor on CPDB support in the print dialogs I got a last write-up before the end of the GSoC: Implementation for CPDB pkg config support is completed which allows autoninja to set flags for CPDB allowing its import into the system. Currently implementing all the virtual functions for print backend as of now I am able to display all thé available printers for different print backends on the print dialog using CPDB, working on fetching their print capabilities and semantics. This will conclude CPDB support for print dialog in chromium. Thanks Till Kamppeter and Gaurav Guleria for all the support, I hope we keep working on CPDB and one day all software use CPDB for print dialog. Next month I will post an overview with links to all the final reports. And I was in Sunnyvale at Google on the Mentor Summit meeting my fellow mentors again, especially also Deepak Patankar, who was lucky to get a spot through the waitlist. The event was smaller than the 2018 edition which has taken place in the same location, as each mentoring organization got only one guaranteed delegate spot and not two. But nevertheless it was still fun. Especially I have given a 3-min (!) lightning talk about the participation of the Linux Foundation and the Opportunity Open Source in the IIT Mandi. It was in one of two sessions where every mentoring organization could give a brief presentation about something interesting or important, usually success stories about exceptional contributors. So mine was somehow different, but in some form also a success story of a contributor, of Akarshan doing the excellent local part of the organization of the event ... And even quicker was the self-presentation of each of the 175 attendees. We only could use 4 words! I used OpenPrinting - Snap - Ubuntu - Community. But the rest went much more easily, mostly hallway chat but also the un-conference, BoF-style sessions planned on the spot. Two boards, one for each conference day, with squares for each hour and each of the 5 rooms where people could post a paper announcing their session. No pre-planning, no CfP. A little like the Ubuntu Developer Summits many years ago. In addition, I departed to the US two days earlier, to not miss the event if flights are late or canceled, to have the jet lag go down a bit, and also to have a short touristic visit in San Francisco, and luckily enough, on the evening before the Mentor Summit, there happened the Annual Celebration of the Internet Archive, a great organization conserving everything which appears on the internet, even if popping up only shortly, and making it available via the Wayback Engine, preserving a lot of history. I met also some of the Mentor Summit attendees that evening, especially Robert Kaye from Metabrainz/Musicbrainz who works closely together with the Internet Archive. To complete the printing stack in the all-Snap experience of Ubuntu Core Desktop we still need one more Snap, the one of the CUPS backend for the Common Print Dialog Backends (CPDB). This is needed as all the application's print dialogs also need to get switched over to the New Architecture of not having PPD files any more, but instead, IPP print destinations. And exactly this we have implemented in the CPDB backend for CUPS, and now making the dialogs using CPDB we will make them not only working with the upcoming CUPS 3.x and with the CUPS Snap, but also assure that they stay working with further changes in CUPS and also being open for new print services, like for example cloud services. Luckily I was successful with my talk about Snap and Ubuntu Core Desktop and my Snap workshop on the Opportunity Open Source in Mandi, as Biswadeep Purkayastha, one of the candidates for this year's GSoC, attended and stepped up as a volunteer for OpenPrinting. Right after the conference he studied the rest of the workshop (In Mandi I had only 60 min for the workshop which was originally designed for 90 min - 2 hours), my Daemon Snapper's Workshop from the Ubuntu Summit 2022, and Ken VanDine's blog about Ubuntu Core Desktop. Then he asked me what he could do for OpenPrinting and I offered him to snap the CPDB backend for CUPS. He is really enthusiastic about OpenPrinting, especially he ported the cupstestppd utility's core functionality into a library function in libppd (Pull Request #6) and when he got the message of not having been selected for GSoC, he asked me right away what he could do voluntarily and I talked with him about OCI containers and Snap and also about my planned sessions in Mandi. Biswadeep accepted the snapping task and started right away creating the snapcraft.yaml. He asked me when he got stuck and I helped him through several quirks, including libcups2 of CUPS 2.5.x having removed some things which were marked deprecated in CUPS 2.4.x. Later on we both got stuck as the CPDB backend is entering a new area: It is a user daemon, triggered via the session D-Bus (see Ken VanDine's second blog). There is support for such a thing by snapd but it is still considered experimantal and not really well documented, and it only supports a client application to call one pre-defined D-Bus service, not as we have with CPDB that the client (in our case a print dialog) is looking for all suitable D-Bus services (in our case the CPDB backends) which are installed and does not know beforehand which these are (in our case a new cloud printing service with its CPDB backend could appear). So I asked for help on the snapcraft.io forum, but did not get any answer yet, neither from Canonical's snapd and snapcraft developers nor from the community ... So now I will have to make the developers aware in-person, on the Canonical Engineering Sprint, Canonical's internal meeting of their around ~700 engineers, in the week right after the Ubuntu Summit, also here in Riga. Thanks a lot, Biswadeep, for all your great work on this! Michael Sweet is not only deep into the development of libcups3, the CUPS library of the new CUPS 3.x, but he is also already switching PAPPL to it. The current stable release 1.4.2 can be built with either libcups2 or libcups3, the library being autodetected by the ./configure script, and the master branch in the GIT repository which is approaching version 2.0 is even libcups3-only. So Michael seems to be eager to switch us into the New Generation of all-IPP, PPD-less printing as soon as possible and probably also considers Printer Applications as a thing of the New Generation CUPS 3.x world. Akarshan Kapoor has added scanning support to PAPPL during this year's GSoC and posted a Pull Request for its inclusion. As it is a significant new feature it will most probably not be accepted into the 1.4.x series but only into 2.x which would require that PAPPL-based Scanner Applications will háve to use libcups3. As we do not want to only support writing new scanner drivers from scratch but also retro-fit all drivers which are already there, which are SANE backends, we need SANE support and this we want to do in pappl-retrofit where we are already supporting PPD-based legacy printer drivers. But pappl-retrofit also uses the libcups2-based libcupsfilters and libppd libraries, and pappl-retrofit also uses libcups2 by itself. This made adding support for building with libcups3 to the libraries libcuppsfilters, libppd, and pappl-retrofit getting more urgent. Work on libcupsfilters got already started by Gayatri Kapse during the selection process for the GSoC earlier this year (Pull request #24) and as Biswadeep Purkayastha got stuck with snapping the CPDB backend for CUPS I asked him to work on the addition of libcups3 to the libraries. He did all the renamings to the new libcups3 function names and the #defines for converting to the libcups2 names when building with libcups2, taking Gayatri's work and also PAPPL 1.4.x as example and in the end I completed it by doing the more tricky parts. But the worst thing was already done much earlier, copying all PPD file support code into libpppd. This way all the libraries did not contain any calls of PPD-related functions in libcups2 any more. The only code I still had to copy from libcups2 was the code to support the back channel and the side channel for communication between CUPS filters and CUPS backends. I have taken the files cups/sidechannel.h, cups/sidechannel.c, and cups/backchannel.c and copied their content over into the new files pappl-retrofit/cups-side-back-channel.c and pappl-retrofit/cups-side-back-channel-private.h in pappl-retrofit. After that I renamed all the functions, data types, and constants to the scheme of pappl-retrofit. pappl-retrofit builds with either libcups2 or libcups3 now, always using its own copies of the back/side channel support functions. All the libcups3-support-related changes are done now and available in the master branches of the three libraries. They still need more testing before the 2.1.0 releases of libcupsfilters and libppd and the 1.0.0 release of pappl-retrofit. Scanner Applications being forced to use libcups3 instead of libcups2 are no problem at all if they are provided as Snaps or otherwise packaged in some sandboxed format (like Docker/OCI containers). In all these formats each application brings its own dependencies (needed libraries, ...), so the system can use libcups2 while the encapsulated Scanner Application uses libcups3. Even classically installed the Scanner Applications can use libcups3, as libcups2 and libcups3 can co-exist on classically installed distributions, at least if they use DEB or RPM. Even more this works as current libcups3 uses the 3 actually in its name, having the library file libcups3.so.3 and the compiler argument -lcups3. Only disadvantage against using libcups3 is that libcups3 is still in its beta phase, but Michael Sweet's code quality is very high, so it is not such a problem. Michael Sweet has already started the development of CUPS 2.5.x but not stopped releases of of 2.4.x yet. Latest release is 2.4.7 including the fix for CVE-2023-4504 and other changes, like adding OpenSSL support for the cupsHashData() function and bug fixes. List of changes from the original announcement: CVE-2023-4504 - Fixed Heap-based buffer overflow when reading Postscript in PPD files Added OpenSSL support for cupsHashData (Issue #762) Fixed delays in lpd backend (Issue #741) Fixed extensive logging in scheduler (Issue #604) Fixed hanging of lpstat on IBM AIX (Issue #773) Fixed hanging of lpstat on Solaris (Issue #156) Fixed printing to stderr if we can't open cups-files.conf (Issue #777) Fixed purging job files via cancel -x (Issue #742) Fixed RFC 1179 port reserving behavior in LPD backend (Issue #743) Fixed a bug in the PPD command interpretation code (Issue #768) Also PAPPL received a bug fix release, 1.4.2. Fixed potential crash while listing devices (Issue #296) Fixed potential deadlock issue (Issue #297) Fixed loading of previous state (Issue #298) By the way, the 1.4.x series of PAPPL can be built with either libcups2 or libcups3, while the master branch (2.x) is libcups3-only. And last but not least, Michael also released the second beta of libcups3, for more API modernization, improvement, and clean-up. Added the ipptransform command to replace/upgrade the ippevepcl and ippeveps commands (Issue #65) Added cupsFormDecode and cupsFormEncode APIs (Issue #49) Added cupsJWT APIs to support JSON Web Tokens (Issue #50, Issue #52) Added ippAddCredentialsString and ippCopyCredentialsString APIs (Issue #58) Added cupsCreateCredentialsRequest and cupsSignCredentialsRequest APIs and updated cupsCreateCredentials API to better support X.509 certificates (Issue #59) Updated the configure script to add _FORTIFY_SOURCE=3 (previous level was 2) when not using address sanitizer and when it hasn't already been added (Issue #51) Updated the httpAddrListen function to use the maximum backlog value. Fixed ipptool limit on the size of an attribute value that would be printed (Issue #5) Fixed some configure script issues (Issue #48) Fixed JSON output bug in ipptool. Fixed CUPS_DNSSD_IF_INDEX_LOCAL when using Avahi."
+ },
+ {
+ "id": "post:OpenPrinting-News-October-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - October 2024",
+ "url": "/OpenPrinting-News-October-2024",
+ "headings": [
+ "Festa do Software Livre/UbuCon Portugal 2024",
+ "Ubuntu Summit 2024 in the Hague",
+ "4 times in Podcast Ubuntu Portugal",
+ "Google Summer of Code 2024",
+ "New Releases"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/_NMKUHkZ0i8/hqdefault.jpg",
+ "snippet": "5 years of OpenPrinting News, Festa do Software Livre/UbuCon Portugal 2024, Ubuntu Summit 2024, 4 times in Podcast Ubuntu Portugal, GSoC 2024 completed, new releases",
+ "content": "This month we have the 5th anniversary of the OpenPrinting News! For 5 years now, starting October 2019, I have posted here every month, to tell what we are doing at OpenPrinting and what we are planning to do: Our design and development work, new releases, vulnerabilities and security issues, our GSoC participation, conferences we attend and talks we give, what people say and write about us, and also important things which happen in the free software world in general. This is not only useful for those just interested in OpenPrinting, but it also helps us to attract and onboard volunteer contributors and it is an easy way to find out what we have done at which point in time. This facility is unusual for free software projects, probably due to the fact that it requires some work. So far I got only positive feedback, so I will continue. It also probably has potential for improvement, so please tell us your suggestions through the communication channels mentioned below. Last month, I have been on two conferences: The Festa do Software Livre/UbuCon 2024 in Aveiro, Portugal and on the third Ubuntu Summit, in den Haag, in the Netherlands. The Festa was done principally in Portuguese language and my 3 sessions I have given in Portuguese, whereas the Summit is the big community event organized by Canonical, this time with less talks but with booths instead. On the Festa do Software Livre we recorded 2 episodes of the Podcast Ubuntu Portugal and on the Ubuntu Summit another episode, so there are 4 episodes with my participation now. The GSoC has ended and our 11 contributors have all done amazing work to put together our most successful GSoC year. We had never that many contributors and all have actually done code which we can merge upstream. And there were also several new releases at OpenPrinting, starting with the 2.1.0 releases of libcupsfilters, libppd, and cups-browsed to include the fixes for the recent vulnerabilities and updates of libcups3 and PAPPL. Videos of the talks on the UbuCon Asia 2024 and on the Open Source Summit Europe 2024 are available now. See links to the recordings of my talks in the appropriate sections in the August News. So let us see what happened at OpenPrinting in October ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat After 20 years I was again on a a conference held in Portuguese laguage, this time on the Festa do Software Livre in Aveiro, Portugal, a 2-day conference with a main track and several sub-conferences co-located by different open-source organizations: Drupal, Flutter, WikiMedia Portugal, Inêrcia, and the UbuCon Portugal. I followed the invitation of Diogo Constantino. I was departing early in the morning, on the day before the conference started, and when telling to my colleagues in Canonical's Desktop Team, that I am heading to Aveiro, Ana Sereijo, UX designer, spoke up telling me that she came from there. So, as I was arriving in Aveiro at lunch time, I asked her for restaurant recommendations and this way got to an excellent, delicious place for classic Portuguese food. I ate grilled sardines and it reminded me to when I lived in Portugal for a year back in 2007. Diogo and the others of the organizing team was still at their day jobs, so I have finished translating my slides to Portuguese in the afternoon (that is really a lot of work, feels like more than creating the talk in the first place) and met them for dinner. The conference has taken place in the Departamento de Eletrónica, Telecomunicações e Informática (DETI) of the University of Aveiro, in up to 6 rooms, 2 lecture halls and 4 classrooms in parallel. There have been up to 2 plenary tracks and sub-conferences by Drupal, WikiMedia Portugal, Flutter, Inêrcia, and the UbuCon Portugal. Here are the schedules: Festa do Software Livre, UbuCon Portugal I have given 3 sessions, all in Portuguese, as announced last month. On the first day, Friday, I gave my talk about the history and the current work of OpenPrinting, but in Portuguese: OpenPrinting - A boa impressão do software livre Video I have given it in the main track. I ended up talking about how I got into free software, the history of OpenPrinting, our current work on CUPS 3.x including its integration in the desktop, Windows Protected Print, ... for 70 minutes and afterwards did a 14 min Q&A session. I also got some printing-related questions during the coffee breaks on both days. And I did not talk about the recent vulnerabilities and nobody asked me about them during the Q&A (if you want to hear me talking in Portuguese about that, see my Podcast Ubuntu Portugal participation, episodes E321 and E322). On the second day, we had the UbuCon Portugal, where the morning part was all about Snap. First, I gave a Portuguese version of my talk in which I explain what Snap is, how it works and how it is motivated, and about the Snap-only operating systems Ubuntu Core and Ubuntu Core Desktop: Linux para desktop, fácil como um smartphone! Graças ao Snap! Video I also mentioned how the work of OpenPrinting comes into play for Ubuntu Core Desktop and after the talk we had a 20-min discussion about the quality control of Snaps, initiated by an attendee who installed the nextcloud-client Snap and it did not work for him. After a coffee break people could make their hands dirty with snapping by themselves, in an interactive workshop to learn how to package applications as Snaps: O seu aplicativo para todo mundo! Graças ao Snap! - Oficina interativa Video This is the workshop which I have given several times on other conferences, but this time I have given it in Portuguese. After lunch there was a workshop about developing games with Godot (Video parts 1, 2) and after that there was the talk \"Uma história de vida usando Linux e Debian\" (video), José M Calhariz talking about how he got into computers and free software, and in the end, the two graybeards who having told about their free software history throughout the conference have met to make the happy end of the UbuCon. On the two conference days in the evenings, dinners were organized in a nearby restaurant. The first one was to celebrate the Oracular Oriole (24.10) release of Ubuntu and the second was the \"closing party\" of the Festa do Software Livre. We were 10-15 people on each of them, the organizers of the event and some others. Each night we have produced an episode of the Podcast Ubuntu Portugal, E320 and E321, resp. There not only the usual hosts, Diogo Constantino and Tiago Carrondo were speaking, but we all got involved. And Diogo brought for everyone a little rubber duck, and one really hears them often in the two podcasts ... Therefore they got the duck (with a beer bottle cap as hat) as avatar. At the second day's dinner we had also a post-conference meeting talking about what went well and what not so well at the conference and what one can improve in the next edition. And before the dinner Diogo and me exchanged our experience in recording and live-streaming the Festa do Software Livre and the Opportunity Open Source resp. Diogo fell in love with the wireless clip-on mic kits (from Tonor) which I brought (and used several times on the conference) and bought such a kit right when he got home. And we concluded that we need to develop a better method for live-streaming/recording/remote speaking and document it somewhere. Update: Complete session video playlists for Plenary and Workshop rooms and all links to session recordings here point to the individual videos now. Recordings of the conference days in the plenary room: 25th, 26th, 27th Playlists of all session recordings: Plenary room, Workshop room Pictures: Photographers, Photographers Hi-Res unedited, Attendees Aftermovie When I refer to talks or workshops in this section, I always link to the slides, exercises, and recordings, if possible, so if you have missed a session, you can watch it, read the slides, and also do the workshop's exercises, whenever you like. The third Ubuntu Summit in the Hague, Netherlands, was again a success! During the years we made a move from having lots of talks and workshops to making the hallway track the central part of the event. 2022 there were still 7 rooms in parallel (1 plenary, 4 breakout, 2 workshop), 2023 5 rooms (1 plenary, 2 breakout, and 2 workshop), and now there was only the plenary room, 1 workshop room and ... an exhibition consisting of 26 booths! It got much harder to get a talk or workshop proposal accepted, only talks of general interest, breaking news, and with the \"Wow\" effect made it into the conference, special interest topics got discussed at the booths now. Here are the schedules. Before it started As I am part of the organization team of the Summit, as I was in the previous 2 years, too, I had arrived early, already in the afternoon of the 22nd of October, to help on the preparations, together with Mauro Gaspari, principal organizer of the event, and also Aaron Prisk, Jason Nucciarone, and Jesús Soto. These extra days gave me also the opportunity to meet people, also due to the fact that in the week before the Summit the Canonical-internal Roadmap/Product Sprint, to be attended by all the managers, has taken place. So I have especially also met Ken VanDine and some people of Canonical's desktop team. And I also met the non-Canonical Summit attendees of the free software community as they were rolling in. Soumyadeep Ghosh from the Snapcrafters already joined us at dinner of the 23rd, and on the 24th in the morning I went to the hotel where most of the community people were accommodated, principally to prepare for the Snapcrafters booth and the Snap workshops with Soumyadeep, Merlijn Sebrechts, and Lucy Llewellyn from the Snapcrafters. There I met also many others, especially Heather Ellsworth from Thunderbird, Akarshan Kapoor the master of the Scanner Applications, Mathieu Comandon from Lutris, Martin Wimpress (\"Wimpy\") from NixOS, ... And on the 25th, the Summit finally took off ... Last preparations at the venue in the morning, and as soon as the Roadmap Sprint ended at noon, the booth staff from the community arrived and the preparation of the booths started. Many busy people in the main foyer of the venue, the place looking somewhat chaotic, and one started to meet more people. It was originally planned to open the exhibition only after the opening plenary, but the booths got already busy right in the beginning, as the exhibition ground was between the main entrance and the plenary room. Snapcrafters Booth and Workshops I was participating in the Snapcrafters booth, together with Soumyadeep Ghosh, Merlijn Sebrechts, Lucy Llewellyn and so we were also setting up our booth. As I have already run a Snapcrafters booth with Soumyadeep on the UbuCon Asia Soumyadeep had already a slide show for the booth screen where he only needed to update the workshop announcements. Our booth tables were full of Snapcrafters stickers and Origami Snapcraft birds. With the same people I was also participating in the organization of the two Snap workshops: \"Crafting snaps quickstart guide 101\" (Slides, Exercises, Video) and \"How to build and test your snaps automatically using GitHub actions\" (Slides, Exercises, Video) I did not do the presentations themselves, this was done my Soumyadeep Ghosh and Merlijn Sebrechts, but I have given a short introduction telling how the Snap workshops had their roots in my Snap workshop series on the Ubuntu Summit 2022 and the first one being based on Heathers's original workshop \"Snapping like Hell(sworth)\" which was afterwards given on many other conferences, mainly by me but also by Lucy and by Soumyadeep. In the second workshop, in the end of the presentation part, I have also told about our plans to merge the Snapcrafter's GitHub action with the Canonical Desktop Team's GitHub Action. I (and several other Snap experts) have also been in the room to help on the exercises, as these workshops were, in contrary to several others, really interactive. Talks and Workshops During the event I was most of the in the exhibition area, but I also made it into some of the talks and workshops. I attended following sessions, including all those sessions where our GSoC contributors and mentors were the speakers: \"Inkscape for Everything\" by Christopher Rogers (Video) The session was announced as a workshop and had taken place in the workshop room. In the beginning I installed Inkscape expecting that there are exercises, but actually it was only a demo of most of the functionality of Inkscape, which is a lot, allowing for really professional artwork, doing nearly everything which has to do with graphics: Non-destructive photo editing, slides for presentations, ... Christopher tells that if he had given exercises he could only treat a very small part of the whole session's content. \"Live build your submarine step-by-step\" by Juanmi Taboada (Video) Here I was in the good hope to put my hands on some hardware, but, as the Inkscape \"workshop\" this was also only a demo. Juanmi, who brought his remote-operated and free-software-controlled submersible already to last year's Summit explained the free-software-driven hardware-components, showed them and put them together, but there were no extra copies for the audience to try it by themselves. \"Fuzzing in the open: Integrate your project in OSS-Fuzz for continuous fuzzing\" by Dongge Liu, George-Andrei Iosif, Jiongchi Yu (Slides, Exercises, Video) Finally, an actually interactive workshop, but this one was also with my mentoring, as the speakers are no less than our GSoC team for deploying OSS Fuzz on the OpenPrinting repositories, contributor Jiongchi Yu and mentors George-Andrei Iosif and Dongge Liu. Unfortunately Jiongchi could not come to the Summit in-person as he was on another conference in the US. So after a short introduction by me, George Andrei and Donggi were explaining the steps for the attendees to do on their laptops, with the Heartbleed on OpenSSL being the example. Jiongchi was connected via video meeting and in the end he told in a ~12-min talk about the OSS Fuzz deployment on OpenPrinting. \"The Journey of KDE Plasma on Ubuntu Core\" by Kevin Ottens (Slides, Video) This is all about the development of an Ubuntu Core Desktop distro with KDE instead of GNOME as desktop session. The architecture is shown and the challenges encountered and how they got solved. Soumyadeep Ghosh, GSoC-2024 contributor of the Snap backend for KDEs software manager Discover, mentored by Scarlett Moore, asked several interesting questions. \"Unstoppable Force Behind Linux on RISC-V\" by Gordan Markus and Yuning Liang (Slides, Video) Gordan Markus, Director Silicon Alliances at Canonical, and Yuning Liang, founder of Deep Computing, tell about Deep Computing's efforts to create consumer-ready laptops with RISC-V architecture and Ubuntu as operating system. \"Re-inventing distroless with Chiselled Ubuntu containers\" by Cristovão Cordeiro (Slides, Video) In this talk Cristovão Cordeiro, manager of a containerization team at Canonical, tells about freeing containers from unnecessary files, not only to save storage space but also to reduce the attack surface of the containerized applications. He uses the chisel tool which allows the installation of parts of Debian packages (so-called \"slices\"). Cristovão was also GSoC mentor at OpenPrinting this year for the project of Rudra Pratap Singh, to create OCI container images of CUPS and Printer Applications. \"Building secure and minimalistic Docker images for Data and ML with Rockcraft\" by Anas El Husseini, Zhijie Yang (Slides, Exercises, Video) Right after Cristovão's talk one could get hands-on with his subject matter in this workshop. And it was really interactive. On one of the first slides there are instructions on which packages to install and a link to a GitHub repo with all the example files for the exercises in a subdirectory for each task. I have actually done the exercises during the workshop and they all worked as designed. \"Flush with Innovation: Revolutionising Train System Toilets with Embedded Technologies\" by Akarshan Kapoor (Slides, Video) Our GSoC contributor Akarshan Kapoor was on the Ubuntu Summit again, but not with a talk about Scanner Applications. Doing his second exchange semester in Germany, he also did an internship where he worked on the free software stack used in the monitoring system of the toilets in the trains of the German railway. Christian Ehrhardt, MC of the day, announces this talk so nicely: This is AK, who will revolutionize my personal live. Because train travel in Germany really is not, what you want it to be, and if it is really not what you want it to be, you at least want to have the toilets working ... And Akarshan, when he introduced himself in the beginning, he told that he was already speaking on the Summit last year, about his Scanner Application work for OpenPrinting, and he shouted me out! Lightning Talks I have also attended the lightning talks, especially \"Making the Thunderbird snap a first class citizen\" by Heather Ellsworth (Slides, Video): Heather, who formerly worked in Canonical's Desktop Team and had moved on to Thunderbird, is snapping Thunderbird in close collaboration with her former colleagues from Canonical. \"How I built Check-in Kiosk for UbuCon Korea\" by Youngbin Han (Slides, Video): On-the-spot printing of conference badges with a self-service kiosk setup with a label printer, created by Youngbin. \"Back to the Future of Open Source 3D Printing Hardware\" by Yatin Khurana (Slides, Video): Indian manufacturer makes true open-source hardware components for 3D printers. \"Open Source DJing: bringing hardware compatibility to the Linux platform\" by Jesús Soto (Slides, Video): Before Jesús performs it live on the closing party he tells in the last lightning talk of the conference, right before the party, how DJing with free software is done. and the lightning demo: \"Modifying a Framework Laptop from x86 to RISC-V live on stage\" by Nirav Patel (Video): Framework's CEO is showing how easy it is to make changes on the hardware of a Framework laptop, thanks to their modularity. And with Deep Computing having presented their RISC V mainboard for Framework, it is exactly this which makes it into the sample laptop within the 5 minutes of a lightning talk slot. Unfortunately no boot test is demonstrated ... But the demo was already impressive this way. Should we try to get a lightning workshop next year? Exhibition On the exhibition I have not only received visitors at the Snapcrafters booth but also visited several booths: Deep Computing: I met the founder of Deep Computing, Yuning Liang, and he showed me the RISC-V-based Roma laptops and also the RISC-V mainboard for Framework laptops, and at the same time there was also the 14-year old Gabriel Ozkan who was very interested in participating in Open Source. I told that I am leading OpenPrinting and that I am fellow of the Linux Foundation, and to Gabriel I also told about Rudra Saraswat who is also 14 years old and he is leading Ubuntu Unity and has created blendOS. Yuning gave a RISC-V SBC to both Gabriel and me, and I contacted him some days ago how to get it working and he put me in contact with the right people. The board can be useful for me to test the printing stack on RISC-V. Yuning has also given the talk about RISC-V, together with Gordan Markus from Canonical (see above). Framework: Right nect to the Deep Computing booth was the Framework booth where you could see and try out their laptops and their laptop's modularity. Naturally, they also had Deep Computings RISC-V board on their booth. Nirav Patel, their CEO, has done the lightning demo of changing the motherboard in five minutes (see above). UBPorts: This was the place where you could find Diogo Constantino (of the LoCo Portugal) most easily, as participant of this booth and Ubuntu Touch enthusiast who even uses this system as daily driver. Also Alfred Neumayer, master of Snap on Ubuntu Touch was participating (and giving a talk, Slides, Video). Back to the Future of Open Source 3D Printing Hardware: Here I met Yatin Khurana, from Boltz R&D in India, developing truly Open-Source hardware for 3D printers, in contrary to most manufacturers going more and more closed-source. I am looking into getting him onto the next Opportunity Open Source conference. Yatin has also given a lightning talk (see above). Thunderbird: For me visiting the Thunderbird booth was less because I use Thunderbird for more than 20 years already (I started as it was still the mail part of Netscape Communicator), but more to meet old friends, Heather Ellsworth and Monica Ayhens-Madon. As last year, Monica has bought a penguin for Jill again and let Mathieu Comandon again bring it to its Destination. The Thunderbird booth was right next to UBPorts and Heather made the mobile version of Thunderbird working on Ubuntu Touch. Hallway Track When Diogo Constantino showed up at our Snapcrafters booth I started chatting with him, in Portuguese, and not taking it actually seriously, telling him that we should record an episode for Podcast Ubuntu Portugal on the Summit, and he found that a good idea, and then he asked the organizers for a room and we started gathering people who speak Portuguese end ended up to produce episode E322 with Diogo, Cristovão Cordeiro (Canonical Containerization/Rockcraft), Carlos Nihelton (Canonical Desktop Team/WSL), Diogo Sousa (Canonical Security Engineering), and me. This was the 4th time of me being in the Podcast Ubuntu Portugal. On the UbuCon Asia in Jaipur, where I met Soumyadeep Ghosh for the first time and I was talking with him about a lot of my free software activity and experience, he came to the idea to create a monthly Ubuntu podcast, probably because I told him also about Heather's famous Indabas. On the Summit he was then looking for help on how to do the logistics of a podcast, and it was great that Diogo as experienced podcaster was there and he explained everything to Soumyadeep and we created a room on Matrix for further planning. And I also met our famous vulture, Liam Proven, the Reg FOSS desk from The Register, again, exactly at the dinner of the 26th, which I had with him and Soumyadeep, in an Indian restaurant. As Soumyadeep, he likes the really spicy Indian food and so they asked the restaurant staff to do it really as in India and not adapted to Europe. Liam told a lot about his long life, his accidents and all the steel in his body holding together his broken bones, and so he got the \"Iron Man\" for me ... Hacker Spaces On the evening of the 26th, right after the talks, meeting rooms were set up for the Hacker Spaces, informal meetings of some of the participating free software organizations and groups, for hacking, debugging, planning, ... The groups who got a room were Ubuntu Flavours, Governance & Autoinstall, Open Source Security, Linux Gaming, Juju & Friends, and the Open Documentation Academy. As OpenPrinting is participating as organization in the Open Documentation Academy (ODA), I have participated in their room. Our activity was running an episode of the weekly Open Documentation Hour live session (Episode 35, Video). Graham Morrison, at Canonical responsible for the Snap documentation and also project lead of the ODA (at the very right in the frame, but not visible in the first few minutes), is hosting the session. At 2:00 min we discussed the use of GIT to manage the documentation and I (second to the right in the frame, in the beginning at the very right) am telling that I use it for all content on OpenPrinting without problems. Right after (3:18 min) Graham is introducing me as responsible for OpenPrinting and then I tell what OpenPrinting is, about CUPS, Michael Sweet, and our need of documentation and that therefore I joined the ODA as the first non-Canonical organization. I also tell that Michael Sweet is an excellent example of a programmer who is also doing all the documentation for his work. Graham tells that Thunderbird is also joining, as the second non-Canonical organization. My part ends at 10:23 min. Coverage Here are some blogs, articles, videos, and podcasts about the event (taken from the internal list of the organization team): The Source - Canonical on LinkedIn Thank YOU for open source: Canonical's official report of the Summit on LinkedIn, featuring Ngazetungue Muheue’s talk on open source in Africa, the work of the Hack Club, creating free software with high school teenagers, including the talk about the Boreal Express, by Zach Latta, founder of the organization, Akarshan's talk about the free software use in train toilet monitoring (see above), Juanmi Taboada's submersible workshop, and as the higlight at the end, the Framework lightning demo (see above). Soumyadeep Ghosh on GitHub Ubuntu Summit 2024: A joyful experience filled with sorrow: Soumyadeep's second conference in his life (The first was the UbuCon Asia 2024) and his first international trip, was the Ubuntu Summit. He tells about his arrival, the people he met, the Snapcrafters booth, the Snap workshops, the sessions he attended, with many photos of the people ... But he also tells that his grandpa passed away while he was on the Summit. R. I. P. Akarshan Kapoor on LinkedIn That’s what happens when you combine a love for OpenSourcery with the celebration of 20 years of Ubuntu: Akarshan giving a nice short summary of the people he met on the Summit by doing one-line-shoutouts of each of them. And I got shouted out near the top of the long list! The Register An awful lot of FOSS should thank the Academy: About the presentation \"Open Source Software for Motion Pictures\" by the Academy Software Foundation. Why we're still waiting for Canonical's immutable Ubuntu Core Desktop: State of the art of Ubuntu Core Desktop, especially the challenge of having different desktop sessions, as KDE in our case. A sit-down with Ubuntu founder Mark 'SABDFL' Shuttleworth: The vulture has interviewed Mark about major happenings during the 20 years of Canonical. Framework laptops get modular makeover with RISC-V main board: About the lightning demo of getting Deep Computingś RISC-V board into a Framework laptop (see above) and about the RISC-V board itself. Gaming on Linux Ubuntu Summit 2024 highlights - Linux gaming talks on UMU and Heroic Launcher: Short article about the 2 gaming-related talks, Paweł Lidwin about Heroic and Thomas Crider (\"GloriousEggroll\", \"Eggy\") about UMU, with links to the talks in the recording videos. The gaming booth and hacker room got not mentioned though. Late Night Linux Podcast Episode 307: Report from the summit at 18:50 min to 22:00 min. Fedora Podcast Gaming with ProtonGE: Eggy gets interviewed about his work on Linux gaming and he tells about the Summit in the \"Future of Gaming\" section near the end. Canonical Open Documentation Academy Open Documentation Hours episode 35: The episode which we have produced in the Open Documentation Academy hacker room, see above. Podcast Ubuntu Portugal (in Portuguese) E322: Na Ubuntu Summit 2024 (Haia): The episode we have produced live on the Summit, by Diogo Constantino, me and 3 other Portuguese-speaking guests. E323: Balanço de Cimeiras: About both the Festa do Software Livre and the Ubuntu Summit. At 8:30 min - 13:20 min Diogo Constantino tells about the wireless clip-on mics which I brought and which we used for my Snap workshop and some other sessions. As reported in July, Diogo Constantino, leader of the Ubuntu local community (LoCo) Portugal, had interviewed me in the Podcast Ubuntu Portugal, a podcast in Portuguese language about Linux and especially Ubuntu. In the end of the interview Diogo invited me to the Festa do Software Livre/UbuCon Portugal in Aveiro in Portugal, where on both conference days I had dinner with Diogo and the organizers of the event and some others, and after each of the two dinners we recorded an episode of the podcast. Two weeks after that, I met Diogo again, on the Ubuntu Summit in the Hague in the Netherlands. Not really taking it seriously I told him that we could record an episode of the podcast on the Summit, and he told that is a good idea and so we looked for Portuguese-speaking people on the Summit, and put together a group of 5: Diogo, me, Diogo Sousa (Canonical Security Engineering), Cristovão Cordeiro (Canonical Containerization/rockcraft), Carlos Nihelton (Canonical Desktop/WSL) We got a meeting room from the organizers and produced another great episode. So this way I made it into the Podcast Ubuntu Portugal 4 times: E310: I got interviewed by Diogo E320: Festa do Software Livre, day 1 E321: Festa do Software Livre, day 2 E322: Ubuntu Summit If you feel more comfortable to listen to people speaking Portuguese and not English, together with the recordings of my talks on the Festa do Software Livre, there are a lot of opportunities to listen to me now. Also if you feel more comfortable to get the recent vulnerabilities explained in Portuguese, I did so in E321 and E322. Now the GSoC 2024 has finally completed, also those contributors who got the longest possible coding period of 22 weeks had to submit their final reports now. This was the most successful Google Summer of Code for OpenPrinting. 11 contributors is the highest count we reached so far and they all did amazing work! We plan to get each one's project into the respective upstream code. With all our great mentors we have worked in an excellent OpenPrinting team of more than 20 persons.! 10 of the 11 contributors have passed the final evaluation, but the one who has failed, Shivam Sharma (OAuth2 support in print GUI), and his mentor, Deepak Patankar want to finish the project after GSoC. Also all the others want to finish their missing pieces and get their code upstream. And we got excellent feedback from all the 11 contributors. Each of them has praised our work as mentors and at OpenPrinting a lot in their final evaluation, and many also already in their midterm evaluations. Now we have a lot of pull/merge requests, both on OpenPrinting itself and also on external projects. We are now working on getting them all merged. Thanks a lot to all the contributors and mentors for their work, confidence, and patience with us! Here are the results, work products, and links to their code: Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh Work Product PASSED To complete this task, the repositories need to get transferred to OpenPrinting or merged into the appropriate repositories of OpenPrinting and also an OpenPrinting account on the DockerHub needs to get created and the container images uploaded to there. Code: CUPS Rock PostScript Printer Application Rock Ghostscript Printer Application Rock HPLIP Printer Application Rock Gutenprint Printer Application Rock GitHub action update automation for Rocks GitHub action versioning automation for Rocks GitHub action rock-version-schema addition CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha Work Product PASSED To complete this task, Biswadeep’s changes linked above need to be merged into LibreOffice upstream. All pull requests on CPDB are already merged. Code: Pull request on Gerrit Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu Work Product PASSED OSS-Fuzz testing is now active on the CUPS (2.x) and libcups (3.x) repositories. Development will go on: Based on existing fuzzing projects, integrating more harnesses is more convenient, especially with the help of LLMs. More C/C++-based projects are needed to be integrated, such as cups-browsed and cups-snap Integrating OSS-Fuzz into OpenPrinting projects written in other languages such as Python (pyppd) and Go (ipp-usb), is feasible. More effective fuzzing seeds and dictionaries for specific OpenPrinting functionalities are required. End-to-end testing methods can help identify more exploitable bugs in OpenPrinting projects. Manual security audits can also help. Code: Source Code for Fuzz Harnesses OSS-Fuzz Projects cups libcups PAPPL API Bridging for Scanner Applications Contributor: Akarshan Kapoor Work Product PASSED To complete this task, the following steps have to be done: Create a test suite/test driver (PAPPL Issue #134) Retrofit API Completion: It must be assured that all SANE drivers work smoothly in Scanner Applications Rebase to PAPPL v2.0: Developing and testing have been done with PAPPL 1.4.x. In the mean time feature development concentrated on the 2.x branch Kshitij Sharma has stepped up as a volunteer contributor to help on the Scanner-Application-related work. He will help Akarshan to complete his work and also on the further development of Scanner Applications. Code: Scan API PR in PAPPL: Laying down the framework to make scanning work as seamlessly as printing (PAPPL Pull request #371) PAPPL Retrofit Interface PR: Aiming to replace SANE with a more universal PAPPL interface, moving scanning closer to true driverless operation (pappl-retrofit Pull request #23) Last year's eSCL Work in GSoC 2023: A deep dive into building groundwork for driverless scanning, covering our approach to sandboxing scanners (GSoC 2023 final report) Akarshan's GIT repo CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma Work Product PASSED To complete this task, the following steps have to be done: Implementing additional features from the CPDB API, ensuring that the print dialog can dynamically fetch printer properties and settings Conducting thorough tests to verify that the dummy printers are recognized correctly and that their properties are displayed accurately in the print dialog Upstream merge in Mozilla Uddhav Phatak (GSoC contributor for PDFio support in libcupsfilters) is volunteering to help finishing these tasks. Code: Code review request at Mozilla Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal Work Product PASSED To complete this task, the following steps have to be done: Finalising the \"Add Printer\" part Merge Pull request #378: Adding Feature of IPP Service Discoveries Code: Pull request #378: Adding Feature of IPP Service Discoveries Make a native printer Application from Gutenprint Contributor: Ankit Pal Singh Work Product PASSED The project is completed so far, it only needs to be merged upstream, ideally in the Gutenprint project. Further development plans are to add option preset functionality, so the complex options can be set in preset profiles in the web interface of the Printer Application and the presets can then be selected for each print job via IPP. Code: Ankit's GitHub repository GNOME Control Center: Finalizing the New Printing Architecture for GNOME Contributor: Kaushik Vishwakarma Work Product PASSED To complete this task, the following steps have to be done: The code needs to get migrated to the current development branch (47.3) and a merge request posted A feature request for PAPPL needs to be posted to allow triggering auto-addition of printers via IPP request Code: Kaushik's Github repository User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma Work Product FAILED To complete this task, the following steps have to be done (these are very important for the usefulness of the work, therefore the fail): Complete the functionality, for example the access token is not sent to the printer with every request. Document how the code is tested, or ideally add test scripts. Shivam promised to fnish his project after GSoC. Code: Shivam's GitHub repository of cpdb-backend-cups Pull request #37 on cpdb-backend-cups Converting Braille embosser support into a Printer Application Contributor: Arun Patwa Work Product PASSED The project is completed so far, but there are some plans to improve it, especially adding support for more Brialle embossers, adding more filter chain options, and more customization for users. Code: Arun's Github Repository Pull request Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak Work Product PASSED To complete this task, the following steps have to be done: Port cupsfilters/pwgtopdf.cxx Intense testing of the ported functions Code: Uddhav's work on GitHub. libcupsfilters Pull request #71 And here are the write-ups for October: Packaging CUPS and Printer Apps into OCI images Contributor: Rudra Pratap Singh This month, I tested the ps-printer-app rock using an example daemon printer emulator, which forwards print jobs to an output file through a simple C script. With minor modifications to ps-printer-app.c, I was able to add a generic printer, but I am still working on forwarding the print job to our printer emulator. Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu In October, the primary focus of the OpenPrinting fuzzing project is to triage and submit bug reports to development teams for addressing issues identified by existing OSS-Fuzz harnesses. Notable fixes include changes in the CUPS repository, such as the commits 80fe6815d5941ef8a812087af7869f4c02779f1d and 7a2d383ee59a90f41d482476edb909165ea9565d, resulting in over 5,000 lines of code changes. https://github.com/OpenPrinting/cups/commit/80fe6815d5941ef8a812087af7869f4c02779f1d https://github.com/OpenPrinting/cups/commit/7a2d383ee59a90f41d482476edb909165ea9565d Additionally, the OpenPrinting fuzzing team shared our integration experience on developing fuzzing for open-source software at the Ubuntu Summit 2024. Till, Andrei, and Dongge participated onsite, deliverred a successful workshop and shared insight for open source developers in securing their projects. After wrapping up the work in GSoC, we are focusing on incorporating more practical fuzzing harnesses into the OpenPrinting projects. CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma The work on adding Common Print Dialog Backends (CPDB) support to Mozilla Firefox focused on setting up foundational elements and preparing the backend for seamless integration. Key accomplishments include configuring CPDB dependencies within Mozilla's build system and implementing a dummy print backend to simulate basic CPDB operations, allowing for initial testing. This backend interacts with nsPrinterBase and nsPrinterListBase to ensure compatibility with Firefox’s printing framework. Currently, the dummy backend is under code review, while the next phase will replace placeholder values with real CPDB data. I have added a work in progress code review for progress made so far (Code review : https://phabricator.services.mozilla.com/D227780 ) Also published GSoC’24 report (Report :https://github.com/kushagra20251/GSoC24 ). Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal I have added the IPP Service Discovery part and created a pull request. Here is the link to the PR: https://github.com/OpenPrinting/system-config-printer/pull/378. In this PR, I included code for the asynchronous discovery of IPP services and for the UI part as well. I'm currently working on the \"Add Printer\" functionality, using methods suggested by @tillkamppeter and discussed with @Mohit. I have also created the final report for my GSoC project. Here is the link to the final report: https://github.com/TheJayas/GSoC-2024-Final-Report GNOME Control Center: Finalizing the New Printing Architecture for GNOME Contributor: Kaushik Vishwakarma I had an online meeting with Mohit, and we decided to remove the second option—installing printer apps from the internet—since implementing this concept isn’t entirely feasible. I’ll provide all the code next week. Once you successfully test my code, I’ll migrate it to the current GCC, which I believe is 47.3. I’ll also raise an issue in Pappl regarding the auto-add method to expedite this feature. I plan to continue contributing to this project until it’s officially released with the upcoming GCC User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma This month I performed several tests to check the status of the code and apart from this I also fixed some bugs. I also made changes to the existing function on_handle_print_socket(). The change was to merge the OAuth file with the CPDB_print_backend file. I also called a function for smooth transition. The question was where the access token will be stored and for how long the client can use that code? So to fix this I made changes to Auth.c code to save the access token in the access_token.txt file and the file can only be accessed by the client requested for it. By this way the security is also improved. I also created a pull request and the code is ready to review. Converting Braille embosser support into a Printer Application Contributor: Arun Patwa I introduced a spooling_conversions array, enabling the addition of MIME filters to handle conversions between source and destination types. This setup streamlined the process of iterating through filters to change file types as needed, facilitating the integration of multiple filters, including \"texttobrf\" and \"imagetobrf.\" I also removed PPD support in favor of IPP options, focusing solely on default IPP configurations. Additionally, I implemented the mime_cb() function using libmagic to dynamically identify the MIME type of input files. This approach allowed me to successfully print various file types, such as .txt, .pdf, .html, and .jpg, enhancing the flexibility and functionality of the printer application. Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak I have successfully ported all the files in the cupsfilters/pdftopdf/*, cupsfilters/pdf.cxx, cupsfilters/pclmtoraster.cxx from C++ to C, all the tests are passing using the \"make check\" command. Even though I have wrapped up my GSoC journey officially by passing the final submission, the conversion of 1 file (cupsfilters/pwgtopdf.cxx) is remaining, which I will complete soon. Since the last OpenPrinting News we had again several releases: libcupsfilters, libppd, cups-browsed 2.1.0 First of all, we have done upstream releases of the packages which got fixed because of the recently reported remote code execution and DDoS vulnerabilities. We have especially removed support for legacy CUPS browsing and for LDAP from cups-browsed to eliminate the entrance point for the attacks, the acceptance of UDP packages from arbitrary sources on port 631. In addition we validate and sanitize incoming IPP responses and PPD file entries in both libcupsfilters and libppd. After the 2.0.0 release we had also added some new features during all the months up to now. In libcupsfilters and libppd we have added support for building with libcups3, and INSTALL.md files instead of INSTALL. libcupsfilters received a facility for CI/build/unit testing of filter functions using an easily-editable table describing the test cases. This was Pratyush Ranjan's GSoC 2023 project at OpenPrinting. libcups 3.0rc1, 3.0rc2, and 3.0rc3 The development of libcups3 has reached release candidate (RC) state. Then usually all planned features should be included band final testing and bug fixing will happen. So it now will not take long any more until the first stable release of a CUPS-3.x component. The last feature additions are here: Added cupsFormatString and cupsFormatStringv APIs to safely format UTF-8 strings. Added support for per-user instances of cups-locald (Issue #69) Added httpConnectURI API. Added \"end\" argument to cupsParseOptions API. Renamed httpReconnect to httpConnectAgain. Updated cupsDestInfo to accept a cups_dest_flags_t argument. Updated cupsCopyString and cupsConcatString APIs to safely terminate UTF-8 strings. Updated list of attributes included in the destination options. Updated cupsAddIntegerOption and cupsGetIntegerOption to use the long type. Updated httpAddrConnect() to handle POLLHUP together with POLLIN or POLLOUT. Updated the various tool man pages, usage output, and examples. Updated ippCreateRequestedArray for the Get-Documents and Get-Output-Device-Attributes operations. Updated ipptool to validate IPP, PDF, and .strings files using the \"WITH-[ALL-]CONTENT\" predicate (Issue #87) Now use installed PDFio library, if available. Now use NotoSansMono font for ipptransform text conversions. Brought back IPP/2.x and related conformance test files (Issue #85) The ipptransform program now supports uncollated copies. In addition. many bugs got fixed. PAPPL 1.4.7 and 1.4.8 These releases fix several bugs, including a security issue: If a password is set for the web admin interface, it got ingnored when logging in and so anybody could log in."
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0-Call-for-Proposals-extended-to-July-16",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0 - Call for Proposals extended to July 16",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0-Call-for-Proposals-extended-to-July-16",
+ "headings": [],
+ "tags": [],
+ "snippet": "A conference is great because its content is amazing, therefore we need more ...",
+ "content": "We are currently in the middle of the preparations for another awesome Opportunity Open Source, this time co-located with the first UbuCon India. We have already reserved the space in the IIT Kanpur (where we have also been last year), lined up a volunteer team for all the on-location organization work, contacted potential sponsors and potential speakers, announced the event on several platforms, ... But the most important is to deliver amazing content: Talks, workshops, panel sessions, demos tables/booths, and ... Meet-ups and BoFs This year we accept meet-ups and BoF sessions as a new session format and plane to make available an extra room for them. This way you can meet for informal discussions, like for example planning Ubuntu community activity in India, working out a new free software application project, establishing free software use in schools or public administration, ... It is also a chance for leading developers of an open-source project coming from overseas and meeting their Indian developer community. And, as we are always dealing with free and open-source software anybody is highly welcome to join these sessions, learn about the work of free software organiations and getting involved ... But, was there not already the submission deadline today? Yes, but we have extended it by one month, to give you enough time for planning. The Call for Proposals is now open until Wednesday, July 16, 11:59pm IST (18:29 UTC) So we are eager to see your proposals. And last, but not least, we keep you up-to-date on LinkedIn: LinkedIn page of the Opportunity Open Source: @opportunity-open-source Event web site UbuCon India Practical info: Location, remote attending/speaking, ... Call for proposals Mastododon: #OpportunityOpenSource and #UbuCon LinkedIn: @opportunity-open-source And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0-No-UbuCon-India-co-hosted-with-us",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0 - No UbuCon India co-hosted with us",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0-No-UbuCon-India-co-hosted-with-us",
+ "headings": [],
+ "tags": [],
+ "snippet": "We will just run the OOSC, as last year, without UbuCon ... And we need more session proposals ...",
+ "content": "Unfortunately, due to some unavoidable circumstances we are not having a joint event. Therefore, we will have the Opportunity Open Source, as originally planned, on September 5-7 in the IIT Kanpur, but without UbuCon India. We will focus, as in the first two editions, in 2023 and 2024, on introducing students, and also professors and researchers, at universities and colleges in India. Your proposals for talks, workshops, meet-ups, BoFs, booths, demos ... An important part of a conference is that we convey great content, for attendees to learn what one can do with free and open source software and how to contribute to it. As in the previous editions we will have talks and lightning talks, both from in-person and remote speakers, and interactive hands-on workshops, where attendees can try out and experience the subject matter on their own laptops. But we also accept informal meet-ups and BoFs, where a leader in an open source project can meet the local community and, by the session being open for everyone, give insight into the project to people who like to contribute. And to stimulate the hallway track we are looking for booths and demo tables, to show off your open-source work and motivate people to participate. So please post your ideas on our Call for Proposals, until Wednesday, July 16, 11:59pm IST (18:29 UTC) We are eager to see your contributions. Event web site Practical info: Location, remote attending/speaking, ... Call for proposals Mastodon: #OpportunityOpenSource LinkedIn: @opportunity-open-source And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0-No-deadline-for-Call-for-Proposals",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0 - No deadline any more for Call for Proposals",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0-No-deadline-for-Call-for-Proposals",
+ "headings": [],
+ "tags": [],
+ "snippet": "We accept proposals up to the conference dates, but we already start accepting and scheduling",
+ "content": "The Opportunity Open Source comes closer, but after our first extension of the deadline for the Call for Proposals we still have a lot free space in our schedule. Therefore we do not stop our Call for Proposals at all, but leave it just open. We will start accepting session proposals in the next days and do a preliminary schedule at the end of this month/beginning of next month, and we will keep our eyes on new proposals and accept them when they are interesting. So last-minute proposals are welcome. We will have a room for talks, a room for workshops, and a room for BoFs. If one of them runs full, we consider putting some sessions of that type into one of the other rooms. We also consider closing the CfP should we get too many proposals. So do not wait too long with your submission to secure your spot. So we are eager to see your amazing content: Talks, workshops, panel sessions, demos tables/booths, BoFs/meet-ups, ... Here is our Call for Proposals. see you all in Kanpur ... Event web site Practical info: Location, remote attending/speaking, ... Call for proposals Mastodon: #OpportunityOpenSource LinkedIn: @opportunity-open-source And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0-Schedules-and-contributions-published",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0 - Schedules and contributions published",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0-Schedules-and-contributions-published",
+ "headings": [],
+ "tags": [],
+ "snippet": "Have a look into the amazing presentations and workshops, plan your participation!",
+ "content": "Only 10 days left to the Opportunity Open Source 3.0 in the IIT Kanpur in India! Now we got all the session proposals which got promised to us and so we have scheduled the contributions now and published everything. Here are the full schedules and the list of contributions. Click on the entries to read the abstracts and get more details about each session. Note that the schedules are subject to change, as for example remote speakers are perhaps not able to give their presentation at the scheduled time. Also watch out for further info on our site, about the location, about remote attending, and speakers could add slides, preparation instructions and exercise repositories for workshops, ... See you all in Kanpur ... Event web site Practical info: Location, remote attending/speaking, ... Call for proposals Mastodon: #OpportunityOpenSource LinkedIn: @opportunity-open-source And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0-We-are-looking-for-sponsors",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0 - We are looking for sponsors",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0-We-are-looking-for-sponsors",
+ "headings": [],
+ "tags": [],
+ "snippet": "No conference without solid support - Wide range of sponsorship packages available",
+ "content": "The Opportunity Open Source is not only an awesome conference because of its speakers, or its audience, but also because of its sponsors. Without them, the event would not be possible, or at least not such a success ... Last year's sponsors did not only cover the costs of the beautiful posters announcing the event with all its speakers, the schedules, and all information handy for the attendees, and the accommodation of speakers in the guest house, but also an unforgettable conference dinner/closing party. They also have supported the hackathon, not only covering costs but also providing problem statements. And this year we are looking for sponsors again, and to make sponsoring easier, we offer a variety of sponsorship packages. Depending on the amount you provide to us, you get valuable perks: Visibility of your logo, getting mentioned in announcements, but also exhibition booths, stage time for talks an workshops, the opportunity to provide a problem statement for the hackathon, ... The packages are: Title Sponsor Amount: ₹5,00,000+ (USD 6000) Perks: Booth size L Keynote 30 min Workshop 90 min OR Talk 30 min OR BoF 40-50 min Problem Statement for Hackathon Logo exposure at many places, especially also on t-shirt/swag and in size XL on web site Recognition on social media, blog, and during opening and closing plenaries Co-Title Sponsor Amount: ₹4,00,000+ (USD 4800) Perks: Booth size M Workshop 90 min OR Talk 30 min Logo exposure at many places, especially also on t-shirt/swag and in size L on web site Recognition on social media, blog, and during opening and closing plenaries Platinum Sponsor Amount: ₹3,00,000+ (USD 3600) Perks: Booth size S Talk 30 min Logo exposure at many places, especially also in size M on web site Recognition on social media and during opening and closing plenaries Gold Sponsor Amount: ₹2,00,000+ (USD 2400) Perks: Booth size S for ₹30,000 (USD 500) extra Lightning Talk 5 min Logo exposure at many places, especially also in size S on web site Recognition on social media and during opening and closing plenaries Bronze Sponsor Amount: ₹1,00,000+ (USD 1200) Perks: Logo exposure at many places, especially also in size S on web site Recognition on social media and during opening and closing plenaries If interested, please fill the form on our sponsorship page to contact our marketing team. For details about the packages and more information about our events and sponsoring, see our Sponsorship Prospectus. See you all in Kanpur ... Event web site Practical info: Location, remote attending/speaking, ... Call for proposals Call for sponsors Sponsorship Prospectus Mastodon: #OpportunityOpenSource LinkedIn: @opportunity-open-source And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0-in-the-IIT-Kanpur,-India",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0 in the IIT Kanpur, India",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0-in-the-IIT-Kanpur,-India",
+ "headings": [
+ "From Nepal to India ...",
+ "The Sessions",
+ "The Resonance",
+ "Opportunity Open Source 2026 - Call for Locations",
+ "Thank you"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/NAamSJlVTEc/hqdefault.jpg",
+ "snippet": "For our third edition we returned to Kanpur",
+ "content": "As reported in my previous blog I had also attended the UbuCon Asia in Kathmandu, in Nepal, on August 30-31. We have set the date for the Opportunity Open Source on the following weekend, September 5-7, to give the possibility to attend both doing one single round trip, which had especially made sense if we had co-hosted UbuCon India. So at least I have made said round trip and traveled from Kathmandu in Nepal directly to Lucknow in India, on September 2, the day after the day trip of the UbuCon in Nepal. Then I have stayed in Lucknow for tourism for 2 nights and the traveled with Aveek Basu with a hired driver to Kanpur. There we met the local organizers Sanskar Yaduka (does also GSoC for OpenPrinting) and Shreya Shree, and also Akarshan Kapoor. We originally wanted to do the final testing of A/V for the live streaming and remote speaking, but we ended up fixing the schedules. Originally, we had the 3 conference days, September 5-7 for the talks and workshops, as nobody provided a Hackathon to us. So I accepted all the proposals on the CfP and scheduled all the sessions into plenary room, breakout room and workshop room over the 3 days, taking into account speaker's requirements when they are not there all the days, time zones of remote speakers, talk before workshop, no 2 talks of one speaker to the same time, ... Then, just when I arrived in Kanpur, they told me that they got a Hackathon and to have the 7th for doing it, we had to re-schedule all the sessions to squeeze them into the first 2 days. Fortunately, I did not need to re-schedule from scratch, as Sanskar did a first draft of a new schedule, but I had to correct several things to re-assure the speaker's wishes and I had to transfer everything into the Indico site of the event, ending up to have only 2 hours of sleep the night before the event. Also, we had originally planned to start the conference only at noon on Friday, to give participants more time to arrive at the venue and also us more time to prepare the conference rooms. The re-scheduling required us to start already 11:00 in the morning and so having even less preparation time in the rooms. But on the other side, Akarshan Kapoor stepped in to help with adjusting last-minute schedules and announcing sessions on the Telegram channel for the attendees, especially also if we had delays. Thanks a lot, Akarshan, for doing so! Also some others, not only the organizers, started announcing the talks on the Telegram channel. Schedules Despite getting most of the proposals only lately, 3 weeks or less before the event, we got an amazing selection of sessions. Aveek and me, we naturally brought our own sessions about OpenPrinting, Snap, Google Summer of Code, and first contributions, but we had subject matters of a wide range of areas, a lot about the area everybody talks about, Artificial Intelligence and Machine Learning, ... and naturally also coding and development, security, Zephyr, ... Also non-coding-related subject matters of community building, switching to open source, funding, ... Some highlights: As this conference is primarily to introduce students into FOSS and how to contribute to it, we had several presentations about the basics of open source and how to join the contributor community: Aveek Basu has given an overview in how to do so right after the opening of the event, with \"Starting the Open Source Journey\". \"My LFX Mentorship Journey: From Application to KubeEdge Contributor\" (Slides) and \"From Zero to LFX: How Three Friends Cracked Open Source and Landed KubeEdge Mentorships\" (Slides) by Abhishek Kumar are both about his experience with the Linux Foundation's mentoring program LFX and KubeEdge as mentoring organization. Kernel developer and Linux Foundation fellow Shuah Khan showed in her talk \"Six years of empowering open source communities\" which learning opportunities the Linux Foundation provides to open source newcomers. Aveek Basu and me as experienced GSoC org admins and mentors hosted again a Google Summer of Code panel, with GSoC contributors Akarshan Kapoor, Mohammed Imaduddin, and Sanskar Yaduka as guests and answered the questions of the audience. In \"The Dark Side of Free and Open-Source Software (FOSS)\" Ayush Ghai talked about the problems occurring in FOSS development communities, like hobby developers ending up with responsibility on essential system components, burnout, commercial companies publishing under \"Open Core\" models keeping their stand out parts proprietary, ... (Blog) Aveek and me have naturally have made OpenPrinting one of the central parts of the conference: To start, I introduced into OpenPrinting by telling about how it all started, what we are doing currently, the New Architecture with CUPS 3.x doing away with PPDs and classic drivers and Microsoft's Windows Protected Print with which they do away with classic drivers, PAPPL not only for Printer Applications but also as base for the CUPS 3.x daemons, OSS-Fuzz, rust and Python bindings, ... and how to contribute. All this in my talk \"OpenPrinting - We make printing just work! - 25 years of printing for FOSS\" (Slides, Blog). Akarshan Kapoor has presented his OpenPrinting work of the last 2 GSoCs, \"Scaniverse Universal Scanner Drivers: One Solution for Every Distro\" (Report 2023, Report 2024), showing how the driverless scanning protocol eSCL can be used to create Scanner Applications, sandboxable scanner drivers. Alexander Pevzner (creator of ipp-usb and sane-airscan) is enthusiastically working on his \"Behaviorally Accurate Simulator for Multifunction Printers and Scanners\" (slides, GitHub) and told in his talk about it. This improves the possibilities of automated testing at OpenPrinting a lot, especially for device discovery, and whether the print output is correct. It is also very useful for development and debugging. To not let automated testing (CI, unit testing, fuzz testing) stop at crashes and errors but also allow testing of actual print output, Sanskar Yaduka is working on a GSoC project about visual analysis of print output. And this was subject of his talk \"From Open Source to OpenPrinting: My GSoC Journey and Project on Image Output Evaluation\" (GitHub) The successful efforts on fuzz testing and OSS-Fuzz integration of the GSoC 2024 continued in this year's GSoC, by contributor Mohammed Imaduddin. And he gave the talk \"Fuzzing Go and Python Projects in OSS-Fuzz: The OpenPrinting Case Study\" (Slides, GSoC Report 2025) about his work. Artificial Intelligence (AI) and Machine Learning (ML) are talked about a lot and this is also reflected by the many CfP submissions we got for this subject matter, and so we had a good amount of great sessions: In \"Can human intelligence show the way for artificial intelligence?\" Francis Steen (UCLA, Red Hen Lab) and Prof. Mark Turner (CWRU) suggest that based on the higher efficiency of human intelligence a new generation of AI should be developed and that not by the tech giants but by independent open source projects. Neeraj Poddar's and Saiyam Pathak's talk \"Future of Open Source AI: From Cloud to the Edge\" shows how AI can be deployed with open source, both in the cloud and in edge computing (processing takes place near the data source, locally deployed AI). In the talk \"Building Adaptive, AI-Native Experiences with On-Device Intelligence\" Neeraj Poddar shows how with the open-source platform DeliteAI AI can be deployed on local devices instead of cloud services being used to improve performance and privacy. And other awesome success stories of FOSS to motivate the students: Oliver Völckers presented \"How we built a pump monitoring system for Deutsche Bahn with wireless sensors using Zephyr RTOS\" (Slides), the subject of Akarshan Kapoor's internship which brought him into the world of Zephyr. Sumanto Kar and his colleagues have shown in the talk \"From Containers to Chip Design Classrooms: Leveraging Snap and Docker to Enable Open-Source EDA with eSim\" (Slides) how sandboxed packaging methods, Snap and Docker, allow for distributing the complex electronics design application eSim, consisting of many components to be easily installed in different Linux distribution environments without running into dependency hell. And in the second talk \"An Offline AI Assistant for eSim: Easier, Accessible, Open-Source Circuit Design and Debugging\" (Slides) they showed how eSim uses locally implemented AI. Mikhail Novosyolov told in is talk \"Migration of whole country to GNU/Linux\" about Russia's move to FOSS and digital sovereignty where ROSA Linux is playing the central role. And to get interactivity and action into the event one cannot run it without Workshops. We had one room dedicated for workshops and they all got well accepted. Here is especially to mention: Akarshan Kapoor with \"Zephyr RTOS: Building the IoT Future from the Ground Up\" (Slides, Exercises: Getting Started Guide) explained what an RTOS (Real-Time Operating System) is compared to a standard system and how to use the development tools. In the end he gave away some sample boards to attendees who asked questions. Sagar Sundaray and Swaraj Pande, both from Red Hat, showed how to deploy AI on automotive-grade systems, in \"Accelerating AI Deployment in Automotive: A Unified Approach\". They brought also a lot of demo hardware. For the app developers who have attended Mohammed Imaduddin talk about his OSS-Fuzz work for OpenPrinting to do the same on their app, Mohammed has given the workshop \"Intro to OSS-Fuzz: Build, Break, and Harden Open Source Software \" (Slides). In the session \"MicroCeph: Build your S3 app without AWS!\" Utkarsh Bhatt from Canonical's Ceph Engineering Team let his attendees self-host their S3 (Simple Storage Service) with MicroCeph. YouTube links: Note that, unfortunately, some sessions are missing and on some there is no audio. YouTube channel with the recordings Fri, Sep 5 Morning Plenary Breakout Afternoon Plenary Breakout Workshops Sat, Sep 6 Morning Plenary Breakout Workshops Afternoon Plenary Breakout Workshops After the event it was talked a lot about it and organizers and speakers got a lot of kudos, especially on LinkedIn. Most mentioned and cited persons in the reactions were me, Aveek Basu, Akarshan Kapoor, Ayush Ghai, Mikhail Novosyolov, Neeraj Poddar, Mohammed Imaduddin, Utkarsh Bhatt LinkedIn There are many more posts related to the OOSC 3.0 on LinkedIn. I am just listing the most interesting ones. Aveek Basu: \"What started in 2023 as a small student meetup at IIT Mandi has now grown into a vibrant community — with the 2024 and 2025 editions hosted at IIT Kanpur.\" (10 photos, 87 reactions, 2 comments, 2 reposts) Akarshan Kapoor: \"If you weren’t living in a cave, you have probably already seen my name pop up on your feed lately\" (8 photos, 193 reactions, 12 comments, 4 reposts) Akarshan Kapoor: \"GitHub doesn’t build communities. People do.\", \"Code changes fast. Communities last.\" (9 photos, 176 reactions, 17 comments, 10 reposts) Shrishti Gaikwad has praised me and my sessions a lot! (1 photo, 99 reactions) Shrishti Gaikwad has also praised Akarshan and his 2 sessions as well (4 photos, 85 reactions, 2 comments) Shrishti Gaikwad was selected as the media and publicity partner of the OOSC by the local organizers, probably therefore she wrote in more detail about some important speakers and sessions, also about Ayush Ghai, Utkarsh Bhatt, and Sagar Sundaray/Swaraj Pande. Yash Mishra presented his research on Deep Learning (1 photo, 22 reactions) Ayush Ghai about the LinkedIn reactions on his sessions (4 photos, 72 reactions, 3 comments, 2 reposts) Prajwal Kumar K (6 photos, 142 reactions, 12 comments) Varun Khandelwal: \"From the moment I entered the IITK campus, it felt surreal\" (4 photos, 51 reactions, 2 comments) Diksha Parulekar: \"Some highlights that stayed with me: Till Kamppeter (Leader OpenPrinting, Linux Foundation Fellow) Showed how even small experiments, done consistently, can grow into impactful contributions and meaningful open-source careers. His journey proved persistence matters more than perfection when starting out. ...\" (10 photos, 87 reactions, 2 comments, 2 reposts) Gauri Singh: \"WHAT.AN.EXPERIENCE!!\", \"Till Kamppeter – The Linux Printing Wizard and Project Lead at OpenPrinting. His insights? Next level.\" (4 photos, 74 reactions, 6 comments, 1 repost) Mohammed Imaduddin about his sessions about his GSoC work with OSS-Fuzz (5 photos, 201 reactions, 3 comments) Sumanto Kar about his talks about eSim (4 photos, 196 reactions, 12 comments, 6 reposts) Aakarsh Gupta from the Jaipur Engineering College and Research Centre (JECRC, where UbuCon Asia 2024 took place, good candidate for OOSC 4.0) (7 photos, 63 reactions, 5 comments, 2 reposts) Owais Tabrez: \"Open source isn’t just about code — it’s about community, collaboration, and shaping the future of technology.\" (5 photos, 36 reactions, 1 comment) Lucky Tiwari about meeting me and many others on the conference dinner (5 photos, 29 reactions) Ansh Goel Tells about his hackathon experience, nearly quit early, but ... (7 photos, 42 reactions) Vedika Chaudhary and Abhishek Sharma, posting on LinkedIn is not a college exam, so please do not copy from each other. But Abhishek, you won with 107 reactions and 4 comments against Vedika's 31 reactions ... Some other sites Best Sensor Zephyr Project Photos Coverage-OOSC (Google album) After 3 successful Opportunity Open Source conferences we want to continue, and so we want to do an Opportunity Open Source 4.0 in 2026, most probably around the same date as this year but we are open for different dates. As we want to reach young people and students to present to them what FOSS is and how they can participate and contribute, we want to run it in a city in India where there are several universities and colleges with undergraduate programs in engineering and especially computer science. The actual venue in that city is ideally a university or college with strong engagement in FOSS. Also important is that we, Aveek and me, cannot organize the whole conference remotely. We need an enthusiastic team of local organizers at venue. Their task is to negotiate with the administration to get all the needed local resources, as conference rooms (lecture halls, class rooms), and accommodation in gust houses and dorms, to get the needed permissions from the local government, find local sponsors, ... Right before and during the event the local organizers need to make sure that everything is going smoothly. A/V in the rooms needs to get tested, volunteers have to be lined up to make up the crew for each room and also to prepare things like decoration, booth space, front desk, ..., accommodation needs to get reserved, ... So if you are interested, please discuss it in your university or college, and contact Aveek and me to show your interest and get your questions answered. More detailed instructions for applying will come soon. Thanks a lot to the local organizers Sanskar Yaduka, Shreya Shree, and all the volunteers who joined. Especially also thanks to Akarshan Kapoor for helping with the last-minute schedule adjustment and announcements of sessions on Telegram. Also thanks a lot to the speakers: Aveek Basu, Akarshan Kapoor, Alexander Pevzner, Sanskar Yaduka, Mohammed Imaduddin, Francis Steen, Prof. Mark Turner, Neeraj Poddar, Saiyam Pathak, Oliver Völckers, Sumanto Kar, Mikhail Novosyolov, Sagar Sundaray, Swaraj Pande, Utkarsh Bhatt, Ayush Ghai, Abhishek Kumar, Shuah Khan, Bhavanishankar Ravindra (Bhavi), Divy Srivastava, Akash Sankaranarayanan, Nikitha Dhanabal, Jiongchi Yu, Priyam Chakraborty, Prof. Suman Chakraborty, Manuel Haro, Yash Mishra, Jayanth Tatineni, Aishwarya Sinha, Varad Patil, Shanthi Priya, Prof. Kannan M. Moudgalya, Manvith Kumar, Prajwal Kumar Karnad, Shaun Sebastian, Saquib Akhtar, Adlair Cerecedo-Mendez, Aditya Bhattacharya, Rudra Mani Upadhyay, Myo Thinzar Kyaw, Arjun Kumar Manav, Paritoshik Paul, Hardik Jinda, Abelardo Valdez Poot, Anmol Sharma, Siddharth Bhat, Lakshay Bandlish, Vidushi Sharma, Diptangshu Dey, Aaryan Khandelwal, Pavan Kumar Kondeti, Viswanath Kraleti And also thanks to the sponsors and to the IIT Kanpur! And especially thanks to Canonical for funding my trip, and also to Mauro Gaspari and Gemma Mulcahy for making this going smoothly and helping quickly where needed. And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-3.0",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 3.0",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-3.0",
+ "headings": [
+ "IIT Kanpur",
+ "Ubuntu meets Opportunity Open Source",
+ "Call for Proposals is open",
+ "Let us celebrate a great event!"
+ ],
+ "tags": [],
+ "teaserImage": "/assets/images/oosc-2.0-2024-1.png",
+ "snippet": "Opportunity Open Source 3.0, again in IIT Kanpur in India, on Sep 5-7, co-located with the first UbuCon India",
+ "content": "Some pictures of the OOSC 2.0More pictures of the OOSC 2.0 After two great Opportunity Open Source conferences we go into the third round! With the success we had last year in the IIT Kanpur, especially also because of the great on-location organization team of the IIT Kanpur (thanks again), and them having offered to us to organize the conference again, we have decided to do it in Kanpur a second time. Sanskar Yaduka and Shreya Shree, students at the IIT Kanpur are leading the on-location organization, setting up a team of volunteers and looking for local sponsors. As in the other years we want to motivate students (and also professors and researchers) to learn about free and open-source software and to join the community of developers and contributors. Not only coding and debugging can be contributed, but also designers, technical authors, evangelists, ... are highly welcome. Last year, we had the Opportunity Open Source one week before the UbuCon Asia 2024 which had taken place in Jaipur, also in India. Having people of the Indian Ubuntu community organizing the event and also others attending it, they decided to reactivate the Ubuntu Local Community (LoCo) India. Bhavanishankar Ravindra (\"Bhavi\") and Soumyadeep Ghosh are currently leading these efforts. They also want to have an UbuCon India conference and I suggested to co-locate it with the upcoming Opportunity Open Source, as many UbuCons are co-located (UbuCon North America on SCaLE, UbuCon Portugal on Festa do Software Livre, UbuCon Europe on OpenSouthCode, ...), they accepted my suggestion, and we started planning ... Canonical also offered to sponsor a conference in India, Opportunity Open Source or UbuCon India, and now with the co-location both. Setting the date for our event right one week after the UbuCon Asia 2025 in Kathmandu, Nepal we can have some speakers doing the Nepal/India round trip and this way enrich our event with more international speakers. But to make the event really great, we need your contributions: Talks, panels, workshops, demo tables, lightning talks ... Show us how you are contributing to free and open-source software, how you make our lifes better with it, You do not need to be a coder. also sessions about documentation, design, community, success stories, ... are highly welcome. Our Call for Proposals is open! Until June 16, 2025! So please post your proposals. We (and also our attendees) are eager to have your contribution on our conference. Please pay special attention to the new \"UbuCon India\" track. Your Ubuntu-related submissions to here will make up the first UbuCon India. We will again have many sessions about OpenPrinting, Zephyr, Google Summer of Code, Snap, ... Many workshops and this time also several Ubuntu-related ones. We also want to have some demo tables, where things can be tried out hands-on and conversations will fuel an exciting hallway track. And if it works out, we will also offer a Hackathon again. Also, this time, we are not coinciding with any exam periods at The IIT Kanpur and so expect significanly more attendeeds as last year. And the first UbuCon India will also attract people from other places all over the country. We hope to see you all in India ... ... but you are also welcome to attend and/or speak remotely Event web site UbuCon India Practical info: Location, remote attending/speaking, ... Call for proposals Mastododon: #OpportunityOpenSource and #UbuCon And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-4.0-Call-for-Locations",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 4.0 - Call for Locations",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-4.0-Call-for-Locations",
+ "headings": [
+ "Requirements",
+ "City",
+ "Venue",
+ "Date",
+ "Local organization team",
+ "A/V Requirements",
+ "Accommodation for speakers and non-local attendees",
+ "Meals",
+ "Conference dinner/closing party",
+ "Hackathon (optional)",
+ "Sponsoring",
+ "Participation fees",
+ "How to place your bid?",
+ "Till Kamppeter",
+ "Aveek Basu",
+ "Opportunity Open Source on LinkedIn"
+ ],
+ "tags": [],
+ "snippet": "Where will the 4th edition take place? Please send us your proposal!",
+ "content": "The Opportunity Open Source conferences which take place every year in a university/college/IIT/… in India are for showcasing free and open source software (FOSS) and for motivating students, professors, and researchers to participate in its development, by contributing code, design, documentation, … With talks and hands-on workshops a wide range of FOSS topics is covered, and often also a hackathon (coding competition) day is added. In the last year we got around 300 attendees, and many of them showed interest and started to get involved. And so after 3 successful editions of the Opportunity Open Source conferences in India (1.0 in Mandi, 2.0 in Kanpur, 3.0 in Kanpur) we want to celebrate the fourth one. For that we need a place to do so. It should be somewhere in India and to give people all over India this opportunity of experiencing open source, we want to run each edition at a different place and therefore we are looking for a new location for this year's edition. If you are interested, we want to hear from you. First just tell us that you are interested and then we will ask you, and also guide you, for your detailed bid. We will close the call for locations on March 15, 2026, 23:59 IST The content for the conference days, talks, workshops, and booths will be supplied by the global organizers of the Opportunity Open Source. Once we have selected the location we will publish a Call for Proposals (CfP) so that people who want to contribute content can propose their talk, workshop, or booth. We will select an appropriate amount of the most interesting proposals to fill the given rooms during the given amount of conference days then. The city (must be in India) where the event will take place should be easily reachable from all over India, by plane or by train, so that speakers and non-local attendees can participate without problems. We also prefer cities where not just your university/college/IIT is located but also others (also in nearby cities), as people from there will also attend the Opportunity Open Source. We like to run the conference at universities, colleges, IIT, … places where one can study computer science as here we expect a large audience. Naturally students, professors, and researchers from other areas and people from other institutes nearby can also attend. For the conference days we will need three rooms for the sessions: A plenary room and a breakout room for the talks, plus a room for the workshops. The 2 rooms for the talks can be lecture halls, the workshop room is ideally a classroom with tables and where one could provide power outlets or power strips for the attendee's laptops. We expect typically around 300 attendees, so the plenary room should fit this amount of people. There should also be some area for the \"hallway track\" where people hang out and chat. There should also be located any exhibition booths, from sponsors and/or from open-source projects. Also tea, coffee, and snacks for the tea breaks could be provided here. Ideally the 3 rooms are directly connected to this area, but they should at least be nearby. For a hackathon day we need one big hall (like a gym hall) where tables for each participating team can be placed. The tables need to get supplied with power strips for the participant's laptops. The conference should take place on a weekend between mid-August and end-September, or in November. Before mid-August it is too close to the summer holidays and so the local team has not enough time on campus for preparing the event. October is the festive season in India. Also exam weeks need to be avoided. Not only that the students are preparing themselves for their exams and not attending but also rooms reserved for the conference can get suddenly taken for exams, even on Sundays. Also exam weeks of nearby institutes should be taken into account. Also to be avoided are the dates of other important conferences, especially the UbuCon Asia which takes place on August 8-9 in Taipei, Taiwan and the India FOSS by FOSS United (date and location TBD). The most important part of a successful conference is the on-location organization team, a group of volunteers, in our case usually students, but could also be some local open source organization, who do everything needed at the conference location. This is especially talking with the institute's administration to reserve conference rooms, guest rooms in the on-campus guest house and in student hostels for speakers and non-local attendees, arranging lunch on the conference and hackathon days, organizing the conference dinner/closing party, finding (local) sponsors to cover the costs, assuring the needed technical setup of the rooms: Internet (wired for streaming, wireless for attendees), A/V, booth space, power strips, …, lining up a team of volunteers, including crews for the rooms, local marketing of the event in social media … A lot of things which have to be done on-site … Here is an example of the organization team of last year. In each of the 3 conference rooms we do not only want to make the slides of the talks being visible for everybody and the speakers being heard by everybody, but we want to, as it is done on practically all conferences nowadays, stream the sessions live, record them, and also allow remote speaking. For this, each of the 3 rooms will need: A projector (to project image from laptop, usually built into the room) Speakers (to output audio from laptop, usually built into the room) Microphones (wireless clip-on, headset, hand microphones, which can send audio to a laptop, usually provided by the room) 1 or 2 cameras (which can send video to a laptop) A powerful laptop which can do video streaming Wired internet connection (or phone or travel router which provides unlimited 5G cell data) A second laptop for the projection A third laptop for checking for questions of remote attendees via chat Note that the A/V setup should be centered by the A/V laptop to assure that the audio in the room and for the remote attendees and remote speakers is the same, without in-person speakers having to use 2 microphones. We will provide a (remote) server with Nextcloud and VDO.Ninja (planned for now, subject to change). Each room needs the following crew of volunteers (changing in half-day shifts): MC: They introduce into the talk, show \"15 min left\", …, manage Q&A A/V director: They take care of streaming, remote speaking, and recording, via the A/V laptop Mic runner: They bring the hand mic to people to ask questions, can also show \"15 min left\", … during the talk. Camera operator: Takes care that speaker is in the frame Remote chat manager: Checks whether remote attendees have questions The accommodation should be ideally on-campus so that there is no long commute needed, and especially not one which is partially outside and partially inside the campus to avoid that taxis or auto-rickshaws from outside have to go through the security of the campus. It gets much easier if one can walk to the conference rooms or use a campus-internal auto-rickshaw. For speakers and non-local organizers there should be single rooms in a guest house (where usually international guest professors and researchers stay). The guest house should have 24-hour service to quickly respond if there are any problems with the room. Non-local attendees can get accommodated in student's hostels. There needs to be breakfast available for those who are in the accommodations and lunch for all participants on the conference and hackathon days. After the second conference day we want to do a closing event, at least a conference dinner of all the organizers and speakers, but ideally a closing party for all participants. For this we need a suitable restaurant in case of a dinner or a suitable location/venue and catering for a party. In addition to the actual conference consisting of talks and workshops we also want to do (but it is not required) a hackathon, a programming competition. We as global organizers of the Opportunity Open Source will not organize the hackathon. The content/subject matter has to be organized locally. In the last 2 years sponsors were providing this. All the above usually cannot get supplied free of charge. So the costs of each item need to be estimated and an estimate of the total cost of the conference be made. To cover the costs sponsors are needed, principally local ones as the event is principally intended for local attendees. National or international sponsors are welcome. To make it easier for sponsors to contribute, sponsorship tiers (platinum, gold, silver, …) should be offered. Each tier requires to pay a given amount and the sponsor gets perks as compensation, like more or less prominently placed logos, on the web site, on posters at the venue, … mentions in the opening and closing plenaries, a booth of a certain size, … Dedicated sponsoring, like for the closing party, the hackathon, … should be also accepted. In the previous years we have taken fees from the participants for meals and for accommodation, the latter only if needed. Also the accommodation for attendees was a student hostel, so it was not very expensive. As most participants are students, we should try to cover as much as possible of the costs of the event by sponsors and keep the participation fees as low as possible. If you like to have the Opportunity Open Source 4.0 take place at your institute and you are able to provide the above-mentioned items, you should contact us with a first e-mail/message before end of February, but the earlier, the better, as we need your complete bid until March 15, 23:59 IST. Your complete bid should go through the above items and tell what you have available at your place and who will be the local organizer team, which organization, community and who will be responsible for which part. Please provide photos of the city and venue, floor plans, and other supporting images. If your organization/community already has experience with organizing events, especially conferences, perhaps even in the area of open source, please tell. Please also list estimates for all the costs and the total budget for the event. If you already have sponsors please tell who they are and how much they want to contribute. Your first message and your complete bid please send to the global organizers of the Opportunity Open Source, Till Kamppeter and Aveek Basu. e-Mail: till at linux dot com LinkedIn: https://www.linkedin.com/in/kamppetertill/ Telegram: https://t.me/tillkamppeter Matrix: @till-kamppeter:ubuntu.com e-Mail: basu dot aveek at gmail dot com LinkedIn: https://www.linkedin.com/in/basuaveek/ @OpportunityOpenSource And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions"
+ },
+ {
+ "id": "post:OpenPrinting-News-Opportunity-Open-Source-4.0",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Opportunity Open Source 4.0 in the IIIT Allahabad",
+ "url": "/OpenPrinting-News-Opportunity-Open-Source-4.0",
+ "headings": [
+ "IIIT Allahabad",
+ "Selecting the date",
+ "Call for Proposals is open",
+ "Let us celebrate a great event!"
+ ],
+ "tags": [],
+ "teaserImage": "/assets/images/oosc-2.0-2024-1.png",
+ "snippet": "Opportunity Open Source 4.0, in the IIIT Allahabad in Prayagraj, Uttar Pradesh, India, on Aug 28-30",
+ "content": "Some pictures of the OOSC 2.0More pictures of the OOSC 2.0 After three great Opportunity Open Source conferences we will celebrate the forth one! Photos and description of the location contributed by Sudhanshu Sah Our Call for Locations showed a lot of interest. Several groups from different places in India have answered (mainly on LinkedIn). Some only told in a short answer that they are interested but did not follow up, and 4 groups gave more detailed information and had a video meeting with us. In the end, the most convincing bid came from the Google Developer Group (GDG) IIIT Allahabad and we settled with them. IIIT Allahabad stands among India’s premier technology institutes, located in the historic and intellectually vibrant city of Prayagraj, in the state Uttar Pradesh in India. Renowned for its rich cultural legacy, academic excellence, and deep-rooted scholarly atmosphere, Prayagraj has long been a meeting point of ideas, innovation, and learning. IIIT Allahabad: Main GateIIIT Allahabad: Clock Tower IIT Allahabad: Main Gate and Clock Tower The region hosts some of the country’s most respected educational institutions, including MNNIT Allahabad, the historic University of Allahabad, SHUATS, and several other prominent institutes and research centres. Together, they create a dynamic academic ecosystem that attracts students, researchers, developers, innovators, and technology enthusiasts from across India. With this we also count with many more attendees than just those from IIIT Allahabad. The conference will be held across selected campus venues at IIIT Allahabad, including Computer Centre-3 (CC-3 / C. V. Raman Bhavan), the Auditorium (Plenary), and the Admin Auditorium (Breakout). These spaces will host talks, workshops, discussions, and other conference activities. The campus also provides suitable facilities for attendees, including dining options and other essential support for a smooth event experience. Main AuditoriumAdmin Auditorium IIT Allahabad: Main Auditorium and Admin Auditorium Details regarding sponsors are currently being finalized and will be shared in due course. Rishu Kumar, Sudhanshu Sah, and Aditya Ajay will be the overall coordinators, and together with faculty coordinator Prof. Bibhas Ghoshal they will create a team of volunteers, mostly students who will do the on-location organization. They will look for local sponsors, reserve conference rooms and spaces for hallway track and exhibition, accommodation for speakers and non-local attendees, organize meals, prepare and test audio/video setup in the rooms, ... The date we have set to be some weeks after the summer break at the IIIT, so that the students volunteering in the organization team are back for some weeks already to have time to prepare the event. On the other side we also had to care not to fall into an exam week, so that students have time to attend. Another criteria for the selection of the event date are other national and international conferences happening at this time, especially the aKademy 2026 in Graz, Austria, on September 19-24, and the IndiaFOSS in Bengaluru, on September 26-27. And in October we have the festive season in India. So we ended up choosing August 28-30 (Fri-Sun), the last weekend of August. As in the other years we want to motivate students (and also professors and researchers) to learn about free and open-source software and to join the community of developers and contributors. Not only coding and debugging can be contributed, but also designers, technical authors, evangelists, … are highly welcome. And to make this event really great, we need your contributions: Talks, panels, workshops, demo tables, lightning talks ... Show us how you are contributing to free and open-source software, how you make our lives better with it, You do not need to be a coder. also sessions about documentation, design, community, success stories, ... are highly welcome. Our Call for Proposals is open! Until July 3, 2026! So please post your proposals. We (and also our attendees) are eager to have your contribution on our conference. We will again have many sessions about OpenPrinting, Zephyr, Google Summer of Code, AI/LLMs/ML, ... And especially we will again have many interactive workshops where you can learn new skills hands-on. So bring your laptop and experience it by yourself. We also want to have some demo tables, where things can be tried out and conversations will fuel an exciting hallway track. And if it works out, we will also offer a Hackathon again. We hope to see you all in India ... ... but you are also welcome to attend and/or speak remotely LinkedIn Site Practical info: Location, remote attending/speaking, ... Call for proposals Mastodon: #OpportunityOpenSource And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-September-2019",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - September 2019",
+ "url": "/OpenPrinting-News-September-2019",
+ "headings": [
+ "Google Summer of Code 2019",
+ "1. Generic Framework to turn legacy drivers consisting of CUPS filters and PPDs into Printer Applications",
+ "2. Improve the pdftoraster filter to not use undocumented/unstable APIs of Poppler",
+ "3. IPP: ipptool test suite updates for IPP errata updates",
+ "4. ipptool test suite for IPP System Service",
+ "5. Turn the scp-dbus-service of system-config-printer into C",
+ "Avahi",
+ "OpenPrinting web site",
+ "CUPS",
+ "cups-filters",
+ "ippusbxd",
+ "Common Print Dialog Backends"
+ ],
+ "tags": [],
+ "snippet": "End of Google Summer of Code 2019, Avahi, OpenPrinting web site work, CUPS 2.3.0 released, cups-filters 1.25.4, cpdb-backend-cups workaround for CUPS bug",
+ "content": "Coding ended and the final evaluations are completed, the completed projects officially announced by Google. For the Linux Foundation we got 12 student slots in the beginning and after 1 stucent dropping out before coding started we had 11 students working. 2 failed in the second and 2 in the final evaluations, leaving 7 having completed their GSoC projects. This is the worst year in terms of failing students for us. For OpenPrinting there started 5 students and and 1 failed in the final evaluation. The other 4 completed the program successfully. Here are the projects with their submitted work product links: Student: Dheeraj Yadav Mentor: Till Kamppeter Work Product PASSED Dheeraj will soon work with Sahil to get his Printer Application framework documented on the new OpenPrinting web site. Student: Tanmay Anand Mentor: Sahil Arora Work Product PASSED Tanmay completed his original project already in the first month. We asked him whether he would take a project for the rest of the time and he accepted. So he worked also on the adapter backend for the GTK3 print dialog to use the Common Print Dialog Backends (CPDB). Mentor for this project is Dongxu Li. He did not complete this at the end of the GSoC but promised to complete it after GSoC. Student: Sharad Shukla Mentors: Smith Kennedy, Ira McDonald, Danny Brennan Work Product PASSED Sharad will soon complete his not yet completed assignment of the bannertopdf filter also supporting the old bannertops input format. Student: Aakash Lahoti Mentors: Smith Kennedy, Ira McDonald, Danny Brennan Work Product PASSED Student: Sobhan Mondal Mentors: Zdenek Dohnal Work Product FAILED (final evaluation) Sobhan promised to complete his work after GSoC. The project results will also get added to the new OpenPrinting web site. Mike Sweet has posted on Avahi GitHub Issue #125 and he is of the same opinion as me that the DNS-SD records of local services via the loopback (\"lo\") device should carry the \"localhost\" host name and not the network host name of the machine: If Avahi returns 127.0.0.1 as one of the addresses for a .local lookup, that will cause some serious security problems when machine A (a.local.) looks up machine B (\"b.local.\") and gets its own loopback address. By returning localhost (\"localhost.\") that security issue is avoided. Keep in mind as well that when CUPS tries to connect to a printer/server, it tries all of the addresses returned by a lookup in parallel until one of the connections succeeds. Since CUPS also validates the Host: header in requests (and block any attempt to communicate with cupsd over the loopback interface if the hostname is not \"localhost\" or \"localhost.\"), this will result in a successful connection but a failed request, breaking printing. So you really do need to return \"localhost\" for services registered on the loopback interface. No reaction from Trent Lloyd yet. Now with the GSoC completed we are resuming our work on the web site with Sahil leading the project. Most of the site is in place, most important part to add now are the results of the 5 GSoC projects of this year. Also we need to link to the OpenPrinting database interface web app (Issue #55). We will continue using this web app and the MySQL database (which we now feed from the foomatic-db repository on GitHub) as it is not worthwhile (possible?) to implement a replacement on it running on GitHub. The web app needs to get the outfit of our new web site (Issue #58). 2.3.0 released. CUPS 2.3.0 is finally out! And the licensing resolved! With more than one year or 3 Ubuntu releases of delay it appeared on Fri, August 23, the day after Ubuntu Eoan (19.10) Feature Freeze. The license solution is that the Apache 2.0 license gets an exception added which allows linking with (L)GPL software, so cups-filters and other software using the CUPS library does not need any license change. For new features see Mike's slides of the last OpenPrinting Summit. No changes on 2.2.x branch. Currently released is 1.25.4. Many releases happened during the short time to get bug fixes into the upcoming Ubuntu 19.10 (Eoan). 1.25.5: Bug fix release, mainly for cups-browsed not to die on left over locally generated queues of unclaen shutdown of the previous session. 1.25.4: Bug fix release for the page geometry and CUPS Raster output issues in the imagetoraster, imagetopdf, and pdftoraster filters. 1.25.3: Bug fix release, especially to fix a compatibility issue with CUPS 2.2.12. 1.25.2: Improved cups-browsed's handling of the DNS-SD records of advertised local and remote IPP print services. Especially make sure that local queues do not get already removed when the service on a single network interface disappears (for example Wi-Fi turned off) while still present on other interfaces. Also let local services preferably be accessed through the loopback (\"localhost\") interface to avoid data leaks into the network. No further news. When packaging CUPS 2.2.12 for Ubuntu Eoan (19.10) the automatic tests of Ubuntu's build servers failed cpdb-libs and after several days of debugging I found out that libcups is not initializing some glbal variables with default host name, port, domain socket file for the local CUPS server in some cases. This prevented the CUPS backend from accessing the printer's capabilities via get-printer-attributes IPP request and I had to apply a workaround in the cpdb-backend-cups project. We have reported Issue #5642 on the GitHub of CUPS. A workaround for the time being was applied to cpdb-backend-cups, with this commit Released cpdb-backend-cups 1.1.1 with the fix:"
+ },
+ {
+ "id": "post:OpenPrinting-News-September-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - September 2020",
+ "url": "/OpenPrinting-News-September-2020",
+ "headings": [
+ "OpenPrinting Microconference on Linux Plumbers Conference 2020",
+ "Google Summer of Code 2020",
+ "1. Extract raster data from PDFs for direct printing",
+ "2. General Printer Application SDK",
+ "3. Linux GUI application to admin MF devices using IPP System Service",
+ "4. Make Printer Applications Configurable",
+ "5. Speed/Scaling Optimisation of cups-browsed",
+ "6. Common Print Dialog Backends (CPDB) Qt Implementation",
+ "7. IPP Scan (or virtual MF device) server (Scanner Application)",
+ "Google Season of Docs 2020",
+ "Linux Foundation Mentorship Program",
+ "CUPS Snap",
+ "Printer Applications",
+ "Driverless Scanning and IPP-over-USB",
+ "CUPS",
+ "cups-filters"
+ ],
+ "tags": [],
+ "snippet": "GSoC final results, Linux Plumbers recording, GSoD, LFMP, CUPS temporary fork, cups-filters 1.x fork",
+ "content": "We successfully did our second OpenPrinting microconference! There is a complete recording on YouTube (same links as for the live broadcast during the conference). But note that this one is created automatically by the video conference system, and the edited version will get posted later. We talked about the following topics (links to the slides in PDF format): Introduction - Aveek Basu Printer Applications - A new way to print in Linux - Michael Sweet 3D Printing - Michael Sweet IPP scan (or virtual MF device) server (Scanner Application) - Alexander Pevzner Designing and Packaging Printer and Scanner Drivers - Till Kamppeter IPP Standards Landscape - Ira McDonald IPP Fax Out - A new reality - Aveek Basu 20 Years on Printing with Free Software - Till Kamppeter The video conferencing system and the live broadcast worked very well, having around 40 listeners in our virtual room and up to 17 listeners on YouTube. Thanks again to the great work of the organizers! But I hope we will be able to meet in person again in 2021. Coding ended and the final evaluations are completed, the completed projects officially announced by Google. For the Linux Foundation we got 15 student slots in the beginning and after 1 student dropping out after the first month we had 14 students reaching the final evaluations. 1 of them failed and the other 13 passed. For OpenPrinting there started with 7 students, 1 being the one who quit after one month and 1 failed in the final evaluations, having 5 who completed the program successfully. Here are the projects with their submitted work product links: Student: Vikrant Malik Mentors: Sahil Arora, Till Kamppeter Work Product PASSED Student: Jai Luthra Mentors: Michael Sweet, Till Kamppeter Work Product PASSED Jai has principally worked on PAPPL but also done an HP PCL sample Printer Application. In the end he has also worked on converting filters of cups-filters into filter functions. Student: Lakshay Bandlish Mentor: Michael Sweet Work Product PASSED Student: Sambhav Dusad Mentor: Michael Sweet Work Product PASSED Sambhav has also started to create a Gutenprint Printer Application. Student: Mohit Mohan Mentors: Deepak Patankar, Till Kamppeter Work Product PASSED Student: Priydarshi Singh Mentor: Dongxu Li Work Product FAILED (final evaluation) We are looking into finishing up CPDB after GSoC. Student: Aakash Lahoti Mentors: Michael Sweet, Alexander Pevzner WITHDRAWN (shortly after first evaluation) We have replaced this project by a 2-student LFMP project (see below). Our OpenPrinting project Tutorial and Design Guidelines for Printer/Scanner drivers in Printer Applications got accepted! Piyush Goyal will write for us in the next three months (September 14 - December 5). In total we got 5 projects accepted for the Linux Foundation. In our first LFMP project Dipanshu Verma, working on retro-fitting proprietary classic printer drivers into Printer Applications had to withdraw, as his college suddenly re-established the classes after the pandemic interruption. In the first months he has done several tests of installing closed-source drivers into a chroot, see his work on GitHub. Nidhi Jain has successfully expanded the driverless tool of cups-filters (which allowed setting up driverless printers with classic printer setup tools) to also work for IPP Fax Out queues, allowing to use the Fax send facility of most modern multi-function printers easily, as devices supporting AirPrint usually support also IPP Fax Out. The functionality is fully working in cups-filters from version 1.28.2 on and will also be included in Ubuntu 20.10 (Groovy Gorilla). In the printer setup tool you find your printer under the discovered network printers (also if it is connected via USB, as IPP-over-USB is used then). Select this entry and when it comes to select the driver, select the entry with \"Fax, driverless\". If you want to fax print the document to this queue and in the print dialog (GTK/GNOME or LibreOffice) select \"Custom\" in the \"Phone Number\" option and enter the destination fax number. Parameters like sender info on the fax, default prefixes, repetition of failure, ... you configure with the devices web admin interface. Nidhi was supposed to add fax support to the Common Print Dialog Backends (CPDB) now, but as development did not make it far enough to do so and due to the withdrawal of Dipanshu we have asked her to carry on on retro-fitting classic printer drivers into Printer Applications. Update: Nidhi agreed and will now work on retro-fitting classic printer drivers. As a replacement for our incomplete GSoC project on IPP Scan we are running our second LFMP project. Here we have selected our students now and they have started working in the beginning of this month: Expand PAPPL for scan support, Scanner Applications (IPP Scan as a server) Student: Abhik Chakraborty Expand sane-airscan to support IPP Scan (IPP Scan as a client) Student: Rishabh Arya Abhik will get primarily mentored by Michael Sweet and Rishabh by Alexander Pevzner. The CUPS Snap project is currently waiting for the snapd project to add the needed API extensions. The Pull Request for the implementation of the new \"cups\" and \"cups-control\" interfaces got merged into snapd. The pull request for adding the API functionality so that a Snap can check whether a client Snap plugs the needed interfaces is still in the works. On the Printer Apllications side Sambhav Dusad, GSoC 2020 student, has started to work on creating a Gutenprint Printer Application. As Gutenprint provides all printer capability through its library (PPD files are auto-generated) this will be the first larger-scope native Printer Application. We also have already the following filter functions in cups-filters: pstops, pdftops, pdftopdf, ghostscript (replaces gstoraster, gstopdf, gstopxl), pclmtoraster, rastertopdf (replaces rastertopdf amd rastertopcl), rastertops, and filterChain Special thanks go to Vikrant Malik and Jai Luthra for their work on the filter functions. On the printing-architecture mailing list at OpenPrinting we had a discussion about whether CUPS is still needed with Printer Applications and IPP devices in place: Will IPP printer devices and Printer Applications obsolete the cupsd? Note that for participating in these discussions you have to subscribe to the printing-architecture mailing list. The Main Inclusion Requests (MIR) to get ipp-usb and sane-airscan into Ubuntu Main have passed the general checks of the Ubuntu MIR team and are waiting for the reviews of the Ubuntu security team. Alexander Pevzner is continuing to take user reports and make the packages working with as many devices as possible. IPP Scan support is currently added to sane-airscan as a LFMP project. Currently released is 2.3.3. Due to dormant upstream development we have discussed to create a (temporary) fork on OpenPrinting for bug fixes and distribution patches and Michael Sweet has done it now. Currently released is 1.28.2. On the way towards 2.0.0 we have converted many filters to filter functions, having now pstops, pdftops, pdftopdf, ghostscript (replaces gstoraster, gstopdf, gstopxl), pclmtoraster, rastertopdf (replaces rastertopdf amd rastertopcl), rastertops, and filterChain filterChain() is a special filter function which takes an array of filter functions as parameter and passes the input data to all these filter functions subsequently, allowing for conversions for which there is no single filter function available. Special thanks go to Vikrant Malik and Jai Luthra for thei work on the filter functions. To allow further releases of cups-filters during the transition from 1.x to 2.x I have created a 1.x branch into which I cherry-pick all the bug fixes and some smaller feature additions. This branch is especially the source for the current cups-filters packages in Debian and Ubuntu. Here I have especially added the driverless fax support and the IPP/IPPS support in the driverless utility, from Nidhi Jain's LFMP project (see above). Also many bug fixes, especially crashes and memory leaks of cups-browsed, are included here. 1.28.2: Bug fix release to mainly fix cups-browsed not shutting down and the driverless utility being slow when listing available printers/faxes 1.28.1: Bug fix release to fix several bugs in the new IPP Fax Out support by the \"driverless\" utility and also to fix some minor issues 1.28.0: Feature release (probably the last one before 2.0.0) which adds IPP Fax Out support, IPPS support, and a command line option to reveal standard IPP URIs to the \"driverless\" utility, added log file size limitation and command line options to control what happens to generated queues on shutdown to cups-browsed, fixed several bugs when printing PostScript input files, several bugs and memory leaks in cups-browsed, crashes on the presence of certain fonts, and many more fixes."
+ },
+ {
+ "id": "post:OpenPrinting-News-September-2021",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - September 2021",
+ "url": "/OpenPrinting-News-September-2021",
+ "headings": [
+ "Debian has a new printing maintainer!",
+ "OpenPrinting Micro-Conference on the Linux Plumbers 2021",
+ "The Summer of Printers in the Ubuntu Office Hours",
+ "Google Summer of Code 2021",
+ "pappl-retrofit - The CUPS Driver Retro-Fit Library",
+ "Ghostscript Printer Application",
+ "HPLIP Printer Application",
+ "PostScript Printer Application",
+ "CUPS Snap",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/5KogjLb1Hb4/hqdefault.jpg",
+ "snippet": "OpenPrinting Micro-Conference on Linux Plumbers, OpenPrinting in Ubuntu Office Hours, GSoC results, pappl-retrofit, Ghostscript and HPLIP Printer Applications",
+ "content": "Didier Raboud (\"OdyX\") is going on a 6-month sabbatical and therefore leaving his position as printing guru of Debian. Thorsten Alteholz is overtaking here. OdyX and me have introduced him and he already started off well. Thanks a lot to OdyX for all his work on Debian's printing part and the great collaboration with me and to Thorsten for overtaking where OdyX has left off. Linux Plumbers 2021 is approaching! It will start on Monday next week (Sep 20, 2021) right away with our OpenPrinting micro-conference on the first day! Yes, our micro-conference will take place on Monday, September 20, 2021, 7am - 11 am Pacific or 14:00 - 18:00 UTC The conference is all-online again, as 2020, due to the travel restrictions caused by COVID-19. Update: Recording of the micro-conference on YouTube We will have the following sessions: CUPS 2.4/2.5 Presenter: Michael Sweet CUPS 3.0 Presenter: Michael Sweet Print Management GUI Presenter: Till Kamppeter Common Print Dialog Backends Presenter: Till Kamppeter Printer/Scanner Driver Design and Development Presenter: Till Kamppeter Scanning in PAPPL Presenter: Bhavna Kosta Note that these sessions are not just slide presentations, there are some slides to introduce into the subject matter, but as the Linux Plumbers micro-conferences are intended for, we will discuss the about issues, decisions, design, ... to put our future work into the right direction, and for answering questions of the attendees. The exact schedule is posted on the Linux Plumbers web site. Registered attendees can participate interactively in the live discussions. Probably there will also be the possibility for non-interactive watching of the micro-conference on YouTube and a recording on YouTube after the micro-conference, as last year. Once a week, every Thursday in the US morning and the European afternoon on the \"Ubuntu OnAir\" YouTube channel of the Ubuntu community, the live event \"Ubuntu Office Hours\" is taking place. In each episode a free software community member is invited to tell about his project and what is happening in its community. In the October 7 episode (3 weeks from today) it is all about OpenPrinting. Organizer and host Monica Ayhens-Madon has invited me to talk about GSoC and the students I have mentored. There will not only Monica and me be on the (virtual) stage but also OpenPrinting program manager Aveek Basu and some of this year's (and perhaps also former year's) GSoC students. We will tell about our GSoC work and its achievements, not only of code but also the community growth, and what students have done after the summer, like mentoring the next students or creating our current web site. We will also call for volunteers to join OpenPrinting and to contribute, and also answer the spectator's question which they post on the YouTube Live Chat of the session. Please mark in your calendars: (CORRECTION) Thursday, October 7, 2021, 15:00 - 16:00 UTC It will take place on YouTube and everyone can participate, without registration and free of charge. Everyone can post questions on the YouTube Live Chat. For everyone who wants to get some technical background, Michael Sweet and me have talked about the ongoing changes in the architecture of printing with free software three weeks ago in the Ubuntu Indaba (recording on YouTube). See you there! The Google Summer of Code 2021 has ended successfully for OpenPrinting! All our 5 students have passed final evaluations and did great work. The projects are mostly completed, only some debugging and polishing is currently taking place. Most of the code is already committed to the respective upstream GIT repositories (and partially already in use in the CUPS-driver-retro-fitting Printer Application Snaps). There was a presentation of the GSoC projects on the PWG August 2021 Face-to-Face Meeting which has taken place online on August 17-19, 2021. There we have shown this video where every student has presented his project. Here are the projects with their submitted work product links: cups-filters: Make sure all filter functions work without PPD files Student: Suraj Kulriya Mentors: Jai Luthra, Till Kamppeter, Dheeraj Yadav Work Product PASSED cups-filters: Convert filters to filter functions Student: Pratyush Ranjan Mentors: Till Kamppeter, Dheeraj Yadav Work Product PASSED cups-filters: Create a single, universal CUPS filter to replace the chain of individual filters Student: Pranshu Kharkwal Mentors: Till Kamppeter, Dheeraj Yadav Work Product PASSED GUI for listing and managing available IPP Print/Scan services (or DNS-SD-advertised network services in general) Student: Divyasheel Mentors: Till Kamppeter Work Product PASSED PAPPL: Printer setup tool support and Scanning support Student: Bhavna Kosta Mentors: Jai Luthra, Till Kamppeter, Michael Sweet Work Product PASSED Printer Applications retro-fitting classic CUPS printer drivers consisting of PPD files, CUPS filters, and CUPS backends, like currently the PostScript, Ghostscript, and HPLIP Printer Applications, have a lot in common and share most of their code. Therefore I have continued the development of the code of the PostScript Printer Application by generalizing it for any type of classic CUPS printer driver (see previous News posts and the sneak previews of my work during the last months) and put it up on the OpenPrinting GitHub as the PAPPL Retro-Fit Library. This library will also be the start of several other CUPS driver retro-fits making all the drivers from the last (even more than) 21 years available for the new all-IPP, PPD-less printing architecture. 21 years ago I migrated all printer drivers into CUPS, now I am migrating them into the next architecture. The library makes creating a Snap of a CUPS driver as easy as creating a Snap of any other application. It contains 98 % of the C code needed to create a PAPPL-based Printer Application around the CUPS driver. Only C code still needed is a main() function stub setting the configuration of the Printer Applications (Which features are used, which are the resource/log/spool/state directories?) and perhaps a printer auto-discovery function (Which printers are supported?). Otherwise one needs only the driver with all its files and some extra packages like Ghostscript, libcups, libcupsfilters, libppd, ... The driver's files (PPDs, filters, backends) only need to get placed in the appropriate directories for the Printer Application to find them. No need to change the code of the drivers, so it is also easy to retro-fit unmaintained drivers, drivers for which one does not have an appropriate printer to test, and even proprietary, closed-source, binary-only drivers. Then one can create print queues with the printers being auto-discovered (by PAPPL's backend and/or included CUPS backends) and the model/driver (PPD file) can be automatically or manually selected (each \"Driver Name\" drop-down entry on the \"Add Printer\" web interface page is one PPD file). When printing a job the IPP attributes are automatically mapped to the best-fitting PPD option settings, to easily allow to make use of the features of the printer, even on clients with limited print dialogs, like phones or IoT devices. The web interface also allows to manually set defaults for all PPD options for more detailed control. Even options requiring CUPS PPD extensions, numeric, string, password, fax number, ... options are supported. All current retro-fitting Printer Applications (PostScript, Ghostscript, and HPLIP) are using this library now. The Printer Applications created with this library can also be run directly on the system, without being in a Snap, especially the Test Printer Application which comes with the library and sets its resource directories to use all the PPD files, filters, and backends of the system's classic CUPS installation. This allows testing installed drivers how they work under a Printer Application or allows installed drivers to be used with an installed CUPS Snap. All important features are included now. Further development of the library will go with the development of PAPPL and the needs of the Printer Applications. Especially the following features will get implemented/supported as soon as they are implemented/fixed in PAPPL: Support for string/text-style vendor options. Needs support in PAPPL (Patch already applied in the Printer Application Snaps). Human-readable strings for vendor options. Needs support in PAPPL. Ink level check via ps_status() function. Needs support in PAPPL. Ghostscript Printer Application in the Snap Store, 194 installations via Snap Store If you want to use an (older) printer which is not a modern driverless IPP printer and is also not a PostScript printer (which would be supported by the PostScript Printer Application then) Then this is the right Printer Application for you. It supports ~5000 different printer models, mainly with drivers from the well-known Ghostscript but also some others. The printer model support is based on OpenPrinting's printer support database (Foomatic). Especially many standard laser (PCL 6/XL, PCL 5c/e, PCL4) and dot matrix (ESC/P, OKI, IBM, ...) but also many printers with proprietary print data formats are supported. There are not only model-specific entries to choose from, but also generic entries for the common formats for the case your printer is not explicitly listed. The Printer Application gives access to all the options of the former PPD files inside its web interface (\"Device Settings\", \"Media\", \"Printing Defaults\") but can be easily used from any IPP-compliant client application or device. The standard IPP attributes are automatically converted to the best-fitting PPD option settings, especially for color, quality, and content optimization. These drivers already ship for many years with most common Linux distributions (Ubuntu, Debian, Fedora, SUSE, ...) and have made many user's printers work and these printers will continue to work in environments where only Printer Applications (and no classic printer driver packages) are supported. In the future more drivers will get added to the Snap of this Printer Application, especially smaller, unmaintained driver projects for which it does not make much sense to clutter the Snap Store with another Printer Application. HPLIP Printer Application in the Snap Store, 616 installations via Snap Store Right after having published the Ghostscript Printer Application I have continued with the HPLIP Printer Application, to cover the printers supported by the printer driver of HPLIP. Creating this one was much more complex than the Ghostscript Printer Application as HPLIP is a suite of printer drivers, PostScript PPD files (with extra CUPS filters), scanner drivers and command-line and GUI utilities. It also has many quirks like excessive use of hard-coded absolute file paths in the source code, utilities written in Python, an x86-32/64-only binary-only code blob in the driver ... while Ghostscript and Foomatic are much more packaging-friendly. As scanning support in PAPPL is not ready yet, scanning on multi-function printers is not yet supported. Also loading the proprietary driver plugin will be added later. Printing is now possible on all non-PostScript and PostScript printers from HP and Apollo which HPLIP supports without its proprietary plugin. More than 3000 different models from ~30 years. For maximum compatibility both PAPPL's standard backends and the \"hp\" backend of HPLIP are available, the former for bi-directional access (poll accessory configuration settings of PostScript Printers), the latter for simultaneous printing and scanning on the same device and perhaps also special needs of some printer models. Note that HP is one of the best manufacturers in terms of supporting driverless IPP printing and scanning, so most newer HP printers work best without this Printer Application, even if HPLIP (and so this Printer Application) supports them. Note also that HPLIP has many bugs which are fixed in the Debian/Ubuntu and RedHat/Fedora packages by a high amount of distribution patches whereas this Printer Application uses the \"raw\" upstream source code. I will soon switch to the packaging GIT repository of Debian, as soon as the new Debian printing maintainer has updated it to version 3.21.8. PostScript Printer Application in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, 1484 installations via Snap Store The PostScript Printer Application is now switched over to use the new PAPPL Retro-Fit Library. This means that now we have fully automatic mapping of job IPP attributes to the best-fitting PPD option settings to make printing as easy as possible with standardised user-settable options and from any client device including phones. Also most of the development and debugging happens centrally in the retro-fit library. Note that HP's PostScript PPD files are in both this and the HPLIP Printer Application now. This should make the life easier for users. Some do not know whether their printer is PostScript, but it is from HP, so the HPLIP Printer Application will always work, others have a bunch of PostScript printers of different manufacturers, including HP, they will be able to support them all with a single Printer Application. CUPS Snap in the Snap Store, Call for testing on the snapcraft.io forum and on the Ubuntu Discourse, 2564 installations via Snap Store I am still waiting for the snapd team to implement the security concept on the snapd side, but unfortunately, they are very busy currently. But I have good news now: I have talked with them about when I can expect the merging into snapd and they tell that they will do it in October, so that for the full developemnt cycle of Ubuntu 22.04 LTS (J. J.), starting end of October, it will be available for testing and deciding whether said Ubuntu version will come with the CUPS Snap as standard printing environment, and naturally uploading of applications which print into the Snap Store will get easy and fully automatic, without any manual review and permission needs. Main TODOs are: Complete the security concept on the snapd side, especially implement the content interfaces (see above) Testing Turn classic CUPS drivers into Printer Applications (see progress above) Add a migration script so that OS distributions can easily switch over from classic packages to the CUPS Snap Currently released is 2.3.3op2. Development of CUPS 2.4 is in progress, currently mainly fixing of bugs which were reported to Apple's CUPS GitHub in the last 19 months. Ubuntu Impish Indri (21.10) will also come with CUPS 2.3.3op2, the CUPS Snap and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master. The CUPS in Impish Indri has a distribution patch porting the fully automatic job-IPP-attribute-to-PPD-option-settings mapping from cups-filters, which we use in all retro-fitting Printer Applications to CUPS, so that when sharing a print queue under the new Ubuntu one has the same ease of printing to it from any device, especially phones. A Pull Request for upstream inclusion of this feature is posted and under discussion. There will be news and discussion about CUPS 2.4.x and 3.x with Michael Sweet on the OpenPrinting Micro-Conference on the Linux Plumbers 2021 on Monday (Sep 20). Currently released is 1.28.10. Current development work is finishing up, testing, debugging this year's GSoC student projects, improving and optimizing the rules for mapping job IPP attributes to PPD option settings, and smaller feature needs appearing during the CUPD driver retro-fitting work (but most is already done for this). Now we also need to clean up and sort out things to be able to do a first 2.x release of cups-filters. Improved the auto-mapping of job IPP attributes to PPD option settings (presets). Several new rules added during further driver retro-fitting work, especially also for Foomatic's \"PrintoutMode\" composite option. The GSoC students have completed conversion of the filters into filter functions and making the filter functions also use job and printer IPP attributes as alternative to PPDs and option settings. A Pull Request for a single, universal CUPS filter, calling sequences of filter functions, reducing external function calls, is posted and shortly before merging. Support for the print-rendering-intent IPP attribute in filter functions. Use of log function for the log messages produced by the color-management-related functions of libcupsfilters. In the ieee1284NormalizeMakeAndModel() function extract driver info with regular expression (needed by libpappl-retrofit). In filterExternalCUPS() sanitize the device URI (for CUPS backends) and env variables to assure that passwords do not get into log files. Also several minor bug fixes were done. 1.28.10 Bug fix release, fixes backported from the master (2.x) branch (see below) Ubuntu Impish Indri (21.10) will come with cups-filters 1.28.10. The CUPS Snap currently uses 1.28.10. The PostScript Printer Application Snap uses the current GIT master of cups-filters. Currently released is 1.1b1. We have now support for setting the default printer and pausing/resuming print queues in the web interface (and command line interface, too). Also the Printer Application does not get stuck any more on an unresponsive printer when canceling or deleting jobs or shutting down the Printer Application. The printer's device ID now also gets polled from SNMP-discovered devices, meaning that for those an auto-assignment of the driver is also possible. Many other improvements and fixes. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-September-2022",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - September 2022",
+ "url": "/OpenPrinting-News-September-2022",
+ "headings": [
+ "Saving old printers under Windows is getting easier",
+ "OpenPrinting Micro-Conference on the Linux Plumbers 2022",
+ "Open Source Summit Europe 2022",
+ "Ubuntu Summit 2022",
+ "Google Summer of Code 2022",
+ "Common Print Dialog Backends 2.0",
+ "CUPS Snap and snapd printing interface",
+ "Approaching cups-filters 2.0",
+ "pappl-retrofit",
+ "OpenPrinting web server: Printer Application look-up service is now live",
+ "Snap Store Overview",
+ "CUPS",
+ "cups-filters",
+ "PAPPL"
+ ],
+ "tags": [],
+ "teaserImage": "/assets/images/malt-jet-printer/printer.jpg",
+ "snippet": "Printer Application Snaps under Windows, OpenPrinting MC, OSS, Ubuntu Summit, GSoC, CPDB 2.0, \"cups\" snapd interface, cups-filters 2.0, Printer App look-up, PAPPL 1.2.2",
+ "content": "We are a little late this month, mainly due to my conference trip to Dublin, Ireland, last week, but also to catch the release of systemd/Snap-supporting WSL2. The month is nearly over, tomorrow there is already the new Ubuntu Desktop Team Indaba, this time about snapcraft 7/Ubuntu Core 22. Do not miss it while reading all the exciting stuff here ... So let us start ... I am back from Dublin, Ireland, now, having attended two conferences, the Linux Plumbers conference and the Open Source Summit (OSS) 2022. Conferences have often nice social events in the evenings after each day of talks and hallway sessions. This time the OSS had their main social event in the Storehouse of Guinness, the place where it is shown how this famous beer is made. And there I have seen something very special ... You perhaps have read or heard about how I got to do OpenPrinting. I did a PhD in physics, was system administrator for the department's network, discovered and deployed CUPS back in 2000, got discovered by MandrakeSoft, and finally switched the subject I was working on to Structured Deposition of Ink and Toner Particles on Paper Substrates or, in a more colloquial English: Printing. But only paper? One can print on other materials, too. Let us try: Structured Deposition of Malt Particles on Beer Foam Substrates Yes, you are reading right, you can have pictures on the foam of your beer, even your picture. Back to the Storehouse. Up on the forth floor, after you have seen how this holy black liquid with the nice foam on the top is made, you will get a so-called Stoutie, a Guinness with a picture on its foam. First they (or you) draw the beer, and then, they put it into their malt jet printer: Malt jet printer The malt jet printer, with touch screen operation! Printing ... Printing has started ... Print head ... Print head moving ... ... Printing ... ... Printing continues ... ... Printing done! ... and ready! I do not know whether you can print with a Linux machine to this device, so probably it would be a \"Paperweight\" in our database ... Cheers!! You remember my announcement of the HOWTO about running Printer Applications under Windows via WSL to save legacy printers in the August News? You were perhaps thinking about the poor Windows users whose printers stopped working now having to compile a hell lot of libraries from our site to get their old treasure working again. That is not needed any more. The new version of WSL supports systemd and with this also snapd and with this Snaps, including all the Printer Application Snaps. And systemd enables more Linux workflows you are used to in WSL, like auto-starting the daemons (also of the Printer Applications). No compiling, auto-starting daemons, Avahi advertising your printer to the hosting Windows (no manual input of the URI) ... Here is the first announcement from Microsoft and the first Ubuntu blog from Oliver Smith, Product Manager Enterprise Desktop at Canonical. Update: Our HOWTO is now updated. So follow our new version of the HOWTO. And here is quick overview of the changed steps (details in the HOWTO): First, use either the preview version of Ubuntu WSL or follow Oliver's instructions on enabling systemd in your WSL. It is the section \"How to enable systemd in Ubuntu WSL\" near the beginning of the blog. Now make sure you have Avahi installed (package avahi-daemon): and install it if needed With this the Windows print environment will auto-discover the Printer Application running under WSL. If your printer is connected via USB, install USB IPD. Now find the suitable Printer Application in the Snap Store (OpenPrinting, LPrint) or if you are in doubt, use our look-up service. Install it with just a simple: Replace by the name of the Printer Application which you need for your printer. Now set up your printer inside the Printer Application using a web browser. Add the printer to Windows. Go to \"Settings\" > \"Bluetooth & devices\" > \"Printers & scanners\" and hit the “Add device” button. You should find an entry for your printer provided by the Printer Application in the list, with the name you have given to it when setting it up in the Printer Application. Now you can print as you are used to under Windows. Thanks a lot to Serhat Toktamisoglu and his WSL team at Canonical, Didier Roche, Jean-Baptiste Lallement, Carlos Nihelton, and Eduard Gómez Escandell and especially Dani Llewellyn as community contributor for getting the systemd support into WSL in such a short time. Thanks to the people at Microsoft cooperating with our team at Canonical on WSL. Thanks to Carlos Nihelton for working out the steps to run Printer Applications under WSL, even already before the addition of systemd support. Thanks to Serhat Toktamisoglu for supporting me on this project. And thanks to Oliver Smith for his great blog entry, being a HOWTO for getting started with systemd-enabled WSL, and also spreading the news. We have another great Linux Plumbers Conference behind us, after 2 years of virtual-only due to the pandemic finally in-person again! You are really missing something with virtual conferences (see also above). Our micro-conference on was a success again! We discussed a lot on OpenPrinting's plans for the next 12 months. Me, Piotr Pawliczek, Valentin Viennot, and Monica Ayhens-Madon were live on stage, while Michael Sweet, Zdenek Dohnal, and Aveek Basu have participated remotely. Update: YouTube links to the recordings of the sessions added. We had the following sessions: Introduction Presenter: Till Kamppeter Slides CUPS 2.5 and 3.0 Development Presenter: Michael Sweet Slides, Recording Mostly as reported here from earlier conferences. CUPS 2.5.x delayed to release in May 2023, 3.x stays in time for release end of 2023. There was no coding yet for 2.5.x and 2.5.x also needs OAUth integration with the desktop. Does not make much sense when one cannot use OAuth, only translations/Weblate interesting then. No worries for switchover into New Architecture by CUPS 3.x or the CUPS Snap: All free drivers are available in Printer Applications, GNOME Control Center and print dialog support available by then, rehearsal by Ubuntu with CUPS Snap. Testing and CI for OpenPrinting projects Presenters: Till Kamppeter, Michael Sweet Slides, Recording CUPS and some other projects do CI via Github Actions triggered on each GIT commit: make test, static analysers, try to build Docker image, ... We want to expand this to all important OpenPrinting projects, in addition regression tests (from Red Hat), filter regression tests on huge amount of print data files from bug report (like Ghostscript), perhaps also private tests for CVEs. Restricting access to IPP printers with OAuth2 framework Presenter: Piotr Pawliczek Slides, Recording Desktop/GUI integration is required, best with OAuth2 support already existing in the desktop toolkits and Linux distributions. Zdenek Dohnal has reached out to the upstream developers of GTK/GNOME about the OAuth2 integration and already available components, especially GNOME Online Accounts (GOA), evolution-data-server (eds), opening browser, user/password input pop-ups, RestOAuth2Proxy from librest 1.0, liboauth, ... We will post here when we find our way through this. Documentation for OpenPrinting projects Presenter: Michael Sweet, Till Kamppeter Slides: CUPS, Site, Recording Documentation for programmers, administrators, and users needed, in CUPS the former is mainly automated by especially formatted comments in the source code and extracting these with an appropriate tool and the rest is written manually. We want to extend this to all important OpenPrinting projects. In addition, we should also consolidate all printing debugging documentation created by the distributions: Debian, Ubuntu, Fedora, SUSE, ... Sandboxing/Containerizing alternatives to Snap for Printer Applications Presenters: Till Kamppeter, Valentin Viennot Slides: General, Chiselled containers, Recording, Recording Only containerization alternative to Snap are OCI-compliant containers: Docker, ROCKs, ... For this session I have invited Valentin Viennot, Product Manager ROCKs & container images at Canonical, as last-minute guest to talk about optimizing containers for security and size by removing (chiselling) unnecessary OS components. Valentin would help us on this for containers of CUPS and of Printer Applications, both in OCI-compliant and Snap format and to distribute via the ROCKs store. We have cancelled the 3D-printing session as we did not have enough to discuss about this subject. Phoronix has written about Mike's part on our micro-conference: CUPS 3.0 Continues Being Crafted To Overhaul Linux Printing Thanks a lot to Monica Ayhens-Madon for taking care of the remote attendees while I was concentrating on the people in the room, to Steven Rostedt and James Bottomley to organize the Linux Plumbers and to help me with everything micro-conference-related, especially also having given last-minute in-person admission to Valentin, and also thanks to Zdenek Dohnal for taking notes of the discussions. Once in Dublin for the Linux Plumbers (see above) I also attended this year's Open Source Summit Europe of the Linux Foundation. This is one of the largest free software conferences, with 15 tracks. I had access to the whole conference and all evening events due to being one of the 8 fellows of the Linux Foundation. I did not give a talk there but met a lot of people, also an old friend from the early 2000s and also Kate Stewart from the Linux Foundation to talk about the Future of OpenPrinting. There were also great social events in the evenings, in the Guinness Storehouse (see also above) and in the Teelings Distillery. And I won a BeagleBone IA64 in the closing plenary of the embedded Linux track! A lot of organization and preparation work is going on! I am also one of the members of the event's organization team. The site has completely changed now. The preliminary announcement page has been replaced by an Indico-based interactive site where you can register for attending and submit your proposal for a talk or a workshop. Please be quick with your ideas for contributions. The call for proposals ends on UPDATE!!! October 7 (we got amazing submissions, and we want more!). And note that Canonical will pay all your costs (travel, accommodation, meals) if your in-person proposal gets accepted. Formats available are interactive workshops, regular talks in two sizes and lightning talks in two sizes. I have already seen first proposals coming in and there are already many interesting talks which would make the Summit be a great conference. But we need many, many more. Especially success stories with Ubuntu, techniques of getting your work done with Ubuntu, and of application development and distribution are highly welcome. Also hands-on workshops, especially about robotics, IoT, Raspberry Pi, embedded, ... are sought-after. We also want to offer a Snap Tutorial Track (\"Your application everywhere, just in a Snap!\"), so that the many application developers in the community learn how to snap their work to easily distribute it, making it available in many distributions: Ubuntu, Debian, SUSE, Red Hat, Windows (see above), ... For this we are looking for workshops about advanced Snap techniques (GTK/GNOME, Qt/KDE, Flutter, Games, ...). Interactive hands-on workshops are preferred. See also the Ubuntu blog from Heather Ellsworth (also in the organization team) about the call for proposals, with detailed instructions for a hopefully successful proposal. And here is the initial announcement blog from Philipp Kewisch, Community Manager at Canonical and one of the chairs of the event. And if you are eager to get the latest news quickly instead of waiting for my October News Post, subscribe to the official Ubuntu Summit newsletter. Any questions? Please ask summit@ubuntu.com. Get in touch with the people behind Ubuntu in Prague!! Now the third month of the coding period of the Google Summer of Code 2022 has passed and our contributors are continuing their great work! And the coding is not over yet, as we are applying a new feature of the GSoC. We have extended the coding period for all our 7 students, primarily to compensate for them having exams of their schools during the original coding period, or classes already having restarted. For that we extended by 4 weeks. In our GNOME Control Center sub-team (Mohit and Shivam) we have extended for even 6 weeks, to give the GNOME design team the time to get the changes on the GUI right. And here are the third editions of their little summaries (again in our group chat on Telegram) of what they have done: Converting Braille embosser support into a printer application Contributor: Chandresh Soni Mentors: Till Kamppeter, Samuel Thibault Hello everyone, in the last few weeks I have created a separate driver for embossers and integrated them with the main application. I have also completed automake for the printer application, with only minor changes remaining. I plan to begin testing the application this week and fine-tune it based on the results of the testing. Scanning Support in PAPPL Contributor: Deepak Khatri Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar Hi everyone, in last few days I have been going through my work to integrate it into pappl. In last few weeks I improved scanner objects and try to implement the API papplSystemSetScannerDrivers. I am also trying to understand the similarities of code to be used in Driver Interface. Adding Common Print Dialog Backends (CPDB) support to existing Print Dialogs Contributor: Gaurav Guleria Mentors: Till Kamppeter I have started work on the CPDB support for Qt Print Dialog. I have created a basic CPDB print plugin for Qt here: https://github.com/TinyTrebuchet/qtbase/tree/cpdb with help from Albert Astals Cid (tsdgeos). I have also got in touch with the Qt development team to decide how exactly should CPDB support be added into the QPrintDialog. Further, I have done some bug fixes, improvement and added new features to cpdb-libs. cpdb-libs now has support for obtaining and setting user and system wide default printers: https://github.com/OpenPrinting/cpdb-libs/pull/10 and also supports multiple unique media margins for each media size: https://github.com/OpenPrinting/cpdb-libs/pull/8 Discussion with the Qt upstream developers on their mailing list: Initial post, thread \"Adding CPD support to Qt print dialog\" GNOME Control Center GUI for discovering non-driverless printers and finding suitable Printer Applications for them Contributor: Mohit Verma Mentors: Till Kamppeter, Michael Sweet, Pranshu Kharkwal, Divyasheel, Deepak Patankar I have completed the work of discovery of Printer Applications along with their binary paths. I have also weeded out the duplicate entries listed by Avahi. With the Printer Application look-up service in place, I have started the work on a temporary GUI for the Printer Application which can be adjusted to the final design once it is finalized by Marek Kasik. This GUI will be completed by the end of this week. So, by the end of this month we will have a makeshift GUI which can search for the most appropriate Printer Application on the Open Printing and install it as well along with other desired functionalities. Further discussion happened on Mohit´s issue report: GNOME Issue report #1878: Allow to add new printers via Printer Applications cups-pk-helper changes: cups-pk-helper PR #7: Added discovery of Printers via lpinfo, PAPPL and Printer Applications Scanning Support in PAPPL with eSCL Support Contributor: Rishabh Maheshwari Mentors: Till Kamppeter, Michael Sweet, Dheeraj Yadav, Deepak Patankar I have completed all the necessary functions required for the parsing of client scanner requests and store the device capabilities in a data structure. I have also completed developing the helper functions required for this functioning. Currently, I am waiting for Deepak to finish his work towards developing some simple test facility which emulates the behavior of a scanner using static images which will be used by me for testing my code. Add Avahi calls for discovering and resolving driverless IPP printers and Optimize the processes Contributor: Sachin Thakan Mentors: Till Kamppeter, Michael Sweet, Deepak Patankar Hi all, I have been working on integrating my earliar work into cups-filter. In last few weeks, I refactored and improved my avahi implementation and tried building cups-filter on my system(having encountered some issues with my already build version of cups-filter) to get started with 2nd phase of the project. I am hoping to make fast progress in coming weeks. Thanks Create new printer setup tool for the GNOME Control Center Contributor: Shivam Mishra Mentors: Till Kamppeter, Pranshu Kharkwal, Divyasheel, Deepak Patankar Hi everyone, I have completed integration of GUI functionality of configuring IPP system service with IPP printing services listing in the main panel along with CUPS queues. As of now I'm working on fine-tuning & other possible updates, and also looking for integration of discovery of Printer applications in the module. Feature requests so far: #1877: Improve setting of IPP options #1879: Do not show setting of drivers for IPP printers #1911: Printers: Make adminurl available for IPP printers While our GSoC contributor Gaurav Guleria is working on adding CPDB support to the print dialogs (see above) he has continued to do fixes and improvements on the CPDB framework itself: Support for each media having multiple sets of margins Support for overall default printers Distinguishing print and fax queues amd providing needed extra options Also this will get included in the 2.0 release of the Common Print Dialog Backends. For the release itself I will still wait a little bit, as Gaurav could find other needs of functionality during his work on the Qt dialog. CUPS Snap in the Snap Store Now with the cups snapd interface in place Snap package maintainers are starting to use it. Unfortunately, we have hit a bug in snapd with the new cups interface. The automatic dependency installation of the CUPS Snap via the pseudo content interface with default-provider: cups interferes badly if the Snap using the cups interface for printing is seeded (being in the list of default packages used in the OS distribution), even if the CUPS Snap is also seeded (bug report on snapd). I hope the bug gets solved soon by the snapd team at Canonical. Otherwise we will simply skip right to the real integration of the CUPS Snap dependency in the cups interface without any ugly workarounds. For this I have already planned to meet the snapd team in-person for working on an appropriate solution on Canonical's internal Engineering Sprint in Prague, in the week before the Ubuntu Summit. The implementation will then be scheduled to be finished for Ubunru 23.04, the first Ubuntu using the CUPS Snap as standard print environment and the New Architecture. Application developers in the community uploading their work to the Snap Store can still freely use the cups interface without any problems. Only the few Snaps which are in the default installation/the ISO of Ubuntu are affected (and have to stay with cups-control for the time being), and those are usually maintained by Canonical employees anyway. We get really close now. I am in the middle of cleaning up all the code to get a unique coding style and to make it more readable. For the coding style I follow the DEVELOPING.md file of the CUPS source code, to extend this to all OpenPrinting projects. To improve the readability of the code, I also add missing spaces in comma-separated lists (xxx,yyy,zzz -> xxx, yyy, zzz) and around operators (x=a*(b+c)%4 -> x = a * (b + c) % 4), what got nearly completely missed out by several contributors. Comments are re-formatted to use // ... instead of /* ... */, like in PAPPL, so C and C++ files get the same comment style. I did this already on the code for the cfFilterPDFToPDF() filter function and on a bunch of other files of libcupsfilters. In addition, I did final testing, bug fixing and polishing: Made the new cups-filters correctly working with the PPD files for driverless printers generated by CUPS (temporary CUPS queues and creating queues with lpadmin ... -m everywhere ...) and also with PPD files of older cups-filters 1.x versions (commit). Added NULL checks when filter functions of libppd (especially also ppdFilterExternalCUPS) are called without PPD file, to avoid crashes. This especially prevented all maintenance tasks (poll default option settings and installable accessory configuration from PostScript printers, identify printer, …) in the retro-fitting Printer Applications from working (commit , commit). Replaced all assert() calls in the 3 libraries (libfontembed, libcupsfilters, libppd) by macros to only be actual assert() calls when the DEBUG macro is set, to avoid automatic bug reports (apport) in production use (coomit). Correctly check final output type to determine which filter does the page logging (commit). Page logging for PostScript output (commit). Compare MIME type strings case-insensitively in the cfFilterUniversal() filter function (commit). When generating a printer IPP attributes record from the PPD file, make sure that all attributes concerning custom page size are included (commit). Import template directory name when calling cfFilterBannerToPDF() via cfFilterUniversal() (commit). Let ppdFilterPDFToPS() correctly determine the print resolution (commit). Improvements on getting printer IPP attributes from the PPD, on attributes printer-resolution, device-uri, document-format-supported, print-content-optimize-supported, media-col-ready, media-ready, removed irrelevant code about supply levels (commit) Fixed selection of PDF renderer in the build system (commit) Added support for Poppler's pdftops to the cfFilterUniversal() filter function/universal CUPS filter (commit) In cfFilterPDFToRaster() fixed margins of output pages (commit) cfFilterRasterToPDF() only accepts PWG Raster, not CUPS Raster, so renamed it to cfFilterPWGToPDF() (commit) and only feed PWG Raster into it (commit). Finally removed the not-used-by-anyone PHP and Perl APIs (commit) Also removed legacy image format support (commit). Merged pull request to add configuration directive to cups-browsed to not check the network interfaces too frequently, to improve its performance. Thanks a lot to Zdenek Dohnal from Red Hat for the contribution. I have also adapted the printer driver retro-fit library and where needed thet Printer Application to the last and final changes of the cups-filters 2.x API, and while doing this, also fixed a crasher in pappl-retrofit (commit, commit). Naturally I have also tested everything and found that after printing a job or doing an administrative task (Identify printer, poll accessory configuration) the Printer Applications start to consume 100% CPU permanently. After reporting a bug on PAPPL earlier, Michael Sweet actually found a 100%-COU problem in the job history clean-up code and fixed it, but the 100%-CPU problem persisted for me. I Investigated further and found that it only happens on printers with CUPS backends. So I worked around it by temporarily de-activating the not yet completed supply read-out support (commit). But doing more tests the 100%-CPU monster was rearing its heads again, but before I could investigate, I had to reboot on a browser memory clog-up crash and after that the 100% CPU was gone, probably a bad effect of the system having run out of memory ... Now it seems to be all working as intended. We have finally deployed the Printer Application look-up service for printer setup tools on the OpenPrinting web server for printer/driver look-ups! I did some tests and everything works as expected. Printer Application Snaps installed on the server find the correct drivers for the given printer device ID and the user (or better the printer setup tool) gets as answer a hierarchy list of what are the best Printer Applications which support their printer and with which internal driver. I passed this on to our GSoC contributors working on the GNOME Control Center, so that they make use of it. If you want to try it out, try URLs like: https://openprinting.org/query.php?papps=true&device-id=MFG:HP;MDL:LaserJet%204050 https://openprinting.org/query.php?papps=true&device-id=MFG:Epson;MDL:Stylus%Photo%20R800 This is actually a machine communication interface for printer setup tools, an interface for humans will come later. Thanks a lot to Violet Kurtz from the OSUOSL for implementing this! From OpenPrinting we have already 6 Snaps in the Snap Store: |Name|Description|Downloads| |:---|:---|---:| |cups|CUPS|82922| |ipp-usb|ipp-usb|2715| |ps-printer-app|PostScript Printer Application|2558| |ghostscript-printer-app|Ghostscript Printer Application|1787| |hplip-printer-app|HPLIP Printer Application|5742| |gutenprint-printer-app|Gutenprint Printer Application|4661| Currently released is 2.4.2. There will be further bug fix releases in the 2.4.x series. Some bug fixes were done during the last month, see changes below. Ubuntu Kinetic Kudu (22.10 will most probably come with 2.4.3. The CUPS Snap (in the Edge channel) and our CUPS-driver-retro-fitting Printer Application Snaps use the current GIT master of CUPS. The CUPS Snap in the stable channel is version 2.4.2. Currently released is 1.28.16. The restructuring of the code to separate the siamesian twins of the filter functions and PPD file support is completed and we also have done a lot of testing and bug fixing. Now we are finally polishing the coding style and updating the license/copyright headers for the 2.0.0 release. See above for more details. As cups-filters 2.0.0 will not make it into Ubuntu 22.10 we continue with further bug fix backport releases in the 1.x series. 1.28.16 Bug fix release, to make images be printed in their original size with \"print-scaling=none\" and to not use deprecated data types for reading TIFF images. Ubuntu Kinetic Kudu (22.10 will coming with cups-filters 1.28.16 or a later 1.28.x release. The CUPS Snap is currently locked to the /e496badbf2 commit (from May 20) of cups-filter's GIT master (2.x) until the restructuring gets more tested. The Printer Application Snaps use the current GIT master of cups-filters and so are the first application for real-life testing. Currently released is 1.2.2. In the last months the development of the 1.3.x series has already started. See changes below. 1.2.2 General bug fix release. See changes below. All the CUPS-driver-retro-fitting Printer Applications in the Snap Store (see above) use the current GIT master of PAPPL, so they contain all the latest fixes and improvements. See also the currently open and closed issues of PAPPL."
+ },
+ {
+ "id": "post:OpenPrinting-News-September-2023",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - September 2023",
+ "url": "/OpenPrinting-News-September-2023",
+ "headings": [
+ "Opportunitiy Open Source in the IIT Mandi, India",
+ "DebConf 2023 in Kochi, India",
+ "Ubuntu Summit 2023 in Riga",
+ "Google Summer of Code 2023",
+ "cups-filters Second Generation - Final 2.0.0 Release!",
+ "PAPPL 1.4.0",
+ "Snapping for OpenPrinting, especially the CPDB CUPS backend",
+ "Printer setup tool for KDE",
+ "CUPS 3.x"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/P22DOu_ahBo/hqdefault.jpg",
+ "snippet": "40 years of GNU, Opportunity Open Source in IIT Mandi, India, DebConf 2023 in Kochi, India, R. I. P. Abraham Raji, Ubuntu Summit 2023 in Riga, GSoC 2023, cups-filters 2.0.0, PAPPL 1.4.0, CUPS 3.x",
+ "content": "We are all talking about Open Source or, more correctly, Free Software, and others are just talking about Linux, which is only a small part of it, but many do not know when and how it all began. A few days ago, on September 27, we had the 40th anniversary of Richard M. Stallman (RMS) announcing the plan to develop the GNU operating system, a free (as in freedom) Unix-like operating system. And what made Richard coming to this idea is the same as what made me promoting CUPS and running OpenPrinting, a problem with a printer. Richard´s problem was that back in 1980 at the MIT Artificial Intelligence Laboratory, where he was working, they got a shiny new Xerox 9700 and Xerox denied him access to the source code of the printer's software, for him to make the users get informed about finished jobs, paper jams, ... (note that CUPS came well later) Exactly this he did with the software of the previous printer. See the whole story in \"Free as in Freedom\", by Sam Williams, chapter 1. My problem was that back in 1998 in the Theoretical Physics department of the University of Bayreuth in Germany, where I did my PhD, they got a shiny new Tektronix Phaser color laser printer and it only came with proprietary software for commercial Unixes and not for Linux. Only by deploying CUPS with its perfect PostScript printer support I solved the problem. But my problem had never showed when there had not been Richard's ... To celebrate the 40th anniversary of the foundation of the free software movement, there was a little one-day conference in Biel/Bienne in Switzerland, with several talks. Richard Stallman was also there, giving a keynote (FOSS Force article). In the keynote RMS revealed that he has cancer, and one sees also in the video that he has lost all his hair and beard due to the chemo (see also the article on The Register). But he says that his prognosis is good. We all wish RMS all the best to recover soon and continue his great initiative for many more years. And, talking about history of free software, on the DebConf in Kochi, India, I met Raghavendra Bhat, who told me his experience with XPP (X Printing Panel), the little print dialog I wrote back in 2000, which initiated my printing career. He did a lttle write-up for me to post here: XPP was doing a good job for me as I had setup some Xerox or HP Laser Jet printers. I had setup FVWM on Slackware GNU or so, then I chanced upon this small nifty printer setup uty XPP. I deployed it as it had no other library dependencies, it had a dependency on libfltk or was it libx11. I setup the HP Laserjet printer beautifully, an unused PC AT computer with Slackware GNU/Linux acted as the print server now with this X11 tool called XPP. I looked up as to who the developer of this panel was, a weird sounding Norwegian or such name with Kampeter in the end. I thought it was some computer programmer who made a pun of his name to mask identity as to the creator of XPP, Kampeter for Komputer!! About a couple of months back, a research scientist told me that the Slackware machine near a Laser Printer was still not junked. Much to my suprise, the Laser printer was still churning out pages with this XPP dialog-like printer panel interfacing with this antique AT machine. Hahaha..... Yes, Till Kampeter, you really are ancient, more still so serving a real good job with the XPP printer panel. I had deployed this with Slackware in an oceanography lab here in Kochi, maybe was it Bo Peep or was it Hamm or it could have still have been Slackware GNU. Debian GNU was not known, even if it were who would want to do a tedious install with the BOOT and ROOT floppies!! So XPP is still in good memories ... My colleague at Canonical I mentioned most in my OpenPrinting News was Heather Ellsworth, especially known as the host of the Ubuntu Desktop Team Indabas. Unfortunately, she has left Canonical. But no worries, she is at Thunderbird now, in Jason Evangelho's marketing and communications team. So she is continuing in free software, continuing doing community work, continuing to attend and organize conferences (and so continuing to meet me), ~~continuing to do Indabas~~ ... ... not Indabas, but she did a great podcast, episode #5 of the Thundercast series. She tells about how she got into free software and gives some tips for remote working (note that Thunderbird is also totally work-from-home, as Canonical). Also Monica Ayhens-Madon, especially known as host of the Ubuntu Community Office Hours back in 2021, who left Canonical already last year, is now at Thunderbird, at least part-time. And by the way, I have shown here already, exactly a year ago, a printer which prints on beer foam, in the Guinness Storehouse in Dublin, Ireland, and I have seen it again in Vienna, where I live. It's a Ripple Maker, controlled by its touch screen and a web app, most probably not a driverless IPP printer. Special tip: You are on NixOS? Printing is not enabled by default there. Please follow these instructions (Thanks, Linux Matters team for the hint in episode #13). So let us now start with what we did at OpenPrinting in September ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. My talk about the conference on the DebConf 2023: \"Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us!\" (video, slides, all files/photos) My lightning talk about the conference on the Canonical Engineering Sprint: Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! Report by Dimple Kariakose on Ubuntu Discourse Mastodon: #OpportunityOpenSource My first trip to India, especially the Opportunity Open Source in the Indian Institute of Technology Mandi in Northern India was a success. The long trip, a 10-hour road trip from Delhi Airport and after the event ~6 hours driving to Chandigarh Airport, were really worth it, as we encountered ~100 excited students of the IIT Mandi attending the event. We were also lucky with the weather, sunny and no rain during the road trips and the event itself. Especially our GSoC contributors were eager to meet me, as I arrived at 2am and several stayed up to receive me at the guest house, amd they helped me to get my suitcases (with all the swag) into my bedroom. Akarshan Kapoor (GSoC contributor on scanning with PAPPL) did great on-location organization work, getting for us the 2 conference rooms, accommodation in the guest house, volunteers for A/V and also excellent food ... Thanks a lot to him. Everything worked great, streaming, recording, remote speaking, only problem was the connection of the laptop running the streaming with the room's audio system. We could not test this beforehand as the rooms were permanently busy witih classes. We ended up running an hour late and to make remote speakers audible holding a mic against a Bluetooth speaker connected to the laptop. Especially we did not have the time for running the GSoC panel any more. Also due to the live stream in room 1 on Friday having broken down we needed to create a new one for the OpenPrinting track and so were not able to start the sessions in time. At least we could have Michael Sweet's talk in full. The actual schedules, also with some last-minute changes of the day before, worked out in several phone calls with the Zephyr people during the road trip to Mandi, are here. Especially we have added the talk \"Getting a Start in Open Source\" by Shuah Khan from the Linux Foundation on Friday into the Zephyr track and we have replaced the Zephyr training on Saturday by the talk \"Why BeST uses OpenSource and Zephyr RTOS\" by Oliver Völckers from BeST Berliner Sensortechnik GmbH in Germany. We also moved the screening of Kate Stewart's pre-recorded talk from Friday to Saturday. But the attendees had no problem with all that and were patient with us. They liked the event a lot. Special thanks to Canonical's Community Team, Philipp Kewisch, Mauro Gaspari, and Aaron Prisk, for all the support, the swag, and especially for hosting my event site on Canonical's Indico and for letting me accept remote speakers, live-stream, and record using Canonical's StreamYard and Ubuntu OnAir. And thanks a lot to all the speakers, volunteers in the rooms, and the exceptional audience! And we have asked for those who want to participate in an Indian Ubuntu Local Community (LoCo) to sign up via a QR code and ~30 actually signed up! In total, including DebConf we got even 47 sign-ups. Thanks a lot already now to everyone having signed up. Here are all the sessions with links to slides and recordings: General open source/free software What is Open Source? by Aveek Basu (video, slides) - Aveek started the event with an introduction for newcomers to open source and free software. Getting a Start in Open Source by Shuah Khan (video, slides) - Shuah from the Linux Foundation shows where one can contribute and mentorship opportunities at the Linux Foundation. ScaniVerse: A New Horizon in Unified Scanning for Linux Systems by Akarshan Kapoor (video, slides) - GSoC contributor Akarshan Kapoor presents his GSoC project of adding scanning support to PAPPL to supply scanner drivers via sandboxable Scanner Applications and also his project of MetaScan a scan client which organizes the scanned images. The same talk he will also give on the Ubuntu Summit 2023. He does amazing work for free software. Apply and work at Canonical, panel by Till Kamppeter and the Canonical Gang (video) - Right in the time of the year of placement, when companies come to Indian universities to offer first jobs for those who complete their courses, I have hosted a panel with three Indian Canonical employees and we told about how we got to Canonical, how the selection process works, how it is to work from home for Canonical, everyone meeting twice a year for a week at Engineering Sprints and the fun of it, attending conferences, ... OpenPrinting OpenPrinting - We make printing just work! by Till Kamppeter (video, slides) - Here I have told how I got into free software and how I started OpenPrinting and what we are doing at OpenPrinting. CUPS 2.5 and 3.0 Development by Michael Sweet (video, slides) - Michael Sweet, author of CUPS, told about the next steps and future plans in CUPS development. CUPS 2.5.x adding features like OAuth2 support, wide-area DNS-SD look-up, multi-language support, ... CUPS 3.x completely restructuring (New Architecture), especially all-IPP without PPDs but also a more comprehensive library API, local server and sharing server, D-Bus printing, ... a lot of coding is needed, for CUPS itself, desktop integration, new PDF library, ... Contributors urgently needed. Demo of GNOME Control Center \"Printers\" module, by Mohit Verma (video) - Mohit showed his work on the \"Printers\" module of the GNOME Control Center, to prepare it for the New Architecture, supporting IPP print destinations and Printer Applications. Call for participation by Till Kamppeter (video) - And as we have seen here we have a lot of work and need people who want to contribute, so I made a call for contributions as a conclusion for the OpenPrinting track. Zephyr What is Zephyr? by Benjamin Cabé and Jonas Remmert (video) - Introduction into this free-software real-time operating system for IoT systems too small for running Linux. Zephyr Project: Supporting Sustainability by Kate Stewart (video, slides) - This talk, pre-recorded by Kate Stewart, VP Dependable Embedded Systemsof the Linux Foundation, shows where Zephyr gets actually used. Zephyr in Action: Real-World Product Development, interactive workshop by Jonas Remmert (video, slides, examples/exercises) - Jonas, speaking remotely, showed how to set up a Zephyr environment and run several examples in it. Attendees could try out everything on their own laptops and got on-the-spot help by Akarshan Kapoor. A successful workshop with remote speaker. Why BeST uses Open Source and Zephyr RTOS by Oliver Völckers (video, slides) - Success story of using Zephyr for monitoring wastewater removal from trains. Immutable distributions and sandboxed packaging Desktop Linux, as easy as a smartphone! Just in a Snap! by Till Kamppeter (video, slides) - Grown from the smartphone operating system Ubuntu Touch we got the universal sandboxed packaging format Snap, initially for Ubuntu Core, an immutable Linux operating system for IoT. Snap got established as packaging format for standard Desktop and Server Linux systems and Ubuntu Core got extended to Ubuntu Core Desktop, an all-Snap immutable desktop operating system. This talk explained how all this actually works. A sneak peak into the realm of immutable Linux distributions by Rudra Saraswat (video, slides) - Rudra, 14-years-old project lead of Ubuntu Unity, Unity 7, and blendOS, explains the principles of an immutable operating system and atomic updates how they work in blendOS. Your app everywhere, just in a Snap!, interactive workshop by Till Kamppeter (slides, virtual machine) -12 brave souls, not only my 3 colleagues from Canonical, stepped up to learn how to snap (package in Snap format) desktop applications in my workshop. I could not run the complete workshop, as we had only 1 hour, but give a good insight into the subject matter. One of the participants, Biswadeep Purkayastha, also one of our GSoC contributor candidates for 2023, started volunteering to snap for OpenPrinting. See more below. And sorry, this workshop was too interactive for recording ... Documentation The Fundamentals of Effective Technical Writing by Hrittik Roy (video, slides) - An introduction into technical writing, document types, organization of the document, examples, ... The slides are actually for a workshop, so while or after watching the video you can actually do the exercises. Can Documentation be fun? by Dimple Kariakose (video, slides) - Another approach to introduce the audience into the aspects of documentation, and as Dimple is in Daniele Procida's documentation team at Canonical, she follows Daniele's Diátaxis model. Recordings of the conference days Friday, Sep 8: Plenary OpenPrinting Track Zephyr Track Saturday, Sep 9: Plenary Nice comment by @manojkapoor9855 on the YouTube video of Saturday: A very informative talk show entitle as 'Opportunity Open Source' was organized By Akarshan Kapoor and his team mates of Kamand Prompt under the Guidance of Technical Secretaries Reetam Sir and Anurag Sir at IIT Mandi. Heartfelt Thanks to Mr. Till Kamppeter and Mr. Aveek Basu whom have arrived from Austria for such an informative session for 2 days Summit. Today on 9th September 2023 it was almost 9 Hours 15 minutes online tireless streaming on You Tube Channel. Thanks to all team members of Data Science & Engineering and Computer Science Students for taking such good initiatives for making Open Source Canonical, Ubuntu and Linux more visible and vibrant to all who seems to be interested. And thanks to Ban Jo (@Enry211) for adding a comment with links to the beginnings of all sessions to each video. From Mandi in northern India I directly went to Kochi in southern India, to the DebConf. Departing on Sunday morning (Sep 10) I arrived after 6 hours on the road (to Chandigarh Airport) and 4 hours of flight on Monday, Sep 11, 4am in the morning. And on Tuesday, Sep 12, right in the very first time slot my talk about Mandi was scheduled! So after taking some sleep up to lunch I had only the Monday afternoon to prepare the talk, and I also needed to do a semi-annual report for Canonical that afternoon ... So I was not able to attend any of the talks on Monday ... My 2 talks have actually taken place as planned and were a success, at least what the circumstances allowed, as unfortunately, the 3 conference rooms were far from each other, making it difficult to switch between them to get to the desired sessions. Especially the plenary room, in which my 2 talks have taken place, was outside the hotel and required a 5-min walk to get there, ending up with a near empty room most of the time. Here are the 2 talks and the slides and recordings of them: Opportunity Open Source conference in the IIT Mandi, India: Motivating people to be a part of us! video, slides, all files/photos This talk is about how we have organized the conference, the challenges, and naturally also the outcome and experiences with running it, having come right from there to the DebConf. Lots of photos! The New Architecture for Printing and Scanning on Debian video, slides, all files With the DebConf taking place right in the new cycle after the Bookworm release I tell the Debian developer community about the New Architecture of printing and scanning to help them switch the Debian distribution to the new IPP-only PPD-less realm. The event's full schedules have all recordings embedded in the talk descriptions now. Here are all videos and all slides, photos, and other materials. On Wednesday, Sep 13, right in the middle of the conference, there was a tourist day. Attendees could select 1 of 5 day trips in and around Kochi. One of the trips was a day at the beach with an option for kayaking. Unfortunately, there were less kayaks than they got reserved and one of the 2 persons who stayed without, Abraham Raji, entered the kayaking waters and got drowned by the streams. On the Debian web site: Abraham was a popular and respected Debian Developer as well a prominent free software champion in his home state of Kerala, India. He was a talented graphic designer and led design and branding work for DebConf23 and several other local events in recent years. Abraham gave his time selflessly when mentoring new contributors to the Debian project, and he was instrumental in creating and maintaining the Debian India website. R. I. P. Abraham Due to this, all sessions and the conference dinner on Thursday, Sep 14, got suspended, some got withdrawn by the speakers, others moved out to the following days using extra rooms. On Friday, Sep 15, in the morning was the funeral and so there the sessions got also suspended and buses provided for those who wanted to visit Abraham's familiy ~2 driving hours away from Kochi. As Rudra Saraswat attended the Opportunity Open Source in Mandi only remotely, because he was afraid of traveling to there due to heavy rain and landslides during the weeks before, I have suggested him to attend the DebConf to meet him there. I also helped him to get accepted by the DebConf's organizers with his last-minute registration. So I met him there only on Tuesday and Wednesday, as on Thursday he had to leave early in the morning already to not miss his visa appointment for the Ubuntu Summit 2023 in Riga. I wanted to do with him a spontaneous panel session about immutable operating systens, especially blendOS and Ubuntu Core Desktop, and live-stream it on Ubuntu OnAir, Wednesday night, as there was no other time slot left. So I told people at dinner that I wanted to do the session, so that they attend it, to get some live audience, and I prepared the conference room, especially set up a laptop with my camera and my microphones for the Ubuntu OnAir streaming, same configuration as in Mandi, as the video team of DebConf was not present for such a spontaneous session. Once completely done with the setup and ready for starting the stream, a person from the DebConf organizers entered the room, delivering the news about Abraham and we did not start our session ... Photos of the DebConf The schedules for the Ubuntu Summit have been published, and the two and a half days are packed with amazing sessions! And for displaying them more nicely, Philipp Kewisch, Canonical's Community Team manager has hacked Indico again, adding a horizontal view for the schedules, similar how you see the Electronic Program Guide (EPG) on a modern TV, with a line for each channel (room) and the time at the horizontal axis. If you have problems navigating, you can resort to the \"classic\" vertical view via the menu button in the upper left corner. My workshop \"Improving snap maintenance: automating tag updates\" will take place on Saturday, November 4, at 12:00 - 13:00 EET. As Heather Ellsworth has left Canonical, she will not be on the Ubuntu Summit. My co-speaker in the workshop will be Jesús Soto now. He is from the gaming squad in Canonical's Desktop Team and he already replaced Heather in my Snap workshop on the GUADEC 2023. The session description is already updated appropriately now. This month not much has happened in the GSoC. In Indian universities there have been the mid-semester exams and the placements have started. The placements are the way how students in their last year find their first employment after completing their courses. Indian companies who are hiring come to the universities, offer their jobs, and run tests and interviews. And in the IIT Mandi there was also the Opportunity Open Source. On October 13-15 there will be the GSoC Mentor Summit 2023. After 3 online editions due to the pandemic it is finally in-person again, taking place on the Google Campus in Sunnyvale, CA, where it already happened in 2018. It is somewhat smaller than the last editions before the pandemic, with only one instead of two guaranteed slots for representatives of each mentoring organization. I will attend, and also Deepak Patankar, mentor and former GSoC contributor for OpenPrinting. He was lucky getting his slot by the waitlist, through which slots not taken up are getting redistributed. As in the years before, the Mentor Summit will be a so-called un-conference, consisting of BoFs, spontaneously planned during the event. There will also be lightning talk sessions where each organisation could tell about exceptional contributors or other interesting things which happend related to the organization's GSoC participation. I plan to give a lightning talk about the Opportunity Open Source in Mandi. Now, in the last 3 months, we got only few bug reports, and a security vulnerability in CUPS, in code which got overtaken into libppd, and therefore the vulnerability is also there. To get the security fix into a release and 3 months being a long time after RC2 I am finally releasing 2.0.0 right now. Ubuntu 23.10 will ship with this release. libppd Postscript Parsing Heap Overflow (CVE-2023-4504) From the bug report: The ppd_scan_ps() function in the libppd code base provides functionality that scans through a string looking for the next Postscript object. When iterating through a string which contains an open parenthesis and ends with a single backslash (0x5c) character, the code incorrectly iterates forward a character without properly checking the bounds of the string resulting in a 1 byte read beyond the allocated heap buffer. This is fixed by adding the missing NULL check when, after a backslash was read, the character escaped by the backslash is read. Miscellaneous fixes A few other bugs got reported and fixed since RC2. These fixes are also included. See the lists in the original announcement. Michael Sweet has released PAPPL v1.4.0 which is a new feature release. Especially it adds the new create-printers operation, as API function and IPP request, to let the Printer Application automatically add queeus for any local printers which are supported by it. This function will also be called automatically the first time the Printer Application is run after its installation, so that just installing a Printer Application is usually all what needs to be done to set up a non-driverless printer. This also makes it easier to write Printer-Application-supporting printer setup tools, as (at least for PAPPL-based Printer Applications) one can add a button to auto-setup all supported ones under the auto-discovered printers. Here is a list of further feature additions: Added support for \"job-retain-until\" (Issue #14) Added new PAPPL-Create-Printers operation, and the PAPPL mainloop API now auto-adds local printers the first time a server is run (Issue #245) Added new papplDeviceRemoveScheme and papplDeviceRemoveTypes APIs to disable unwanted device types (Issue #259) Added support for suspending and resuming jobs at copy boundaries (Issue #266) Added support for server configuration files (Issue #279) Now preserve the paused state of printers (Issue #286) Updated the options sub-command to list vendor options and values (Issue #255) Updated web interface to show the age of jobs (Issue #256) Updated \"devices\" sub-command to have the PAPPL server find the devices instead of doing it directly (Issue #262) Updated default logging to be less chatty (Issue #270) Updated the Wi-Fi configuration page to support hidden networks. Updated the Wi-Fi configuration page reload time to 30 seconds. Updated TLS certificate generation to support more types of certificates and to use modern OpenSSL/GNU TLS APIs. The Snap workshop (slides) which I have given on the Opportunity Open Source in Mandi was a special success, as under the ~12 participants, one of them, Biswadeep Purkayastha, stepped up to voluntarily snap for OpenPrinting. He also was one of our GSoC contributor candidates for 2023, but did not get selected due to lack of contributor slots assigned to us by Google. He has already studied the rest of the workshop slides which we could not do at the conference due to the limited time, and also my \"Daemon Snapper's Workshop\" (slides) from the Ubuntu Summit 2022. And he familiarized himself with the new user daemon feature of snapd, in preparation to snap CPDB backends. Now he will work on creating a Snap for the CPDB backend for CUPS. On DebConf, when I have given my talk about the New Architecture for printing (video, slides), Michael from Nigeria came up to me and showed interest in updating the printer setup tool in the KDE Settings application for the new PPD-less all-iPP printing approach. I am in contact with him via Telegram and he is already studying the code base. Michael Sweet has presented his updated plans for CUPS 2.5.x and CUPS 3.x in his talk on the Opportunity Open Source (video, slides). It is not only about the all-IPP printing approach with support for classic CUPS drivers and PPD files going away so that we are required to support Printer Applications, but also there are interesting new features coming which should also get integrated into the desktop. Note that the support for Printer Applications by the desktop is absolutely required for CUPS 3.x, support for the other features is highly recommended, to get access to the full functionality of CUPS. Here are the new features and their desktop needs: Already planned for CUPS 2.5.x: Wide-area discovery of network print destinations via DNS-based DNS-SD Print destination access outside the scope of DNS-SD discovery, by specifying the IPP destination(s) in a configuration profile - Profile setup UI in setup tool OAuth2/OpenID authentication - Authorization UI in print dialog, token registration in setup tool? Localization: Use Weblate to gather translations, generate multi-language PPD files, provide *.strings files for shared printers - No desktop integration needed, client just tells their UI language to server, CPDB CUPS backend should already do that. Planned for CUPS 3.x Separation of local and sharing server - In setup tool show only functionality for CUPS daemon type in use Printing via D-Bus with local server - Access to CUPS also via D-Bus, should get implemented in libcups3, CPDB should use correct libups APIs Michael Sweet also writes (on his last slide): CUPS 3 - Challenges Much broader scope and integration than the original CUPS work Desktop support - need to uplift GNOME/KDE/XFCE desktops to new D-Bus API for printing, authorization, consent UI Need developers to work on the local and sharing servers, desktop UI/services Can probably use/adapt PAPPL code for the core server bits Much of the print dialog work can be repurposed Probably have existing authorization/notification UI we can use Graphics libraries - current PDF tools/libraries have problematic licenses or other limitations For all this we need contributors, not only for desktop integration but also for coding on CUPS itself. We should also post GSoC project ideas for coding on CUPS 3.x. Planned (estimated) release dates: CUPS 2.5.x (release manager: Till Kamppeter) CUPS 2.5b1 - November/December 2023 CUPS 2.5rc1 - January/February 2024 CUPS 2.5.0 - February/March 2024 Estimated Ubuntu release: 24.04 LTS or 24.10 CUPS 3.x (release manager: Michael Sweet) libcups 3.0b2 - November/December 2023 libcups 3.0rc1 + cups-local 3.0b1 - March/April 2024 cups-sharing 3.0b1 - September/October 2024 Estimated Ubuntu release: 25.04 CUPS Snap Not treated in Michael's talk, but CUPS 3.x has also impact on the CUPS Snap, caused by the 2 different server types. The snapping of CUPS as we have it now will most probably be applied to the sharing server, which is very similar with CUPS 2.x The Snap of the local server will get simpler, especially It is a user daemon It does not provide IPP print destinations to the network, so it needs less interfaces (for example no network-bind, avahi-observe instead of avahi-control). The \"cups-snap\" repository will get discontinued and folded into \"cups\" (2.5.x) and \"cups-sharing\" (3.x). snapd needs to correctly prioritize to which CUPS Snap's slot the interfaces cups and cups-control of client Snaps get auto-connected."
+ },
+ {
+ "id": "post:OpenPrinting-News-September-2024",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - September 2024",
+ "url": "/OpenPrinting-News-September-2024",
+ "headings": [
+ "cups-browsed remote command execution vulnerability overhyped",
+ "Festa do Software Livre/UbuCon Portugal 2024",
+ "Ubuntu Summit 2024 in the Hague",
+ "Google Summer of Code 2024"
+ ],
+ "tags": [],
+ "snippet": "cups-browsed RCE vulnerability overhyped, Festa do Software Livre/UbuCon Portugal 2024, Ubuntu Summit 2024, GSoC 2024",
+ "content": "Most impactful in September were the security advisories reported for cups-browsed, starting with the report of a remote command execution vulnerability discovered by security researcher Simone Margaritelli and his post about it on X (formerly Twitter) before the official disclosure made it overhyped and main subject of bloggers, podcasters, and YouTubers. In the end it turned out to be much less harmful than was the initial impression suggested. I have been on the Open Source Summit Europe this year (see last month's news), as it was taking place in my city, in Vienna. I also have given a talk about OpenPrinting there, but recordings are not yet released. And now I am also approaching the next events. At first I am following an invitation from Diogo Constantino from the Portuguese Ubuntu Local Community, giving talks on the Festa do Software Livre in Aveiro, Portugal which hosts the UbuCon Portugal 2024 as one of its tracks, a conference held primarily in Portuguese language. Shortly after, I will be in the Hague in the Netherlands for the third Ubuntu Summit, where I am again member of the organization team, but I will also present, together with the Snapcrafters, on a booth and in two workshops. Our GSoC contributors have continued with their work, approaching the completion of their projects. And they have written about their work again. So let us see what happened at OpenPrinting in September ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat On September 5 we got a GitHub security advisory (GHSA) on cups-browsed about a remote code execution. It is possible to create an emulation of an IPP printer with forged metadata to make cups-browsed auto-generate a print queue and the PPD generator of libcups or libppd create a PPD with added lines so that the foomatic-rip filter gets used and the PPD defines a filter command line for foomatic-rip which is supplied by the attacker. So we have a remote code execution (RCE) vulnerability. The reporter, Simone Margaritelli (aka evilsocket), started investigating when he discovered that cups-browsed accepts UDP packets on port 631 from any source to trigger a get-printer-attributes IPP request. He then found further bugs leading up to the remote code execution. He posted on X (formerly Twitter) on September 23 that he recently reported a severe security issue, an \"Unauthorized RCE on all GNU/Linux systems)\" with a CVSSv3 score (agreed on with Canonical and Red Hat) of 9.9 of 10, but not telling anything about that it was his report about cups-browsed. He also told in the post that he has spent 3 weeks on the investigations, and that a disclosure date was agreed on with the developers. The message got hidden shortly after, but one can still read it on some archiving sites. Seth Arnold of Canonical's security team made me aware of this X message on Tuesday, September 24, and this started continues conversation of me with the security team on the Canonical-internal chat, along with already ongoing conversation on GitHub and VINCE. On Thursday, September 26 I read on VINCE that the vulnerability has leaked and so we had to agree on a quick disclosure. Instead of on the originally planned disclosure on October 6 we agreed to disclose still on September 26, at 20:00 UTC. Canonical's security team has acted immediately to quickly apply the patches which Michael Sweet (author and maintainer of CUPS) had already prepared for CUPS, cups-browsed, libcups-filters, libppd, and cups-filters (in the time from the first report until then I was some days off and I was also on the Open Source Summit Europe, thanks, Michael Sweet, for stepping in, also thanks to Zdenek Dohnal from Red Hat) to the appropriate in all supported Ubuntu versions, so that at the time of disclosure most fixes were already in place. They also reported in an Ubuntu blog. They tell users what to do, from turning off cups-browsed or at least its legacy CUPS browsing support to updating their systems as the fixes were already available. Thanks a lot to Seth Arnold, Marc Deslauriers, Diogo Sousa, Mark Esler, Luci Stanescu, and more. At the time of disclosure there appeared tons of posts on Mastodon about this subject matter and I have given several answers. A good and detailed description of the vulnerability comes from Simone himself in his blog. Thanks to Simone Margaritelli for the detailed investigation and also the detailed description about how the vulnerability works. Investigators of this kind are really needed to keep free software on a high security level. This vulnerability could never have been found by automated methods like fuzzing or code analysis. Some days later, Peter van Dijk (aka Habbie, also thanks for your report) has reported another vulnerability of the legacy CUPS browsing support as a GHSA on cups-filters. It was possible to send a well-formed CUPS broadcast packet to UDP port 631 of cups-browsed, but with a port 80 URL of a web site which redirects on the port and then cups-browsed falls into an infinite loop sending HTTP requests which can only be stopped by kill -9. This vulnerability got independently discovered and treated in detail by Akamai and posted in their blog. Overhyped The X post by Simone really overhyped the vulnerability. Attacks from the internet are not very probable due to the fact that servers on the internet do not have cups-browsed and CUPS installed and CUPS/cups-browsed setups usually exist only in NAT-protected local networks with desktop machines and print servers. And the remote code execution is also rather restricted, as CUPS filters are not running as root, but as the system user \"lp\" which cannot even read user's home directories. In addition, the remote code execution only happens when a user actually prints a job on the fake printer. Actually assigned scores ended up between 8.4 and 9.1. Fixes Fixes are already available in the appropriate upstream repositories: cups-browsed, libcupsfilters, libppd, cups-filters, cups. Especially we have removed legacy CUPS browsing (and also LDAP) support from cups-browsed and added verification of the content of IPP responses and of content filled into PPD files, to not contain control characters like newlines. These changes are sufficient to prevent the reported exploits. We did not yet add any protection against PPD files defining malicious filter command lines for foomatic-rip. A possible solution we are discussing is providing a hash database for all command lines in the existing PPD files but also isolation/encapsulation/containerization of Foomatic-based filtering. See more info and a list of all CVEs and patches in our separate News Flash. In a few days I will depart to Portugal, exactly to the city of Aveiro, close to O Porto. Diogo Constantino, who is leading the Ubuntu Local Community (LoCo) Portugal, has, as he interviewed me on the Podcast Ubuntu Portugal #310, invited me to come to the event. It is the Festa do Software Livre, a 2-day conference with a main track and several sub-conferences co-located by different open-source organizations: Drupal, Flutter, WikiMedia Portugal, Inêrcia, and the UbuCon Portugal. Here are the schedules: Festa do Software Livre, UbuCon Portugal I will give 3 sessions during the event, all in Portuguese: OpenPrinting - A boa impressão do software livre Fri, October 11, 14:00 - 15:00 WEST, Anfiteatro IV (Main Track) I will give an overview of our work. Going through OpenPrinting’s history the components of the printing infrastructure of modern Linux (and other Posix-style) operating systems will get shown. How did the Internet Printing Protocol (IPP) with the printing system CUPS being an implementation of it simplify printing a lot? The printer driver challenge, good and bad cooperation with manufacturers, packaging and distributing ... Desktop integration, GUI toolkits, print dialogs, setup tools, portals, ... Especially also the New Architecture of all-IPP printing and scanning and also the integration in immutable OS distributions will be treated ... And in the end I will also quickly tell about Microsoft going all-IPP in Windows ... This is the same talk as I had given on the FOSDEM, on the Opportunity Open Source, and on the Open Source Summit Europe, but in Portuguese language. And I got a generous time slot of 60 min, meaning that we have a lot of time for questions, answers, and discussion. Linux para desktop, fácil como um smartphone! Graças ao Snap! Sat, October 12, 09:30 - 10:30 WEST, room 4.1.02 (UbuCon PT) The motivation, advantages, and concept of the sandboxed, immutable Snap packaging format is shown and how it is used to make up immutable all-Snap OS distros, the IoT distro Snap was originally designed for, Ubuntu Core, and the easily usable and maintainable Ubuntu Core Desktop. This is the same talk as I had given on the FOSDEM, on the GUADEC, and on the Opportunity Open Source, but in Portuguese language. And here I also got a generous time slot of 60 min, meaning that we have again a lot of time for questions, answers, and discussion. O seu aplicativo para todo mundo! Graças ao Snap! - Oficina interativa Sat, October 12, 11:00 - 13:00 WEST, room 4.1.02 (UbuCon PT) Vamos snapear! (Let's snap!) - Interactive workshop to learn how to package applications in the sandboxed, immutable package format Snap to publish them in the Snap Store. Attendees will create simple Snaps in several hands-on exercises. This is the same workshop as I had given on several other conferences, but in Portuguese language. And here I also got plenty of time, 2 hours, whereas on other events I got only 60 or 90 minutes. I also do not need to give a long introduction as I will give my talk right before. So we have a lot of time for doing the exercises. And if you want to participate, do not forget to prepare your laptop before. Most probably the sessions will get streamed, so that one can also attend them remotely. The third Ubuntu Summit is only little more than two weeks away from us (on October 25-27). The schedules are published. As announced already we will have one plenary room for talks and an additional room for workshops. And we will have an exhibition floor with 26 booths of open-source organizations. As already told last month, I will be presenting Snap together with Merlijn Sebrechts, Heather Ellsworth, Soumyadeep Ghosh, and Lucy Llewellyn from the Snapcrafters. We will have a booth and the following two workshops: Crafting snaps quickstart guide 101 Sat, October 26, 16:30 - 17:30 CEST, room Princess Ariane (Workshop room) This is an interactive workshop where you learn snapping (package applications as Snaps), based on the original workshop given by Heather Ellsworth and me on several other conferences. You will make Snaps of simple GNOME and KDE applications on your laptop. You will use interfaces for defined communication with the outside world, content Snaps providing common libraries (GNOME, KDE ffmepeg, ...), learn several methods how to make software running in a sandbox, build and run the applications, ... And our team will be in the room and help you on all your questions and doubts ... How to build and test your snaps automatically using GitHub actions Sun, October 27, 14:00 - 15:00 CET, room Princess Ariane (Workshop room) Original description: In this workshop we will showcase how one can use GitHub actions to automate the building and testing of Snaps. We will show users how they can use the already created CIs directly. Or, how they can modify and change those according to their needs. We'll show how to run VMs inside the GitHub runners using ghvmctl and run GUI apps. We will also have a workshop created by our OpenPrinting GSoC OSS-Fuzz project team. The 2 mentors George-Andrei Iosif and Dongge Liu will be on the Summit to give Fuzzing in the open: Integrate your project in OSS-Fuzz for continuous fuzzing Sat, October 26, 11:30 - 13:00 CEST, room Princess Ariane (Workshop room) They will teach how you can make your free software application project more stable and more reliable by using Google's OSS-Fuzz service to make your code undergo continuous fuzz testing. They will explain what fuzz testing is and how OSS-Fuzz works with their work on OpenPrinting as example, how to write Fuzz harnesses, and how to make use of the test results to fix crash bugs (which are often possible vulnerabilities). Unfortunately, our GSoC contributor, Jiongchi Yu will not be able to come to the Hague. If you want to attend these workshops (or any other workshop on the Summit) please open the session description by clicking the session in the timetable follow any preparation instructions there and/or also download the slides (under \"Presentation Materials\" at the bottom) and follow preparation instructions in there. Also you will have the slides at hand to copy and paste any commands and examples. Preparations are usually things like installing the needed operating system/virtual machine and needed software. Our GSoC contributor Akarshan Kapoor is on the Ubuntu Summit again, but not with a talk about Scanner Applications. Doing his second exchange semester in Germany, inspired by the technology used in the trains of the German railway he will give the talk Flush with Innovation: Revolutionising Train System Toilets with Embedded Technologies Sun, October 27, 14:30 - 14:55 CET, room KWA (Plenary room) Original description: This talk will cover updates on the hardware, firmware, and software developments of the Pump Monitor, a unique device currently used by Deutsche Bahn, leveraging recent Zephyr RTOS (real time operating system) components like zbus. The core of the talk will delve into the architecture and development path of our Open Source IoT LwM2M and Django server, highlighting its robustness, flexibility, and user-friendly interface. Additionally, the session will address sustaining cloud infrastructure through Open Source solutions, ensuring reliability and security via protocols like LwM2M and CoAP, and promoting the benefits of Open Source adoption in real-world applications. The project utilizes a local server-based IoT system leveraging the Lightweight Machine to Machine (LwM2M) protocol, enabling communication between IoT devices running Zephyr RTOS and a backend server using Django, operating fully within a local environment without external cloud services. And if you want to attend any live-streamed sessions (talks in the plenary room) remotely, note that in the night between the Saturday and the Sunday of the Summit the daylight saving time in Europe ends, meaning that on Friday and Saturday we have CEST (UTC+2) and on Sunday we have CET (UTC+1). See you all in the Hague! Rudra Pratap Singh has officially completed his project of OCI containerization of CUPS and the Printer Applications, but he still does some testing and we will need to make his work available. For this we will need to create a DockerHub account for OpenPrinting and also transfer his work to be hosted in the OpenPrinting GitHub. The other 10 contributors are all nearing the completion of their projects. Most have gotten additional deadline extensions due to important events interrupting their project work, but they and their mentors are reporting that they are doing well. As the second contributor Biswadeep Purkayastha, adding CPDB support to LibreOffice's print dialog, will reach the finish line. He has already submitted his final report. And here are the write-ups: CPDB support for the LibreOffice print dialog Contributor: Biswadeep Purkayastha Work Product This month, I worked on resolving an issue where user-set default values were not being properly applied in CPDB. The problem occurs when user default settings are defined using lpoptions. CPDB fails to recognize these newly set user defaults as the actual defaults when retrieving options. Upon further investigation, I discovered that CUPS is not returning the correct default values when queried by CPDB, indicating the issue likely lies with CUPS. I've submitted a detailed issue report on the CUPS GitHub repository and am currently awaiting a response from Michael Sweet. In the meantime, I am focusing on wrapping up my project and fine-tuning minor details in preparation for my final submission. WIP Pull Request. Integrating C-based OpenPrinting Projects in OSS-Fuzz Testing Contributor: Jiongchi Yu In September, the OpenPrinting fuzzing project integrates more harnesses for libcupsfilters and cups-filters. We upgraded the harness for cups-filters from version 1.X to the latest 2.X to better align with the long-term development goals of OpenPrinting ecology. However, due to the current OSS-Fuzz base image lacking support for operating systems higher than Ubuntu 20.04 and the corresponding dependency libraries, the ClusterFuzz compilation for the two projects remains failing. We are actively communicating with Google developers to resolve this issue. Additionally, we have triaged 27 identified issues found by existing OSS-Fuzz harnesses and submitted relevant issue reports and security advisories for the confirmed bugs. Moving forward, we are working on involving more LLMs efforts to help generate effective fuzz drivers and towards more secured OpenPrinting projects. CPDB support for the print dialog of Mozilla Contributor: Kushagra Sharma Progress has been made in the integration of CPDB. After successfully setting up the dummy print backend, I have now transitioned to replacing the placeholder calls with CPDB APIs. These APIs are being used to populate the print backend in Mozilla, enabling more robust print functionality. This phase involves ensuring that the CPDB integration is seamless and interacts correctly with other components. I'm also focused on fixing import issues with CPDB and testing edge cases and across different environments. As this work nears completion, I anticipate submitting a pull request shortly for review, which will mark an important milestone in this project. Kushagra created a good collaboration with the Mozilla developers now, via my original feature request. Desktop Integration: Update system-config-printer for the New Architecture of printing Contributor: Shivam Jaiswal I have written the asynchronous service discovery code and created a basic UI structure for discovered services. I have added buttons to list all discovered services. My next goal is to merge the final code for service discovery into the main GitHub repository of SCP. After that, I will finalize code for add printer part. Make a native printer Application from Gutenprint Contributor: Ankit Pal Singh Currently working on status callback function, documentation and the job flow. Fixing some minor issues, once this is done then I will start with pappl backend implementation. User interfaces for using OAuth2 with printers and scanners Contributor: Shivam Sharma This month the major focus was on improving the security levels in OAuth code and merging OAuth code with CPDB. I implemented the auth.h file and called the auth.h file in the print-backend.c file and also made a few changes in makefile which helps to merge the auth code with the CPDB backend. Currently I am working on the gtk of OAuth. Also testing the code with different authentication url. After finishing this task the focus will be on adding more functionality and improving the way of authentication which will be made easier for the clients to authenticate themselves. The changes will be made to improve the GTK and level of authentication. Converting Braille embosser support into a Printer Application Contributor: Arun Patwa In September Month, I was majorly working on integration of braille embosser support into the PAPPL Application for the brf file. Got stuck into embosser support for long time. I had done some testing for the conversion and also refractored the code. I aim to complete the integration of other filters in the upcoming weeks and also testing of braille embosser support for them. Replace QPDF by PDFio as PDF manipulation library in libcupsfilters Contributor: Uddhav Phatak I have sucessfully ported all the files in the cupsfilters/pdftopdf/, and all tests are passing with the make check. The remaining three files are pwgtopdf.cxx, pdf.cxx, and pclmtoraster.cxx. In this, I have already converted half functions of pclmtoraster.cxx and pdf.cxx. Soon, all the code will be converted to C and the dependency from the QPDF library would be removed completely. Here is Uddhav's work on GitHub."
+ },
+ {
+ "id": "post:OpenPrinting-News-Sovereign-Tech-Agency-is-investing-in-OpenPrinting",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Sovereign Tech Agency is investing in OpenPrinting",
+ "url": "/OpenPrinting-News-Sovereign-Tech-Agency-is-investing-in-OpenPrinting",
+ "headings": [
+ "I was working at Canonical for a long time ...",
+ "... looking for a new solution ...",
+ "... the Sovereign Tech Agency ...",
+ "... Now I am working at OpenPrinting",
+ "Thanks"
+ ],
+ "tags": [],
+ "snippet": "I am covered to work on OpenPrinting full-time until end-2026",
+ "content": "Also announced on Mastodon and on LinkedIn Mid-May, on the last Engineering Sprint of Canonical I got the notice that I got laid off by Canonical, after having been with them for near 20 years. The contract ended 4 weeks after that, mid-June and I got 3 months of my monthly payment as indemnity. See also my earlier post. I naturally wanted to continue OpenPrinting as my living and not have to take an arbitrary job and continue OpenPrinting as a hobby. So my first efforts were to make OpenPrinting a full sub-organization of the Linux Foundation so that it can handle money, to be able to get sponsorships, especially also via membership tiers. Our idea here is to get sponsored by the companies who most benefit from OpenPrinting, like major OS distributions, computer manufacturers who make laptops and desktops with Linux, printer manufacturers, cloud groupware/office developers, ... But getting this up and running takes time. We already tried to get a full sub-organization before my lay-off, but the process always got stuck. Now I see the chance that we will complete it due to its urgency. We are working on creating the Technical Charter which is required, and I have also already lined up the needed Technical Steering Committee. The people from the Linux Foundation also want to help me to find the sponsors. Many of the candidates are already Linux Foundation members and they could take up an OpenPrinting membership in addition. In parallel I tried to make people know about my situation. I posted a thread on Mastodon/the Fediverse and asked for boosting, and the thread (at least its initial post) got boosted 1187 times (Thanks to you all! I have never seen any other post in the Fediverse which got boosted that much)! I also (finally) filled in my LinkedIn profile and also created a profile for OpenPrinting. I interacted with a lot of people via LinkedIn, invited people who could help to connect with me on LinkedIn and then I asked them for help. One was Tara Tarakiyee from the Sovereign Tech Agency (STA), an organization of the German government which supports open source developers and organizations whose work goes into development an maintenance of software which is essential for IT and internet infrastructure and therefore of public interest. I told him about OpenPrinting and my situation and whether the STA would support me. Then he asked me for details of my work and offered me support from the STA. I had to express my (or OpenPrinting's) needs in work hours and money (the first time I had to do such a thing in my life) and within a few weeks my proposal got accepted and now the Sovereign Tech Fund invests in OpenPrinting to sustain me at the same monthly compensation as I got from Canonical (by average) until end of 2026. Here is the page about their investment in OpenPrinting and it got also mentioned in their October Newsletter. Yes, when somebody asks my where I am working, I will say its OpenPrinting, I am now self-employed as its lead. Note that the STA did not hire me as an employee, but they hired me as a freelancing engineer, paying my work hours which I am billing to them. I am also continuing to pursue establishing OpenPrinting as a full sub-organization of the Linux Foundation, to be open for further funding of the organization and this way to assure its continuation and so printing to just work also in the future. I want to express my thanks for all the help and support I have gotten in this situation, first of all Tara Tarakiyee, Hanno Zulla, Paloma Oliviera, and probably also others from the Sovereign Tech Agency for the quick arrangement of the investment. I also want to thank Kate Stewart, Todd Benzies, Michael Dolan, Scott Nicholas, and Daniel Scales from the Linux Foundation for the great support to make OpenPrinting a full sub-organization of the Linux Foundation and to help us to get funding. And big thanks to those who have joined the Technical Steering Committee of OpenPrinting with me: Michael Sweet, Aveek Basu, Zdenek Dohnal, and Thorsten Alteholz. Special thanks to all the people who have worked and are working with me at OpenPrinting to make OpenPrinting the strong organization which it is now and so make printing just work (I give some names, there are many more): Michael Sweet, Kurt Pfeifle, Grant Taylor, Ira McDonald, Ulrich Wehner, Ian Murdock, Mark Shuttleworth, Aveek Basu, Zdenek Dohnal, Alexander Pevzner, Johannes Meixner, Didier Raboud, Thorsten Alteholz, Deepak Patankar, Sahil Arora, Akarshan Kapoor, Soumyadeep Ghosh, Sanskar Yaduka, ... Thanks a lot to the organizers of the Google Summer of Code, especially Stephanie Taylor, Carol Smith, and Leslie Hawthorn to make this great program running which helped us to get a lot of awesome developers for our community. Also thanks for all the coverage on the Internet, especially to Heather Ellsworth (Ubuntu Indaba), Monica Ayhens-Madon (Ubuntu Office Hours), Michael Tunnell, Jill Bryant, and Ryan (Destination Linux), Joe Ressington and Graham Morrison (Late Night Linux), Noah Chelliah (Ask Noah), Diogo Constantino (Podcast Ubuntu Portugal), Liam Proven (The Register), ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions"
+ },
+ {
+ "id": "post:OpenPrinting-News-Tech-over-Tea-300-Brodie-interviews-Till-Kamppeter",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Tech over Tea #300 - Brodie interviews Till Kamppeter",
+ "url": "/OpenPrinting-News-Tech-over-Tea-300-Brodie-interviews-Till-Kamppeter",
+ "headings": [
+ "The full episode",
+ "Highlight clips",
+ "Why Did Canonical Part With The Leader Of Linux Printing",
+ "The Future Of OpenPrinting",
+ "OpenPrinting CUPS vs. Apple CUPS",
+ "He's Why Printers Work On Linux",
+ "The State Of Linux Printing Before CUPS",
+ "The Long History Behind OpenPrinting On Linux"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/-6fPfwixNLk/hqdefault.jpg",
+ "snippet": "Everything about OpenPrinting, history, what we are doing, funding and the future, ...",
+ "content": "Many of you know the YouTuber Brodie Robertson, mostly by his main channel, just named Brodie Robertson where he is talking about and discussing the latest news and incidents in the FOSS world (ex.: \"Can't print on Tuesdays\") and often causing controversial discussions in the comment sections. But he has also a second channel, Tech over Tea, where he does, once a week, an interview with a person who is doing important things for free and open source software. Back in April this year, Brodie had posted on Mastodon asking for nominating potential guests for future episodes of Tech over Tea. I had taken that opportunity then and sent an e-mail to Brodie: I have seen now that you are asking for nominations for guests in \"Tech over Tea\" on Mastodon. And I know that the person who is leading OpenPrinting is one of these project developers interested to be guest in your show. So I am nominating him with this e-mail, yes myself. ... He liked the idea and accepted my offer and we aimed for producing and publishing the show before the northern-hemisphere summer holidays. Unfortunately, in May, the incident with Canonical happened and I did not know how things with me and with OpenPrinting will go on in the future, and in this situation I did not want to give the interview, so I asked for postponing the production until the issue gets sorted out ... ... when I got the investment of the Sovereign Tech Agency and so being mostly recovered, I mailed to Brodie again and told him that I am now ready for producing the video, aiming for publication well before the end-of-year holidays. So we did it and it came out great! I got many likes and some questions on the social media where I linked the videos and on the videos themselves on YouTube. I answered all the questions, liked many a and disliked a few comments, and I also got a lot of likes for that, also from Brodie. Have fun watching the interview (below) and feel free to comment and ask your questions in the YouTube comments ... And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and (new) on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Brodie's announcement on Mastodon: Today we have the legendary @till (Till Kamppeter) on the show, the man keeping printers working on Linux to talk about his decades of experience in this space This is the full interview, in 2 hours I am telling what we are doing at OpenPrinting, how it all began 25 years ago, and also about my layoff from Canonical and how I am recovering (a big thanks again to the Sovereign Tech Agency!) Currently 29 comments on YouTube, including all answers I have also posted on LinkedIn about it, and got 30 reactions and 1 repost! Is watching/listening to a full 2-hour Tech over Tea episode not your cup of tea? Do not run for a coffee now to keep yourself awake for the 2 hours, but just watch the most breaking news in it which Brodie has separated for you, as usual one on each of the 6 days after the release of the full episode. The first of them is about the incident with Canonical and how I am recovering, and fairly well (thanks again, Sovereign Tech Agency) as I am covered until end-2026 now! 1 comment on YouTube The second one is about the future of OpenPrinting and how it will get continued on the long run. This one is not only about what happened to CUPS after Michael Sweet had left Apple, but I also tell about CUPS 3.x, the New Architecture, classic drivers and PPDs getting dropped, driverless printing, how it began and how it works, and that driverless printing even can save your legacy printers under Windows ... 9 comments on YouTube, including all answers This clip is about what OpenPrinting is, how we make use of the Google Summer of Code, how classic printer drivers were developed by reverse-engineering, how I made them easily available for everyone and about IPP ... 28 comments on YouTube, including all answers Now it is about my time as system administrator in the Theoretical Physics department of the University of Bayreuth in Germany, from 1997-2000, in the pre-CUPS era, the dark years of LPD ... 1 comment on YouTube The last one is about how I discovered CUPS and how after that I got discovered for making CUPS what it is today."
+ },
+ {
+ "id": "post:OpenPrinting-News-The-Winter-of-Code-4.0",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - The Winter of Code 4.0",
+ "url": "/OpenPrinting-News-The-Winter-of-Code-4.0",
+ "headings": [
+ "The project ideas we have on offer are:"
+ ],
+ "tags": [],
+ "snippet": "OpenPrinting is mentoring organization in the WoC 4.0! Apply for doing a 1-month project until Dec 31!",
+ "content": "Some weeks ago I got e-mail from the Google Developer Groups (GDG) on Campus IIIT Kalyani inviting me as Google Summer of Code (GSoC) org admin for the Linux Foundation to participate in the Winter of Code (WoC) which they are organizing. Actually, they seem to have invited all the GSoC mentoring organizations, as I got the same e-mail also via the LibreOffice developer mailing list. The Winter of Code is an Open Source contributor program inspired by the Google Summer of Code, but with only a 1-month coding period and no stipends for contributors and mentors. It is organized by folks at the Indian Institute of Information Technology Kalyani, but as they have approached other GSoC organizations, too, it is not based on my relationships with India that they invited me. The program is performed for the 4th time this year but I only got note this year, by the mentioned e-mail. I decided to participate with 3 small projects to try out the program and see whether it attracts people to join our developer community and also for potential GSoC contributors, by giving us nice code samples by their work on our WoC projects. Add support for JPEG-XL as input format Mentors: Uddhav Phatak, Till Kamppeter JPG-XL is a more modern successor of JPG, supporting high color depths (>8 bits per color), HDR, more flexibility with compression rates, ... to allow for high-quality image files in a standard format. A free software library supporting this format is available, libjxl. Therefore we should add support for this format and try to carry on to the printer as much as possible of the image quality, especially the higher color depth, as the PWG and CUPS Raster support up to 16 bits per color. Create an OCI container image of ipp-usb Mentor: Rudra Pratap Singh As we have OCI container images for CUPS and for the 4 retro-fitting Printer Applications at OpenPrinting, we also want to have an OCI container image of the IPP-over-USB daemon ipp-usb. This way we can provide the full printing stack as OCI container images, ideally on DockerHub. This allows to add printing functionality to most immutable distributions, and also to distributions in general, using official packages of OpenPrinting. Apply OSS-Fuzz to cups-browsed Mentor: Jiongchi Yu We have deployed OSS-Fuzz on CUPS (2.x), libcups (of CUPS 3.x), libcupsfilters and cups-filters now to efficiently discover crash bugs and vulnerabilities on these components. But recently, we had a security vulnerability on cups-browsed, which is not covered by OSS-Fuzz. Therefore we want to apply OSS-Fuzz here, too. We will also accept your own project ideas. If you are interested, please register as a contributor on the WoC web site. Last day for registering is December 31. Until January 12, you will need to submit your proposal then and coding period is January 20 - February 20 (see complete schedules). It is not required to be a student or an open-source beginner, everybody can participate. Please also check out the FAQs. A well-done WoC project can also be your launchpad to the GSoC as we will for sure give you higher priority in the GSoC contributor selection process then. We are looking forward for your participation. And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-UbuCon-Asia-2025-in-Kathmandu-Nepal",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - UbuCon Asia 2025 in Kathmandu, Nepal",
+ "url": "/OpenPrinting-News-UbuCon-Asia-2025-in-Kathmandu-Nepal",
+ "headings": [
+ "Why attending a conference in Nepal?",
+ "Arriving in Nepal",
+ "Day 1",
+ "Day 2",
+ "The day trip",
+ "And off to India ...",
+ "Thank you",
+ "Links"
+ ],
+ "tags": [],
+ "snippet": "Organized by the Ubuntu and GNOME communities of Nepal",
+ "content": "This year we have done the third Opportunity Open Source in India, and originally having planned to co-host the first UbuCon India with it we had settled it on the weekend right after this year's UbuCon Asia which has taken place on August 30-31 in Kathmandu in the neighboring country Nepal, to make it possible that speakers could be on both events with only one round trip. But even with the co-hosting not having worked out, and also with my talks already being accepted, I have done this round trip and attended UbuCon Asia before running the Opportunity Open Source 3.x in the IIT Kanpur in India. My trip from Vienna to Kathmandu went through the beautiful Doha Airport in Qatar, via Qatar Airways. With 2 ~5-hour flights with a meal ~2 hours into each flight and the stop-over in the middle of the night I had not much sleep when I arrived in the morning of Friday, August 29, the day before the conference started. After landing and going through immigration (was quick as I already applied for my tourist visa online before traveling) I met Mauro Gaspari (Ubuntu Community Team at Canonical) and Dimple Kuriakose (Technical author at Canonical) at the baggage claim and we shared a taxi to the hotel. The hotel was in the Thamel district. There are many streets with small stores selling handcrafts and souvenirs and there I bought some stuff for my wife. In the evening I met Soumyadeep Ghosh (Snapcrafters) and talked with him about his GSoC project (Blog) of Python bindings for libcups3 and he brought in the idea of creating programming-language-independent APIs for printing and also of oxidizing (converting to Rust) libcups and CUPS as future work at OpenPrinting. I told him that for oxidizing on one side we will have a lot of work and the risk to introduce new bugs but on the other side we have rather low coverage with fuzz-testing the C code, so replacing it my memory-safe Rust could be the better solution. On Saturday, August 30, the UbuCon started. Arriving at the venue one saw a long line of people waiting. It was for the registration desk in front of the building, for the more than 300 people just attending the conference, but not giving a talk or a workshop. Speakers got shown a hidden room inside the building where they could pick up their badges. The organizers (a sponsor?) provided us with highly sophisticated all-plastic badges, which were not that easy to assemble, especially removing the protective plastic film. But this way the sponsors assure that, if a badge gets into the environment, their logos will still be seen in centuries ... After the introduction from the organizers the first session was the keynote presentation by Dimple Kuriakose, \"Confidential Computing Demystified: An in-depth look into CVMs\" (Slides), explaining all the measures in the Ubuntu operating system to keep the system secure and protect the data and privacy of the users. And since the Ubuntu Summit 2022 there is practically no conference any more without workshops, and the first workshop this time was \"Crafting snaps quickstart guide 101\" (Slides, Exercises), by Soumyadeep Ghosh and me. The room was nearly full, showing that there are many people interested in packaging applications in the Snap format. In total there were 6 workshops throughout the 2 days: Snap, LXD, AppArmor, Local AI/LLMs, Documentation on GIT, and air-gapped Ubuntu. There was lunch in the cafeteria of the college, free of charge for speakers and included in the conference fee for general attendees. Organizers redirected speakers to early and late hours during the lunch break for them to avoid long waiting lines. In the afternoon Akarshan Kapoor, GSoC contributor for OpenPrinting in 2023 and 2024 presented his GSoC work in the talk \"Scaniverse Universal Scanner Drivers: One Solution for Every Distro\" (Slides). My second time on the stage was also on the first day. I have participated in the panel session \"Growing Ubuntu and FOSS Community - and yourself, Locally and Globally\", hosted by Yush Pokharel and with Aryan Kaushik, Rashika Karki, and me as guests. Everyone told here about the creation of their projects and building their communities, and the audience could ask questions afterwards. The second day, Sunday, August 31, started for me with the exhibition area. Despite being the rainy season in South Asia, the booths were set up on an open-air space, each of them was at least under a tent to protect them from rain. Especially I visited the DeepComputing booth, in the hope to meet founder Yuning Liang, but he was not there. I also wanted to try out the second-gen RISC-V motherboard for Framework laptops, but due to my visit right in the beginning of the conference day the electric cables were not yet set up (they had to be removed during the night because of the rain) and so they had no working machine. After that I went to the Ubuntu booth to meet some former colleagues and friends, Mauro Gaspari, Andreia Velasco, and others. As this event is an UbuCon, the Ubuntu booth was not in the outdoor space but right in front of the door of the main lecture hall, where the plenary sessions were taking place. In the afternoon I attended Graham Morrison's workshop \"Open Documentation Academy Live: Make your first open source contribution\" (Slides) which was about documentation and managing it in GIT repositories, to get ideas to handle documentation at OpenPrinting. The last talk I attended on this UbuCon was \"How to build a sustainable Open Source company\" by Frank Karlitschek, creator and founder of NextCloud. This was interesting for me and OpenPrinting for two reasons, once, for the economical aspect how Nextcloud earns money, and second because of Nextcloud itself, as I am also thinking about having it on a server of OpenPrinting, for collaborative office document work, video meetings, conference streaming, download management, ... What I missed during the day was a printing incident in the exhibition space. Yeonguk Choo from the Ubuntu Korea LoCo (Local Community) has, inspired by a photo booth on the Ubuntu Summit 2023 in Riga, created his own photo booth based on Ubuntu and free software, Ubu4Cut and deployed it for the first time on the UbuCon Korea. Then he brought it to this year's UbuCon Asia. On the first day Ubu4Cut behaved well and many attendees lined up for taking photos to take home as souvenir, but on the second day, at some hour in the morning, the photo printer (some Canon Selphy device) stopped working. Youngbin Han, lead of the global organization of the UbuCon Asia conferences and lead of the Ubuntu Korea LoCo, was there and directly messaged me on both Matrix and Telegram, but I must have been busy with something and so I did not see the messages, sorry. But, fortunately, I have built a nice team at OpenPrinting, with the help of the Google Summer of Code, and so Akarshan Kapoor, one of our most amazing team members, who was at the booth at that time, solved the problem. Thanks a lot, Akarshan, for helping to make printing just work everywhere! The conference ended with a closing ceremony where all the speakers, sponsor representatives, and organizers were called onto the stage, one by one to receive their tokens of appreciation. After that we have taken a group photo and then headed to the venue of the conference dinner, hosted by one of the event's sponsors, Programiz. The place was beautiful and the food delicious, a great night to network with the speakers and the sponsors. And that was not the end. On Monday, September 1, there was another opportunity to socialize with the conference participants and also to see a bit of the beautiful Nepal. In the morning we were taken by bus to Bhaktapur, to visit the palace and the museum there and after lunch our bus took us up the mountains, to Nagarkot, where we crossed a long suspension bridge over a deep valley and we also got to a viewpoint where we were supposed to see the Mount Everest and other 8000+-meters mountains, but unfortunately, we did not have a clear that day ... Next day, Tuesday, September 2, I had to say good bye to Nepal as the next adventure, the Opportunity Open Source 3.0 in India, in the IIT Kanpur was approaching ... Thanks a lot to the global and local organizers Youngbin Han, Khairul Aizat Kamarudzzaman (fenris), Muhd Syazwan Md Khusaini, Rj Hsiao, Aryan Kaushik, Aaditya Singh, Sailesh Singh, and Utsav Bhattarai. Also thanks a lot to the speakers: Dimple Kuriakose, Soumyadeep Ghosh, Akarshan Kapoor, Yush Pokharel, Aryan Kaushik, Rashika Karki, Mauro Gaspari, Andreia Velasco, Graham Morrison, Frank Karlitschek, and to the many others whose talks I have missed ... And also to the sponsors and to St. Xavier’s College! And especially thanks to Canonical for funding my trip, and also to Mauro Gaspari and Gemma Mulcahy for making this going smoothly and helping quickly where needed. I hope to see you all again, perhaps in Malaysia ... UbuCon Asia 2025 web site Photos from the community Schedules Ubuntu Discourse post from Youngbin Han Ubuntu Discourse post from Aryan Kaushik Ubuntu Discourse post from Yeonguk Choo And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social and on LinkedIn: @OpenPrinting. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions"
+ },
+ {
+ "id": "post:OpenPrinting-News-We-got-a-Framework-RISC-V-board-from-DeepComputing",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - We got a Framework RISC-V board from DeepComputing",
+ "url": "/OpenPrinting-News-We-got-a-Framework-RISC-V-board-from-DeepComputing",
+ "headings": [
+ "From a RISC-V SBC to a shiny RISC-V Framework motherboard",
+ "Setting it up - The quirks of a pre-production unit",
+ "The keyboard during boot",
+ "And what about Snap?",
+ "Summary OR The Setup HOWTO",
+ "Links",
+ "Contact us"
+ ],
+ "tags": [],
+ "teaserImage": "https://img.youtube.com/vi/RFQ_TvCYBYM/hqdefault.jpg",
+ "snippet": "RISC-V board for OpenPrinting for development and testing, getting it all to work, Ubuntu Desktop, Snap on RISC-V",
+ "content": "On the Ubuntu Summit 2024 in the Hague end-October 2024 there was a booth of DeepComputing, manufacturer of RISC-V-based laptops and consumer electronics, right next to the booth of Framework, manufacturer of the famous modular, easiliy repairable and upgradeable laptops. At the DeepComputing booth I met DeepComputing's founder Yuning Liang (his Ubuntu Summit talk, slides, video) and told him of OpenPrinting and he gave me a RISC-V-based SBC for testing OpenPrinting's software on this platform. He also put me in contact with people who could help me to get an operating system onto the SBC and I was in good hope to get able to install Ubuntu on it. Unfortunately this did not work out and when FOSDEM was approaching in the beginning of February I saw that DeepComputing had there a booth again and Yuning was also there (he has given a talk, video). So I have taken the board with me to ask for help to get Ubuntu onto it. I attended the talk and after it I went with Yuning to the booth. But Yuning did even something better, he has replaced the SBC by a shiny new RISC-V motherboard for Framework laptops, the one which got recently released for general sale and which Nirav Patel, founder of Framework, has installed in a Framework laptop in a lightning demo on the Summit. And I do not even need a Framework laptop for using it, as he gave it to me in the Cooler Master standalone case with Wi-Fi antennas and interface modules, plus a kit for updating the board's EC firmware. The OS pre-installed on it was Ubuntu 24.04. Now I have a working RISC-V sample for OpenPrinting! I directly went back to the Ubuntu booth and set it up there for a first test. Fortunately, I had brought a wired keyboard and mouse and some old USB-C power supplies. Colleagues asked for bringing such stuff for demoing Raspberry Pis but nobody actually set them up, so we had an even nicer demo of the Framework/DeepComputing RISC-V board on the Sunday afternoon. There was not much to demo though as there were still some issues, and so we quickly messed it up ... Note that we have a pre-production unit (the so-called \"Early Access Edition\") here, so it is to expect that there are some hick-ups ... When we booted it for the first time on the booth we had to do some quick lookups on the internet to find out that the power has to be fed in on the upper left or upper right USB-C and also where the power button is in the standalone case (tiny black button at the upper right). Then, everything once plugged together correctly, the system booted and we already saw the USB keyboard not working in the GRUB boot menu but after the menu had timed out it slowly booted to a GNOME desktop, only that this GNOME desktop was probably the upstream default of GNOME, not the Ubuntu desktop at least. The wallpaper was a DeepComputing one. Exploring around on the desktop we also found that there were no web browsers and doing a system update (apt dist-upgrade) the update complained about \"No space left on device\", and continuing after cleaning (apt clean) it errors on the gdm package, after that the system did not boot any more. Back at home, I wanted to reload the original operating system image on the micro-SD card which serves as storage for the device to restore the system and when I wanted to open the standalone case I saw that it uses small Torx screws, T5 size according to what is written on the box the case came in. I did not have a screwdriver for it and remembered the Framework screwdriver with Torx/Philips flippable double bit on the FOSDEM booth. Probably it was forgotten to get packed into the kit. As Framework asks for 12 EUR for shipping when buying the 5 EUR tool I ended up going to a nearby big-box electronics store and bought an iFixit toolkit, containing the needed bit, and, because of my \"No space left on device\" experience on the FOSDEM, a 256-GB micro-SD card. The re-flashing of the SD card was then easy, just putting it into a reader connected to my laptop and using dd via (use a tool like GNOME Disks to see whether the output device is really /dev/sda) restored the system. sdcard.img is the uncompressed system image (Setup instructions and download). And the \"No space left on device\" was not due to a too small micro-SD card. The one which came with the board is 64 GB but the root partition was only 16 GB and the ext4 file system in it only 8 GB. So just resizing them to fill up the card's capacity using (GNOME Disks for example) would already do the trick. But with a 256 GB card at hand I used that one, to not run out of storage later. The system booted as usual, looong GRUB boot menu timeout and USB keyboard not working in GRUB menu to stop it. Now I had a desktop again to explore around in it. An important point I discovered: Printing just works! I see my driverless IPP printers and can print on them. For the missing web browser I was not able to install Firefox or Chromium, but I found the Epiphany browser: and could browse the web but not play YouTube videos. Local video files do not play with totem even with all GStreamer codecs (gstreamer1.0-plugins-XXX with XXX being base, good, bad, and ugly) and ffmpeg installed and there were also sound issues. I told Yuning about the first issues and he gave me some first answers. I also posted about them on a longer Mastodon thread started by Zygmunt Krynicki, at Canonical responsible for making Snap working on all distros, and he told me to post them on the bug tracker on GitHub where I reported all of them (see the links throughout this article for individual reports), and I got them answered. For most of them I got told that they will get addressed in the next image version, V1.1 of the Ubuntu 24.04 image. The Ubuntu 24.04 V1.1 image Shortly after Canonical has issued the Ubuntu 24.04.2 LTS point release the V1.1 image based on this release got published (yes, it contains my fix for the 100%-CPU bug of cups-browsed). I installed it and Most of my reported issues got fixed! So my bug reports worked out. Booting into the new system started with a quicker timeout of the still not accessible GRUB menu and arriving on the desktop a first-time wizard asked for defining host name, user name, password, time zone, ... Also the root partition and file system were automatically extended to the size of the card. So from a test setup (with user and password being \"roma\") we have advanced to an end-user/production setup now. After the setup wizard I got presented a nice Ubuntu Desktop now, GNOME with launcher on the left, Ubuntu theming, Ubuntu tools, like App Center ... And as promised in the release notes, Firefox, Chromium, and VLC are installed. And both browsers work correctly, and also play YouTube videos, with fluent sound from the monitor's speakers (with HDMI chosen as audio output in the GNOME Control Center), only the image was not very smooth, as, according to the release notes, hardware acceleration for video playback is not yet supported. VLC is crashing on playing local video files from the command line though. I got an answer on the bug report recommending mpv. I installed it and it actually works, and rather well for not having hardware acceleration. I can also do full system updates now, sudo apt update; sudo apt dist-upgrade, without making the system unbootable. Problem was not gdm but the custom 6.6.20 kernel replaced by a stock 6.8.0 kernel. This is now fixed by the kernel version being pinned, meaning that it does not get updated (according to the release notes). And now let us try printing ... So let us start easily (This command checks whether the CUPS daemon is running) : WHAT?! CUPS is not installed. A desktop system without CUPS installed. This is strange. I also wanted to have a quick look into a man page. Of df, which I have used and therefore it is for sure installed. This is interesting. A desktop system is where users do not log into? OK, let us unminimize: Lots of packages get installed, and I see also that all the printing stack packages are under them. So I try again: And CUPS is back! I also tried to print from applications, and it works! Reported an issue about this. The full Ubuntu Desktop experience Let us do and something like 300 packages get installed. So I have a lot more desktop applications and utilities, an Ubuntu-themed GNOME desktop, even with the Noble Numbat wallpaper (instead of the DeepComputing one). And for me it makes the impression that the YouTube videos in Firefox run more smoothly (more fps). Thanks a lot, DeepComputing and Framework to provide the hardware for a great RISC-V desktop. And thanks a lot, Yuning Liang, for providing the RISC-V board for OpenPrinting and for your great support to get it all working! Note: This applies only to the \"Early Access Edition\", a pre-production unit sold on conferences, like FOSDEM. As the boards sold on the DeepComputing booth on FOSDEM are pre-production units they seemed to take into account that they can still have significant bugs in their EC firmware, and probably therefore the kits came with a firmware flashing tool, which I actually had to use. Already during the first boot at the Ubuntu booth we found out that we could not interact with the boot menu of GRUB by the (USB) keyboard and the only way to get the board booting was to wait for the too long timeout to expire. Once it is a little bit annoying and second, if the machine would not boot one cannot resort to use an older kernel. In the beginning I did not realize that the material coming with the board was a firmware flashing tool, but as, in reaction to my bug report about the USB keyboard only working in the desktop I got a firmware update and instructions how to apply it with my tool in a mail from DeepComputing's support, and I got aware that I got this tool and appreciated that I could fix the board with it. After having applied the EC firmware update all my USB keyboards were working, a wired one with built-in USB hub and wireless Logitech keyboard using Logitech's Universal Receiver. Note: For anybody reading this and wanting to update the EC firmware, too. Please have a look into my comment on the bug report about using the newer STM32Cube flashing software which is also available for Linux. Thanks a lot, DeepComputing and Yuning Liang, for including the updating tool with the kit! The standard Ubuntu Desktop makes more and more use of the Snap package format to assure continuous updates from upstream also after the Ubuntu release and also enhanced security for common desktop applications, especially Firefox, Chromium, and Thunderbird. So I had also a look into this on the RISC-V system. The first note I got about Snap and the RISC-V board was a post by Zygmunt Krynicki on Mastodon in a long Mastodon thread where he tells that the kernel of the system which came with the does not support Snap and his GitHub issue report telling that it is because the kernel does not include squashfs support. squashfs is the immutable, compressed file system which is used by Snaps. The kernel issue got fixed with the Ubuntu 24.04 V1.1 image, but snapd was not installed, and Firefox and Chromium were installed as standard Debian packages. So I tried to install snapd, snapcraft, and rockcraft and it worked: and then I ran That is what is expected. But this was all. I tried to find some Snaps built for RISC-V in the Snap Store but did not find anything. It seems that I will soon try to make a start by building the OpenPrinting Snaps (CUPS, ipp-usb, Printer Applications) and then let the Snap Store build them , too. Thanks a lot, Zygmunt, for reporting the Snap problem! A few steps to a great desktop setup on a RISC-V-based Framework laptop or the RISC-V board in a standalone case: Install the Ubuntu 24.04 V1.1 image (or newer if available) following these instructions. Boot and go through the first-time wizard Unminimize your system with the commands: Update your system Get the full Ubuntu desktop Install the mpv video player for local video files Set mpv as default video player in the GNOME Control Center (\"Apps\", \"Default Apps\"). If you use a standalone case and not a Framework laptop, set audio output to \"HDMI\" or connect a USB audio output device and point the audio output to that one. Use the quick menu of GNOME or the \"Sound\" section of GNOME Control Center. If the sound test function does not work, do not worry, test with any sound-producing app. If you want to be able to install Snap packages, install snapd: If you want to create Snap packages or port exisiting ones to RISC-V, install snapcraft: Now things should work as with a usual Ubuntu desktop. DeepComputing Framework Issue tracker for DeepComputing/Framework RISC-V board Mastodon thread about the RISC-V board and my and Zygmunt Krynicki's experience with it And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-News-Windows-Protected-Print-vs.-Scanning-under-Windows",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting News - Windows Protected Print vs. Scanning under Windows",
+ "url": "/OpenPrinting-News-Windows-Protected-Print-vs.-Scanning-under-Windows",
+ "headings": [],
+ "tags": [],
+ "snippet": "Windows Protected Print protects you from scanning",
+ "content": "Around a year ago I reported here about Microsoft's plans to make printing under Windows more secure, going the same way as we are going with the New Architecture in CUPS 3.x, an all-IPP print environment without printer drivers, only supporting modern, driverless IPP printers. In Windows it is especially important to get rid of printer drivers, as they are closed-source code pieces running in system or even kernel level. For Windows Protected Print (WPP) Windows does not use CUPS, but Mopria instead, and they do not have a concept for non-driverless legacy printers, whereas we have the Printer Applications (which can also be used under Windows). Microsoft's plans were reported about in a blog on Microsoft's community forum, where I also left some comments. Now, some weeks ago, I read new comments there where many users complained that with the 24H2 update of Windows 11, which introduced Windows Protected Print, scanning on the multi-function printers ceased to work, while printing is working. Modern multi-function devices which do driverless IPP printing also do driverless scanning, using at least one of the standard protocols eSCL or WSD, but it seems that Microsoft did not take care of that when implementing Windows Protected Print. Also on The Register got reported that with the update 24H2 of Windows 11 several users of Canon multi-function printers reported scanning not to work any more, despite Microsoft already having issued fixes. Microsoft promised to fix the bug by end-January, but they already left their users without scanning working for many weeks. But for the seasoned WSL tinkerer (Warning: Command line use required!) it should be solvable. Proceed as described here for legacy printers, but instead of (or in addition to) installing a Printer Application, install SANE (Scanner Access Now Easy): and then use the scanimage command. Enter man scanimage for how to use it. I hope this makes Windows 11 SANE for the time being. We will soon have Scanner Applications which emulate driverless scanners (eSCL, WSD), but note that current Windows has especially problems with those. And as usual: Stay updated on Mastodon: #OpenPrinting and @till@ubuntu.social. Or discuss on our mailing lists: Development: printing-architecture AT lists DOT linux DOT dev (Archive) Users: printing-users AT lists DOT linux DOT dev (Archive) Subscribing/Unsubscribing instructions Or on the Telegram OpenPrinting chat"
+ },
+ {
+ "id": "post:OpenPrinting-Summit-PWG-Meeting-2020-approaching",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting Summit/PWG Meeting 2020 approaching!",
+ "url": "/OpenPrinting-Summit-PWG-Meeting-2020-approaching",
+ "headings": [],
+ "tags": [],
+ "snippet": "The virtual OpenPrinting Summit/PWG Meeting will take place this week, from Tuesday, May 5 to Friday, May 8, Tuesday is OpenPrinting day",
+ "content": "On Tuesday our annual meeting will start again. During 4 days we will discuss, together with the Printer Working Group (PWG), our plans how we will continue the development printing (and scanning) with free software on Linux and similar operating systems and also about free printing-related standards, especially the Internet Printing Protocol (IPP). The OpenPrinting-related part is the first day (Tue, May 5). See the agenda. Due to COVID-19 we will not meet in person, but have a virtual meeting, using WebEx. The agenda was modified to make the individual meeting days shorter, adding a forth day. Everyone can participate, we do not discuss anything secret or proprietary. There is also no registration nor any conference fees needed. Simply have a look on the agenda and logistics page. Slides of all presentations are linked there, too, at latest before the appropriate presentation starts. To participate in the WebEx meeting, please e-mail to the PWG chair at any time before or during the meeting, and visit the WebEx meeting page."
+ },
+ {
+ "id": "post:OpenPrinting-mentoring-on-the-Google-Summer-of-Code-2020",
+ "source": "static",
+ "type": "post",
+ "title": "OpenPrinting mentoring on the Google Summer of Code 2020!",
+ "url": "/OpenPrinting-mentoring-on-the-Google-Summer-of-Code-2020",
+ "headings": [],
+ "tags": [],
+ "snippet": "The Linux Foundation got accepted as a mentoring organization for the GSoC 2020 and OpenPrinting as one of its sub-organizations will offer a wide variety of student projects again",
+ "content": "The Linux Foundation got accepted as a mentoring organization for the GSoC 2020 and OpenPrinting as one of its sub-organizations will offer a wide variety of student projects again. This year our main subject is the Internet Printing Protocol (IPP). The students will implement the standards for driverless IPP scanning (driverless printing already works), IPP System Service (the printer setup tool of the future), Printer and Scanner Applications for providing drivers in the Snap Store, and more printing-related projects. Each project consists of three months of coding from mid-May to mid-August. Students who want to participate, please see the general GSoC info of the Linux Foundation and our project idea list. See also Google's timeline. Once you have found your preferred project idea(s) or you have your own idea, please contact the mentors mentioned in the idea listing or the organization admins as soon as possible. We will then introduce you to the work of OpenPrinting. Please do not wait for the start of Google's student application period."
+ },
+ {
+ "id": "post:PostScript-Printer-Application",
+ "source": "static",
+ "type": "post",
+ "title": "PostScript Printer Application",
+ "url": "/PostScript-Printer-Application",
+ "headings": [
+ "PostScript Printer Application"
+ ],
+ "tags": [],
+ "snippet": "The PostScript Printer Application, first PAPPL-based non-Raster Printer Application, retro-fitting PPD files",
+ "content": "After having all needed filter functions and PPD file collection handling implemented in cups-filters and having the HP PCL Printer Application as example I have created a Printer Application for PostScript printers. It is now available as the ps-printer-app repository on the OpenPrinting GitHub. Currently it is a first working model, it will get much more functionality, especially for best user experience, added in the near future. See all the details of properties, planned features, known issues, and how to use in the README.md file. This Printer Application is especially a working model for A non-raster Printer Application: Destination format is PostScript, a high-level/vector format. Input data in PostScript or PDF is accepted and needed conversion is not done through an inbetween raster step. A Printer Application which uses the new filter functions of cups-filters 2.x. Filter functions are library functions derived from cups-filters and contain decades of development and refinement starting from the introduction of CUPS in 2000. A retro-fit Printer Application for classic CUPS drivers, in this case the simplest form of only PPD files for PostScript printers. It lists PPD files from repositories included in the Snap, loads the PPD needed for the actual printer, extracts options from the PPD to display them in the web interface, accepts job settings as IPP attributes, and inserts the PostScript code provided by the PPD correctly into the output data stream. A Printer Application which does not pass through raw (input format is printer's native format) jobs. To assure that always the PostScript code of the PPD file is inserted into the output stream, we call the printer's native format \"application/vnd.printer-specific\" which does not exist as input format, so \"application/postscript\" input is forced through the pstops() filter function. To do not need to re-invent the code for forking into sub-processes so that we can pass data through a sequence of filters, we create a filter function to send the data off to the printer and form a chain of the actually converting filter function (one of pstops(), pdftops(), imagetops(), rastertops()) and the with this filter function using the filterChain() filter function. The PostScript Printer Application has all PostScript PPD files of the foomatic-db and HPLIP projects built-in, so most PostScript printer PPDs which usually come with Linux Distributions. Note that some PPDs use certain CUPS filters for extra functionality. These filters are not included. The user can add additional PPDs without needing to rebuild the Snap."
+ },
+ {
+ "id": "post:cups-2.3.3op1",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.3.3op1",
+ "url": "/cups-2.3.3op1",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.3.3op1 is the first OpenPrinting CUPS release which fixes many bugs, incorporates common Linux distribution changes, and provides several IPP Everywhere improvements.",
+ "content": "CUPS 2.3.3op1 is the first OpenPrinting CUPS release which fixes many bugs, incorporates common Linux distribution changes, and provides several IPP Everywhere improvements. Download v2.3.3op1 Changes include: The automated test suite can now be activated using make test for consistency with other projects and CI environments - the old make check continues to work as well, and the previous test server behavior can be accessed by running make testserver. ippeveprinter now supports multiple icons and strings files. ippeveprinter now uses the system's FQDN with Avahi. ippeveprinter now supports Get-Printer-Attributes on \"/\". ippeveprinter now uses a deterministic \"printer-uuid\" value. ippeveprinter now uses system sounds on macOS for Identify-Printer. Updated ippfind to look for files in \"~/Desktop\" on Windows. Updated ippfind to honor SKIP-XXX directives with PAUSE. Updated IPP Everywhere support to work around printers that only advertise color raster support but really also support grayscale (Issue #1) ipptool now supports DNS-SD URIs like ipps://My%20Printer._ipps._tcp.local (Issue #5) The scheduler now allows root backends to have world read permissions but not world execute permissions (Issue #21) Failures to bind IPv6 listener sockets no longer cause errors if IPv6 is disabled on the host (Issue #25) The SNMP backend now supports the HP and Ricoh vendor MIBs (Issue #28) The scheduler no longer includes a timestamp in files it writes (Issue #29) The systemd service names are now \"cups.service\" and \"cups-lpd.service\" (Issue #30, Issue #31) The scheduler no longer adds the local hostname to the ServerAlias list (Issue #32) Added LogFileGroup directive in \"cups-files.conf\" to control the group owner of log files (Issue #34) Added --with-max-log-size configure option (Issue #35) Added --enable-sync-on-close configure option (Issue #37) Added --with-error-policy configure option (Issue #38) IPP Everywhere PPDs could have an \"unknown\" default InputSlot (Issue #44) The httpAddrListen function now uses a listen backlog of 128. Added USB quirks (Apple issue #5789, #5823, #5831) Fixed IPP Everywhere v1.1 conformance issues in ippeveprinter. Fixed DNS-SD name collision support in ippeveprinter. Fixed compiler and code analyzer warnings. Fixed TLS support on Windows. Fixed ippfind sub-type searches with Avahi. Fixed the default hostname used by ippeveprinter on macOS. Fixed resolution of local IPP-USB printers with Avahi. Fixed coverity issues (Issue #2) Fixed httpAddrConnect issues (Issue #3) Fixed web interface device URI issue (Issue #4) Fixed lp/lpr \"printer/class not found\" error reporting (Issue #6) Fixed xinetd support for LPD clients (Issue #7) Fixed libtool build issue (Issue #11) Fixed a memory leak in the scheduler (Issue #12) Fixed a potential integer overflow in the PPD hashing code (Issue #13) Fixed output-bin and print-quality handling issues (Issue #18) Fixed PPD options getting mapped to odd IPP values like \"tray---4\" (Issue #23) Fixed remote access to the cupsd.conf and log files (Issue #24) Fixed the automated test suite when running in certain build/CI environments (Issue #25) Fixed a logging regression caused by a previous change for Apple issue #5604 (Issue #25) Fixed fax phone number handling with GNOME (Issue #40) Fixed potential rounding error in rastertopwg filter (Issue #41) Fixed the \"uri-security-supported\" value from the scheduler (Issue #42) Fixed IPP backend crash bug with \"printer-alert\" values (Issue #43) Removed old Solaris inetconv(1m) reference in cups-lpd man page (Issue #46) Fixed default options that incorrectly use the \"custom\" prefix (Issue #48) Fixed a memory leak when resolving DNS-SD URIs (Issue #49) Fixed systemd status reporting by adopting the notify interface (Issue #51) Fixed crash in rastertopwg (Apple issue #5773) Fixed cupsManualCopies values in IPP Everywhere PPDs (Apple issue #5807) Enjoy!"
+ },
+ {
+ "id": "post:cups-2.3.3op2",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.3.3op2",
+ "url": "/cups-2.3.3op2",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.3.3op2 is the latest OpenPrinting CUPS security and bug fix release.",
+ "content": "CUPS 2.3.3op2 is the latest OpenPrinting CUPS security and bug fix release. Changes include: Security: Fixed a buffer (read) overflow in the ippReadIO function (CVE-2020-10001) Clarified the documentation for the \"Listen\" directive (Issue #53) Fixed duplicate ColorModel entries for AirPrint printers (Issue 59) Fixed directory/permission defaults for Debian kfreebsd-based systems (Issue #60, Issue #61) Fixed crash bug in ppdOpen (Issue #64, Issue #78) Fixed regression in snprintf emulation function (Issue #67) The scheduler's systemd service file now waits for the nslcd service to start (Issue #69) The libusb-based USB backend now uses a simpler read timer implementation to avoid a regression in a previous change (Issue #72) The PPD caching code now only tracks the APPrinterIconPath value on macOS (Issue #73) Fixed segfault in help.cgi when searching in man pages (Issue #81) Root certificates were incorrectly stored in \"~/.cups/ssl\". Enjoy! Download v2.3.3op2 "
+ },
+ {
+ "id": "post:cups-2.4.0",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.0",
+ "url": "/cups-2.4.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.0 is the latest stable OpenPrinting CUPS release. Among the changes from beta and release candidate the stable release adds two new configuration options for optimizing cupsd setup on servers and several other changes.",
+ "content": "CUPS 2.4.0 is the latest stable OpenPrinting CUPS release. Among the changes from beta and release candidate the stable release adds two new configuration options for optimizing cupsd setup on servers and several other changes. The detailed list of changes: Added configure option --with-idle-exit-timeout (Issue #294) Added --with-systemd-timeoutstartsec configure option (Issue #298) DigestOptions now are applied for MD5 Digest authentication defined by RFC 2069 as well (Issue #287) Fixed compilation on Solaris (Issue #293) Fixed and improved German translations (Issue #296, Issue #297) Enjoy! :)"
+ },
+ {
+ "id": "post:cups-2.4.1",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.1",
+ "url": "/cups-2.4.1",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.1 is the first bug fix release from 2.4.x series. Among the other bug fixes it fixes sharing default color mode to clients and several memory leaks.",
+ "content": "CUPS 2.4.1 is the first bug fix release from 2.4.x series. Among the other bug fixes it fixes sharing default color mode to clients and several memory leaks. Detailed list of changes: The default color mode now is now configurable and defaults to the printer's reported default mode (Issue #277) Configuration script now checks linking for -Wl,-pie flags (Issue #303) Fixed memory leaks - in testi18n (Issue #313), in cups_enum_dests() (Issue #317), in _cupsEncodeOption() and http_tls_upgrade() (Issue #322) Fixed missing bracket in de/index.html (Issue #299) Fixed typos in configuration scripts (Issues #304, #316) Removed remaining legacy code for RIP_MAX_CACHE environment variable (Issue #323) Removed deprecated directives from cupsctl and cups-files.conf (Issue #300) Removed purge-jobs legacy code from CGI scripts and templates (Issue #325) Enjoy! :)"
+ },
+ {
+ "id": "post:cups-2.4.10",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.10",
+ "url": "/cups-2.4.10",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.10 fixes regression for domain socket-only setups",
+ "content": "CUPS 2.4.10 brings two fixes: Fixed error handling when reading a mixed 1setOf attribute. Fixed scheduler start if there is only domain socket to listen on (Issue #985) which the latter is fix for regression after fix for CVE-2024-35235 in scenarios where is no other listeners in cupsd.conf than domain socket created on demand by systemd, launchd or upstart. Enjoy! Download v2.4.10 "
+ },
+ {
+ "id": "post:cups-2.4.11",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.11",
+ "url": "/cups-2.4.11",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.11 bring several bug fixes regarding IPP support and Web UI",
+ "content": "CUPS 2.4.11 brings several bug fixes regarding IPP response validation, processing PPD values, Web UI support (checkbox support, modifying printers) and others fixes. Detailed list of changes is available in CHANGES.md Enjoy! Download v2.4.11 "
+ },
+ {
+ "id": "post:cups-2.4.12",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.12",
+ "url": "/cups-2.4.12",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.12 brings enhancements in IPP encryption and debugging",
+ "content": "The last planned release of CUPS 2.4.x series (the next will be 2.5.x series) contains several enhancements among set of bug fixes, such following cryptographic policies when using GnuTLS crypto provider and possibility to opt-out from this behavior, logging job debugging history if print queue backends fails, or raising alerts for certificate issues in IPPS backend. The detailed list of changes is available in CHANGES.md. Enjoy the new release! Download v2.4.12 "
+ },
+ {
+ "id": "post:cups-2.4.13",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.13",
+ "url": "/cups-2.4.13",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.13 fixes important and moderate vulnerabilities",
+ "content": "The release 2.4.13 brings two CVE fixes - fix for important CVE-2025-58060 and fix for moderate CVE-2025-58364, together with several bug fixes. The release includes a new feature - new attribute for printer and job objects - print-as-raster - which allows enforce rasterization of the file for IPP Everywhere/AirPrint printers, which supports PDF and raster document formats. The feature is useful for working around internal PDF issues in the printer firmware, for example missing diacritic when printing a PDF. The detailed list of changes is available in CHANGES.md. Enjoy the release! Download v2.4.13 "
+ },
+ {
+ "id": "post:cups-2.4.14",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.14",
+ "url": "/cups-2.4.14",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.14 fixes installation of localized files",
+ "content": "The hotfix release brings fix for installation process of localized templates and CUPS web UI home pages. Enjoy! Download v2.4.14 "
+ },
+ {
+ "id": "post:cups-2.4.15",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.15",
+ "url": "/cups-2.4.15",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.15 fixes two CVEs in scheduler",
+ "content": "The release CUPS 2.4.15 brings two CVE fixes: Fix various cupsd issues which cause local DoS (CVE-2025-61915) Fix unresponsive cupsd process caused by slow client (CVE-2025-58436) and several bug fixes described in CHANGES.md. Enjoy! Download v2.4.15 "
+ },
+ {
+ "id": "post:cups-2.4.16",
+ "source": "static",
+ "type": "post",
+ "title": "Untitled Article",
+ "url": "/cups-2.4.16",
+ "headings": [
+ "title: CUPS 2.4.16\nlayout: single\nauthor: Zdenek\nexcerpt: CUPS 2.4.16 hot fix release is available\ndate: '2025-12-04'"
+ ],
+ "tags": [],
+ "snippet": "The hotfix release 2.4.16 includes fix for infinite loop in GTK, which was caused by change of internal behavior in libcups on which GTK depended on, and workaround for stopping...",
+ "content": "The hotfix release 2.4.16 includes fix for infinite loop in GTK, which was caused by change of internal behavior in libcups on which GTK depended on, and workaround for stopping the scheduler if configuration includes unknown directives. The full list of changes is shown in CHANGES.md. Enjoy! Download v2.4.16 "
+ },
+ {
+ "id": "post:cups-2.4.2",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.2",
+ "url": "/cups-2.4.2",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.2 brings the fix for CVE-2022-26691, LibreSSL/OpenSSL and minimal AIX support together with a list of bug fixes",
+ "content": "CUPS 2.4.2 brings the fix for CVE-2022-26691, together with LibreSSL/OpenSSL and minimal AIX support. There are lots of bug fixes as well, feel free to check the list of changes: Fixed certificate strings comparison for Local authorization (CVE-2022-26691) The cupsFileOpen function no longer opens files for append in read-write mode (Issue #291) The cupsd daemon removed processing temporary queue (Issue #364) Fixed delay in IPP backend if GNUTLS is used and endpoint doesn't confirm closing the connection (Issue #365) Fixed conditional jump based on uninitialized value in cups/ppd.c (Issue #329) Fixed CSS related issues in CUPS Web UI (Issue #344) Fixed copyright in CUPS Web UI trailer template (Issue #346) mDNS hostname in device uri is not resolved when installaling a permanent IPP Everywhere queue (Issues #340, #343) The lpstat command now reports when the scheduler is not running (Issue #352) Updated the man pages concerning the -h option (Issue #357) Re-added LibreSSL/OpenSSL support (Issue #362) Updated the Solaris smf service file (Issue #368) Fixed a regression in lpoptions option support (Issue #370) The scheduler now regenerates the PPD cache information after changing the \"cupsd.conf\" file (Issue #371) Updated the scheduler to set \"auth-info-required\" to \"username,password\" if a backend reports it needs authentication info but doesn't set a method for authentication (Issue #373) Updated the configure script to look for the OpenSSL library the old way if pkg-config is not available (Issue #375) Fixed the prototype for the httpWriteResponse function (Issue #380) Brought back minimal AIX support (Issue #389) cupsGetResponse did not always set the last error. Fixed a number of old references to the Apple CUPS web page. Restored the default/generic printer icon file for the web interface. Removed old stylesheet classes that are no longer used by the web interface. Enjoy the new CUPS release!"
+ },
+ {
+ "id": "post:cups-2.4.3",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.3",
+ "url": "/cups-2.4.3",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.3 brings the fix for CVE-2023-32324, several improvements and a ton of bug fixes",
+ "content": "CUPS 2.4.3 brings fix for CVE-2023-32324, several improvements and many bug fixes. CUPS now implements fallback for printers with broken firmware, which is not capable of answering to IPP request get-printer-attributes with all, media-col-database - this enables driverless support for bunch of printers which don't follow IPP Everywhere standard. Aside from the CVE fix the most important fixes are around color settings, printer application support fixes and OpenSSL support. Detailed list of changes: Added a title with device uri for found network printers (Issues #402, #393) Added new media sizes defined by IANA (Issues #501) Added quirk for GoDEX label printers (Issue #440) Fixed --enable-libtool-unsupported (Issue #394) Fixed configuration on RISC-V machines (Issue #404) Fixed the device_uri invalid pointer for driverless printers with .local hostname (Issue #419) Fixed an OpenSSL crash bug (Issue #409) Fixed a potential SNMP OID value overflow issue (Issue #431) Fixed an OpenSSL certificate loading issue (Issue #465) Fixed Brazilian Portuguese translations (Issue #288) Fixed cupsd default keychain location when building with OpenSSL (Issue #529) Fixed default color settings for CMYK printers as well (Issue #500) Fixed duplicate PPD2IPP media-type names (Issue #688) Fixed possible heap buffer overflow in _cups_strlcpy() (fixes CVE-2023-32324) Fixed InputSlot heuristic for photo sizes smaller than 5x7\" if there is no media-source in the request (Issue #569) Fixed invalid memory access during generating IPP Everywhere queue (Issue #466) Fixed lprm if no destination is provided (Issue #457) Fixed memory leaks in create_local_bg_thread() (Issue #466) Fixed media size tolerance in ippeveprinter (Issue #487) Fixed passing command name without path into ippeveprinter (Issue #629) Fixed saving strings file path in printers.conf (Issue #710) Fixed TLS certificate generation bugs (Issue #652) ippDeleteValues would not delete the last value (Issue #556) Ignore some of IPP defaults if the application sends its PPD alternative (Issue #484) Make Letter the default size in ippevepcl (Issue #543) Now accessing Admin page in Web UI requires authentication (Issue #518) Now look for default printer on network if needed (Issue #452) Now we poll media-col-database separately if we fail at first (Issue #599) Now report fax attributes and values as needed (Issue #459) Now localize HTTP responses using the Content-Language value (Issue #426) Raised file size limit for importing PPD via Web UI (Issue #433) Raised maximum listen backlog size to INT MAX (Issue #626) Update print-color-mode if the printer is modified via ColorModel PPD option (Issue #451) Use localhost when printing via printer application (Issue #353) Write defaults into /etc/cups/lpoptions if we're root (Issue #456) Enjoy! :)"
+ },
+ {
+ "id": "post:cups-2.4.4",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.4",
+ "url": "/cups-2.4.4",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.4 brings hotfix for cupsGetNamedDest() segfault",
+ "content": "CUPS 2.4.4 release is created as a hotfix for segfault in cupsGetNamedDest(), when caller tries to find the default destination and the default destination is not set on the machine (Issue #719). I'm sorry for inconvenience and enjoy the hotfix! Download v2.4.4 "
+ },
+ {
+ "id": "post:cups-2.4.5",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.5",
+ "url": "/cups-2.4.5",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.5 brings hotfix for corrupted locally saved certificates",
+ "content": "CUPS 2.4.5 is a hotfix release for a bug which corrupted locally saved certificates, which broke secured printing via TLS after the first print job. We're sorry for the inconvenience and enjoy the hotfix! Download v2.4.5 "
+ },
+ {
+ "id": "post:cups-2.4.6",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.6",
+ "url": "/cups-2.4.6",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.6 brings fix for CVE-2023-34241",
+ "content": "CUPS 2.4.6 is released to ship the fix for the latest CVE - CVE-2023-34241 - and two other bug fixes. Detailed list: Fix linking error on old MacOS (Issue #715) Fix printing multiple files on specific printers (Issue #643) Fix use-after-free when logging warnings in case of failures in cupsdAcceptClient() (fixes CVE-2023-34241) Enjoy! Download v2.4.6 "
+ },
+ {
+ "id": "post:cups-2.4.7",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.7",
+ "url": "/cups-2.4.7",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.7 brings fix for CVE-2023-4504 and other fixes",
+ "content": "CUPS 2.4.7 is released to ship the fix for CVE-2023-4504 and several other changes, among them it is adding OpenSSL support for cupsHashData function and bug fixes. Detailed list: CVE-2023-4504 - Fixed Heap-based buffer overflow when reading Postscript in PPD files Added OpenSSL support for cupsHashData (Issue #762) Fixed delays in lpd backend (Issue #741) Fixed extensive logging in scheduler (Issue #604) Fixed hanging of lpstat on IBM AIX (Issue #773) Fixed hanging of lpstat on Solaris (Issue #156) Fixed printing to stderr if we can't open cups-files.conf (Issue #777) Fixed purging job files via cancel -x (Issue #742) Fixed RFC 1179 port reserving behavior in LPD backend (Issue #743) Fixed a bug in the PPD command interpretation code (Issue #768) Enjoy the new release! Download v2.4.7 "
+ },
+ {
+ "id": "post:cups-2.4.8",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.8",
+ "url": "/cups-2.4.8",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.8 brings important bug fix for permanent IPP Everywhere printer installation",
+ "content": "CUPS 2.4.8 brings many bug fixes which aggregated over the last half a year. It brings the important fix for race conditions and errors which can happen when installing permanent IPP Everywhere printer, support for PAM modules password-auth and system-auth and new option for lpstat which can show only the successful jobs. Detailed list of changes is available in CHANGES.md. Enjoy! Download v2.4.8 "
+ },
+ {
+ "id": "post:cups-2.4.9",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4.9",
+ "url": "/cups-2.4.9",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4.9 brings security fix for CVE-2024-35235",
+ "content": "CUPS 2.4.9 brings security fix for CVE-2024-35235 and several bug fixes regarding CUPS Web User Interface, PPD generation and HTTP protocol implementation. Detailed list of changes is available in CHANGES.md. Enjoy! Download v2.4.9 "
+ },
+ {
+ "id": "post:cups-2.4b1",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4b1",
+ "url": "/cups-2.4b1",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS v2.4b1 is the beta release for OpenPrinting CUPS 2.4 which contains new features, deprecations, removals and bugfixes.",
+ "content": "CUPS 2.4b1 is the beta release for OpenPrinting CUPS 2.4 which contains several new features such as basic OAuth support, support for AirPrint and Mopria clients and support for running CUPS as a snap, several deprecations (Kerberos, cups-config), removals of old deprecated directives, and many bug fixes. The detailed list of changes: Added support for CUPS running in a Snapcraft snap. Added basic OAuth 2.0 client support (Issue #100) Added support for AirPrint and Mopria clients (Issue #105) Added configure support for specifying systemd dependencies in the CUPS service file (Issue #144) Added several features and improvements to ipptool (Issue #153) Added a JSON output mode for ipptool. The ipptool command now correctly reports an error when a test file cannot be found. CUPS library now uses thread safe getpwnam_r and getpwuid_r functions (Issue #274) Fixed Kerberos authentication for the web interface (Issue #19) The ZPL sample driver now supports more \"standard\" label sizes (Issue #70) Fixed reporting of printer instances when enumerating and when no options are set for the main instance (Issue #71) Reverted USB read limit enforcement change from CUPS 2.2.12 (Issue #72) The IPP backend did not return the correct status code when a job was canceled at the printer/server (Issue #74) The testlang unit test program now loops over all of the available locales by default (Issue #85) The cupsfilter command now shows error messages when options are used incorrectly (Issue #88) The PPD functions now treat boolean values as case-insensitive (Issue #106) Temporary queue names no longer end with an underscore (Issue #110) The USB backend now runs as root (Issue #121) Added pkg-config file for libcups (Issue #122) Fixed a PPD memory leak caused by emulator definitions (Issue #124) Fixed a DISPLAY bug in ipptool (Issue #139) The scheduler now includes the [Job N] prefix for job log messages, even when using syslog logging (Issue #154) Added support for locales using the GB18030 character set (Issue #159) httpReconnect2 did not reset the socket file descriptor when the TLS negotiation failed (Apple #5907) httpUpdate did not reset the socket file descriptor when the TLS negotiation failed (Apple #5915) The IPP backend now retries Validate-Job requests (Issue #132) Now show better error messages when a driver interface program fails to provide a PPD file (Issue #148) Added dark mode support to the CUPS web interface (Issue #152) Added a workaround for Solaris in httpAddrConnect2 (Issue #156) Fixed an interaction between --remote-admin and --remote-any for the cupsctl command (Issue #158) Now use a 60 second timeout for reading USB backchannel data (Issue #160) The USB backend now tries harder to find a serial number (Issue #170) Fixed @IF(name) handling in cupsd.conf (Apple #5918) Fixed documentation and added examples for CUPS' limited CGI support (Apple #5940) Fixed the lpc command prompt (Apple #5946) Now always pass \"localhost\" in the Host: header when talking over a domain socket or the loopback interface (Issue #185) Fixed a job history update issue in the scheduler (Issue #187) Fixed job-pages-per-set value for duplex print jobs. Fixed an edge case in ippReadIO to make sure that only complete attributes and values are retained on an error (Issue #195) Hardened ippReadIO to prevent invalid IPP messages from being propagated (Issue #195, Issue #196) The scheduler now supports the \"everywhere\" model directly (Issue #201) Fixed some IPP Everywhere option mapping problems (Issue #238) Fixed support for \"job-hold-until\" with the Restart-Job operation (Issue #250) Fixed the default color/grayscale presets for IPP Everywhere PPDs (Issue #262) Fixed support for the 'offline-report' state for all USB backends (Issue #264) Documentation fixes (Issue #92, Issue #163, Issue #177, Issue #184) Localization updates (Issue #123, Issue #129, Issue #134, Issue #146, Issue #164) USB quirk updates (Issue #192, Issue #270, Apple #5766, Apple #5838, Apple #5843, Apple #5867) Web interface updates (Issue #142, Issue #218) The ippeveprinter tool now automatically uses an available port. Fixed several Windows TLS and hashing issues. Deprecated cups-config (Issue #97) Deprecated Kerberos (AuthType Negotiate) authentication (Issue #98) Removed support for the (long deprecated and unused) FontPath, ListenBackLog, LPDConfigFile, KeepAliveTimeout, RIPCache, and SMBConfigFile directives in cupsd.conf and cups-files.conf. Stubbed out deprecated httpMD5 functions. Add test for undefined page ranges during printing. Enjoy!"
+ },
+ {
+ "id": "post:cups-2.4rc1",
+ "source": "static",
+ "type": "post",
+ "title": "CUPS 2.4rc1",
+ "url": "/cups-2.4rc1",
+ "headings": [],
+ "tags": [],
+ "snippet": "CUPS 2.4rc1 is a release candidate for OpenPrinting CUPS 2.4.0, which adds two enhancements before the stable release.",
+ "content": "CUPS 2.4rc1 is a release candidate for OpenPrinting CUPS 2.4.0, which adds two enhancements before the stable release. The detailed list of changes: Added warning and debug messages when loading printers if the queue is raw or with driver (Issue #286) Compilation now uses -fstack-protector-strong if available (Issue #285) Enjoy!"
+ },
+ {
+ "id": "post:cups-browsed-2.1.1",
+ "source": "static",
+ "type": "post",
+ "title": "cups-browsed 2.1.1",
+ "url": "/cups-browsed-2.1.1",
+ "headings": [
+ "All changes",
+ "Package"
+ ],
+ "tags": [],
+ "snippet": "Bug fix release, especially to fix the long-standing problem that cups-browsed sometimes gets stuck with 100% CPU",
+ "content": "We have issued this release as it contains a fix for a long-standing bug. Since multi-threading was introduced as a central new feature of the 2.x generation of cups-browsed users started to report that from time to time cups-browsed got stuck with 100% CPU load on 1 or 2 processor cores (Ubuntu bugs #2049315, #2067918, and #2073504). It took very long to come to the right idea what actually needed to get fixed, as the bug was not easily reproducable, sometimes it happened but often not. After having collected some tracebacks it turned out that cups-browsed always got stuck in an infinite loop in the httpGets() function of libcups. One of the reporters of the cups-browsed problem also reported an issue in CUPS. I found out that the used field of the data structure http_t for HTTP requests, which tells how many bytes in a buffer are used, has to be negative to cause the infinite loop. Reviewing the HTTP-related code in libcups I did not find a way how this can happen. http_t is even an opaque data structure, so the used field can only be changed by the CUPS library's own functions. But when I went through the code of cups-browsed I found the culprit: cups-browsed opens only one single HTTP connection to the cupsd it is working for and keeps it throughout its whole life. Only later on multi-threading got added, to do computationally intensitive tasks, CUPS queue creation and DNS-SD resolving, in parallel, and having only one HTTP connection, requests happening in parallel messed up the data structure, ending up with negative used field and cups-browsed getting stuck in an infinite loop. Now we have fixed this by creating separate HTTP connection by each function which needs one. CUPS has no problem with several client connections in parallel. We also fixed an uninitialized string buffer and a wrong use of a pointer. Do not use global HTTP connection to local CUPS cups-browsed used a simple HTTP connection to CUPS and preserved it in a global variable throughout its whole life. With the addition of multi-threading this caused race-conditions and especially cups-browsed getting stuck in a busy loop. Now we create separate HTTP connections each time we need one, to eliminate this problem (Ubuntu bugs #2049315, #2067918, and #2073504, CUPS Issue #879). Fix uninitialized make_model in create_queue() Initialized the buffer by putting a terminating zero to its beginning, also removed a wrong use of sizeof() (applying to pointer no to buffer, Issue #42). cups-browsed: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:cups-browsed-Second-Generation-Forth-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "cups-browsed Second Generation - Forth Beta Release!",
+ "url": "/cups-browsed-Second-Generation-Forth-Beta-Release",
+ "headings": [
+ "All changes",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "Test script, for `make check`, CI, autopkgtest, ... and several bug fixes",
+ "content": "In this forth beta we have added a test script, to give make check functionality but also for using it in the autopkgtests of debian/Ubuntu and for general CI. We also found and fixed many bugs in cups-browsed itself during the development of the script. The splitting of cups-filters into separate packages for the second generation has put the code of cups-filters into packages which are \"new\" for Ubuntu. Therefore they have to pass the process of being included in the \"Main\" part of the distro, especially as at the time when cups-filters was originally created there was not such a Main Inclusion process. One requirement are the automatic tests, a build test (make check) performed right after compiling the code by the build process of the DEB package, and an autopkgtest, performed when the package is uploaded or when a new version of another package where our package depends on is uploaded (for example upload of CUPS triggers also the autopkgtest of cups-browsed). Therefore with this release I add a test script, which serves for both build test and autopkg test. It has different modes, once it can run a private copy of CUPS and the compiled cups-browsed in the source tree, and second, it can also use the daemons which are regularly installed into the system. The script generally emulates IPP printers with the help of the ippeveprinter utility of CUPS and checks whether cups-browsed auto-creates CUPS queues for them and whether one can print a job via the cups-browsed-generated queue. cups-browsed made it into Main already, despite the Main Inclusion Request (MIR) not yet being concluded. In the course of the development of the test script cups-browsed received also some more intense testing and this revealed several bugs, including some crashers. These we have all fixed now. And to complete this release, it also contains the fixes of bugs found by a Coverity scan done at Red Hat, as it was also done with the other components of cups-filters. These bugs are typically memory leaks or potential segmentation faults. Thanks a lot, Zdenek Dohnal. Added test script for make test/make check, CI, autopkgtest, ... The script test/run-tests.sh creates emulations of IPP printers via ippeveprinter (of CUPS 2.x) and checks whether cups-browsed creates corresponding CUPS queues, whether a job to such a queue gets actually printed, and whether cups-browsed removes the queues again when the printers are shut down. implicitclass backend: If no destination got reported by cups-browsed, retry after one minute, not the standard 5 minutes of CUPS. debug_printf(): Check for need of log rotation only if log file is set and opened, to avoid a crash. on_printer_modified(): Added NULL check to avoid a crash. ipp_discoveries_add(): Ignore duplicate entries. These are most probably caused by a bug in Avahi, having certain discoveries of a printer reported twice and others not. When the printer disappears Avahi reports the disappearal of each discovery correctly, leaving the duplicate entry untreated (removing only one instance of it) and cups-browsed assumes that the printer is still there, keeping its CUPS queue. update_cups_queues(): Reset counter for pausing CUPS queue updates. Otherwise after having updated the number of queues supposed to be the maximum for one run of update_cups_queues(), cups-browsed will never update any queue again. resolve_callback()/resolver_wrapper(): New thread only when printer found We move the check which resolver event we have (found/failure) already in the main thread (resolver_wrapper()) and launch a new thread only if we have found a new printer and have to investigate whether to add a queue for it or not. resolve_callback() only initiates this investigation now. This way we do not need to pass the resolver data structure (of type AvahiServiceResolver*) into the new thread, which caused segfaults. create_remote_printer_entry(): Corrected some memory freeing when a printer data structure is deleted, but this has not caused a segfault in the recent tests. Fixed issues reported by Red Hat Coverity tool (Pull request #6) configure.ac: Change deprecated AC_PROG_LIBTOOL for LT_INIT (Pull request #5) configure.ac: cups-browsed doesn't need C++ cups-browsed: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:cups-filters-1.25.12-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.25.12 released!",
+ "url": "/cups-filters-1.25.12-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, to address a bug of grayscale jobs not printed on PostScript printers when Poppler is used as PDF interpreter, to allow printing on printers which claim to accept PWG Raster but actually do not print this format, and to eliminate all compiler warnings when building the package",
+ "content": "Bug fix release, to address a bug of grayscale jobs not printed on PostScript printers when Poppler is used as PDF interpreter, to allow printing on printers which claim to accept PWG Raster but actually do not print this format, and to eliminate all compiler warnings when building the package libcupsfilters: Use the text names \"Draft\", \"Normal\", and \"High\" instead of 3, 4, and 5 as choice names for the \"cupsPrintQuality\" option as CUPS does (Issue #171). libcupsfilters: If a printer supports both Apple Raster and PWG Raster let the generated PPD use Apple Raster as there are several printers which report PWG Raster support but do not actually print PWG Raster (Pull reguest #168, Issue #171, CUPS issue #5238). cups-browsed: Fix unset location check to use DNS-SD field (Pull request #172). libcupsfilters, beh, implicitclass, foomatic-rip, imagetopdf, mupdftoraster, pdftops, sys5ippprinter, cups-browsed, driverless: Silenced all compiler warnings to make the build process of cups-filters completely free of warnings. pdftops: Fixed crash when using filter without PPD file. pdftops: If printing grayscale jobs with Ghostscript as PDF renderer, add \"-sProcessColorModel=DeviceGray\" to Ghostscript command line. pdftops: Do not use the ugly \"pdftops -level1 ...\" workaround to get grayscale PostScript output from Poppler. It leads to huge output files with Poppler's \"pdftops\" utility and does not work at all with \"pdftocairo\". Poppler itself does not support PostScript output converted to grayscale. Issue a warning with the hint to use Ghostscript or MuPDF as PDF renderer (Issue #169). libcupsfilters: In the cupsRasterParseIPPOptions() accept also \"Mono\", \"Monochrome\", and \"Gray\" as color space names. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.25.13-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.25.13 released!",
+ "url": "/cups-filters-1.25.13-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, mainly to solve problems of cups-browsed, mainly for compatibility problems with some printers, leaks, and crashes. Also updated the PPD generator to catch up with the one of CUPS. Prefer Apple Raster instead of PWG Raster as some printers have bugs in their PWG Raster implementation.",
+ "content": "Bug fix release, mainly to solve problems of cups-browsed, mainly for compatibility problems with some printers, leaks, and crashes. Also updated the PPD generator to catch up with the one of CUPS. Prefer Apple Raster instead of PWG Raster as some printers have bugs in their PWG Raster implementation. implicitclass: When passing on the job via the \"ipp\" CUPS backend, set argv[0] to the destination printer URI (Pull request #173). cups-browsed: Added another fallback to the get-printer-attributes IPP request: Now after failing the standard request (\"all\", \"media-col-database\") with both IPP 2.0 and IPP 1.1, try simply \"all\", without \"media-col-database\" (Pull request #173). cups-browsed: Do not set printer-is-shared for remote CUPS queue when making a temporary queue permanent (Pull request #180). cups-browsed: Fix leaks of ipp_t struct and load balancing on the servers (Pull request #179). cups-browsed, implicitclass: Prioritize Apple Raster against PWG Raster when selecting the PDL for the destination printer for a job sent to a cluster, also cleaned up the PDL selector code and added PostScript support. libcupsfilters: Updated the PPD generator adding all changes of the PPD generator of CUPS: Support for \"job-account-id\", \"job-accounting-user-id\", \"job-password\", finishing options \"trim-...\" added, finishing options and \"finishing-col-database\" support synced with CUPS. libcupsfilters: In the PPD generator get the mode for handling the back sides of the sheets when printing duplex preferably from the \"urf-supported\" attribute. libcupsfilters: Fixed bug that the PPD generator did not output the \"*CloseUI: *ColorModel\" line when it did not determine a default setting for \"ColorModel\". cups-browsed: Added some missing memory allocations leading to a segfault (Issue #175). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.26.0-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.26.0 released!",
+ "url": "/cups-filters-1.26.0-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Feature release, cups-browsed and driverless utility use DNS-SD-service-name-based URIs for IPP print queues now, like CUPS does. cups-browsed handles print jobs to clusters now while it is still creating local print queues. A lot of bug fixes on cups-browsed and the driverless utility",
+ "content": "This release adds some new features to cups-browsed and to the driverless utility: Both now use DNS-SD-service-name-based URIs for IPP print queues, like CUPS does. These URis are independent of network interfaces and ports and so make providing IPP services on the local machine (Printer Applications) easier. cups-browsed creates large numbers of local queues in portions now, so that it can treat jobs to print clusters between the portions, this makes printing more reliable in large networks with many printers. In addition, a lot of bugs got fixed. cups-browsed: When generating local queues for printers for which the local CUPS daemon would provide temporary queues use the PPDs generated by libcupsfilters and not the ones generated by CUPS. The PPD generation of libcupsfilters also works with IPP-1.x-only printers, printers which do not support to query \"media-col-database\" and printers which support driverless printing only via PCLm. This can be changed via the \"UseCUPSGeneratedPPDs\" directive in cups-browsed.conf (Issue #22). libcupsfilters: Re-structured the get_printer_attributes() function to remove the recursive calls for the fallbacks, to check required attributes in the response only if requested, and to fully integrate the method of getting a suitable response for a full printer capability list also if the printer is only IPP 1.1 or does not support the \"media-col-database\" attribute (Issue #22, Issue #163). libcupsfilters, cups-browsed, driverless: Moved the funtions get_printer_attributes() and resolve_uri() from cups-browsed into libcupsfilters, to share them with the driverless utility (Issue #22). implicitclass: Fixed wrong stdout redirection from the filters to the IPP backend and hard-coded path for \"ipp\" backend call (Possible fix for Issue #163, Issue #181). cups-browsed, driverless: Use DNS-SD-service-name-based URIs instead of host-name-based ones, as CUPS also does. In cups-browsed one can switch back to the conventional host-name-based URIs via the new \"DNSSDBasedDeviceURIs\" configuration option. Note that cups-browsed always uses conventional URIs for printers discovered via legacy CUPS browsing or LDAP. cups-browsed: When removing a CUPS queue, do not consider an error (and retry) if the queue does not actually exist. Also ignore errors when checking whether there are still jobs. This way when a new queue gets created and the generation of the PPD file fails the attempt to remove this non-existing queueu when removing the printer entry does not cause any problem. cups-browsed: Improved the fallback mechanism of the get_printer_attributes() function. Instead of considering the request failed by the content of the response only when not more than the two language atrributes come out, we check through a list of required attributes whether they are all there. In addition, we actually fail when all callbacks have failed (Issue #22). cups-browsed: Introduced new configuration options \"UpdateCUPSQueuesMaxPerCall\" and \"PauseBetweenCUPSQueueUpdates\" to limit the amount of local CUPS queues created, modified, or removed in a single event callback. Before, when there were thousands of printers in the network, cups-browsed got blocked for other tasks, like assigning a destination printer for a cluster print job (Issue #163). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.26.1-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.26.1 released!",
+ "url": "/cups-filters-1.26.1-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, to make the cups-browsed-generated local print queues actually work on all OS distributions and to get legacy (not actually designed for driverless IPP) printers better working",
+ "content": "Bug fix release, to make the cups-browsed-generated local print queues actually work on all OS distributions and to get legacy (not actually designed for driverless IPP) printers better working build system: Install the \"implicitclass\" backend with -rwx------ permissions, so that CUPS executes it as root, as the \"ipp\" CUPS backend also has to be executed as root (Issue #183). build system: Fixed setting permissions when installing the \"cups-brf\" backend. libcupsfilters: When using the \"media-{bottom,left,right,top}-margin-supported\" IPP attributes (needed if we have no \"media-col-database\"), use the minimum and not the maximum margins, this allows accessing more of the printer's capabilities, especially for legacy printers which do not provide sufficient information (Issue #22). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.26.2-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.26.2 released!",
+ "url": "/cups-filters-1.26.2-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release mainly to make cups-browsed correctly working with a CUPS daemon on a non-standard port, and also for cups-filters smoothly building with GCC 10",
+ "content": "Bug fix release mainly to make cups-browsed correctly working with a CUPS daemon on a non-standard port, and also for cups-filters smoothly building with GCC 10 cups-browsed: Added crash guards to avoid crashes in case the dummy printer entry for a deleted master entry is used. cups-browsed: Set the port of the local CUPS daemon to be used according to the IPP_PORT environment variable. cups-browsed: Eliminated the use of the cupsGetPPD2() function of libcups completely, also the remaining calls in the record_printer_options() and update_cups_queues() functions, the former causing incomplete recording of option settings and the latter use of CUPS-generated PPDs not working when CUPS is running on a non-standard port. cups-browsed: Eliminated the use of the cupsGetPPD2() function of libcups in queue_overwritten(). The function actually loads the queue's PPD file if the queue is on a local CUPS on port 631. Due to a bug the function fails if an alternative port is used. This lets queue_overwritten() always assume that the PPD got removed and therefore the queue got overwritten. So queues got released from cups-browsed if it was printed on them or if they were supposed to be removed on shutdown. foomatic-rip: Fixed compilation with -fno-common. Starting from the upcoming GCC 10, the default of the -fcommon option will change to -fno-common. This causes compilation errors in foomatic-rip due to missing \"external\" declarations (Pull request #184). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.27.0-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.27.0 released!",
+ "url": "/cups-filters-1.27.0-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "In this release cups-browsed does not need to know the port number of the CUPS daemon it is attached to any more when it connects via domain socket and many additional filters support zero-page jobs now",
+ "content": "In this release cups-browsed does not need to know the port number of the CUPS daemon it is attached to any more when it connects via domain socket and many additional filters support zero-page jobs now cups-browsed: Eliminate the use of the local CUPS daemon's (the CUPS we are attached to) port number completely, so that for attaching to an arbitrary local CUPS daemon listening on an arbitrary port (or even not listening on localhost at all) it is enough to tell cups-browsed the domain socket the CUPS daemon is listening on. cups-browsed, libcupsfilters: Identify DNS-SD-reported printers as of the local CUPS daemon via UUID and not via the port on which the local CUPS is listening, as we do not always have this port available. cups-browsed: Leave the port for legacy CUPS browsing and broadcasting on 631, do not use a possible alternative port of the CUPS we are attached to. The legacy CUPS servers we communicate with are always remote ones. libcupsfilters: in the PPD generator prioritize print-color-mode-supported against pwg-raster-document-type-supported (Issue #186, Pull request #188) rastertopdf, rastertops, texttopdf, pdftoraster, mupdftoraster: Handle zero page jobs, corrections on zero-page job handling (Issue #117) cups-browsed: When restarting after a crash make sure that local queue names have same upper/lower case as before. cups-browsed: Small code improvements to reduce crash probability. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.27.1-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.27.1 released!",
+ "url": "/cups-filters-1.27.1-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release - All filters support zero-page jobs now, option and choice names in PPDs are changed to work around a bug in CUPS when generating IPP attributes, cups-browsed creates queues for all emote IPP printers by default, and several smaller fixes in the filters",
+ "content": "Bug fix release: All filters support zero-page jobs now, option and choice names in PPDs are changed to work around a bug in CUPS when generating IPP attributes, cups-browsed creates queues for all emote IPP printers by default, and several smaller fixes in the filters libcupsfilters: Let the PPD generator not put any dashes into the PPD option and choice names when translating them from IPP attribute names, to avoid that on the back-translation by CUPS no double-dashes are generated. This broke paper tray selections with tray names like \"tray-1\", \"tray-2\", ... (Issue #192, Issue #201, Debian bug #949315). foomatic-rip: Fixed segfault when PRINTER environment variable is not supplied. pdftopdf, pdftops, gstoraster, gstopdf, gstopxl, rastertoescpx, rastertopclx, foomatic-rip: Handle zero-page jobs (Issue #117, Pull request #196, Pull request #197, Pull request #198, Pull request #200). texttopdf: Added support for CJK (double-width) fonts (Issue #135, Pull request #199). cups-browsed: Switched default for \"CreateIPPPrinterQueues\" from \"local-only\" to \"All\". The configure script options \"--enable-auto-setup-local-only\" and \"--enable-auto-setup-driverless-only\" can be used to change this default (Debian bug #921252). rastertoescpx: Fixed wrong freeing of a buffer. pdftops: Added options \"crop-to-fit\" and \"fill\" to the pdftopdf options which the pstops called by pdftops should not apply a second time. pdftops: Added missing \"-sstdout=%stderr\" to Ghostscript command line, to assure that all messages are redirected to stderr and do not mix up with the output data. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.27.2-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.27.2 released!",
+ "url": "/cups-filters-1.27.2-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, mainly to fix regressions cause by the zero-page-job-support implementation in foomatic-rip, also some code improvements in foomatic-rip and some crasher fixes in cups-browsed",
+ "content": "Bug fix release, mainly to fix regressions cause by the zero-page-job-support implementation in foomatic-rip, also some code improvements in foomatic-rip and some crasher fixes in cups-browsed foomatic-rip: In some PostScript input files it was possible that option settings did not get inserted or lines inserted on the wron place (Issue #208, Pull request #210). foomatic-rip: For the PDF page count call Ghostscript in sandbox mode and fix pointer arithmetics (Pull request #212). foomatic-rip: Zero-page-job handling changes made the last page of PostScript files not printed, also turning one-page jobs into zero-page jobs (Issue #200, Issue #206, Issue #208, Pull request #209, Pull request #210, Pull request #211). cups-browsed: check_printer_with_option() function: Initialize the value, add further checks, freeing memory and stop allocating magic numbers (Pull request #204). cups-browsed: Additional checks against crashes in the is_local_hostname() function (Ubuntu bug #1863716) More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.27.3-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.27.3 released!",
+ "url": "/cups-filters-1.27.3-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, fixing Ghostscript-based PDF page counting in foomatic-rip to work with all Ghostscript versions, building libfontembed tests with correct path to test font, re-sharing of remote CUPS queues with cups-browsed and others",
+ "content": "Bug fix release, fixing Ghostscript-based PDF page counting in foomatic-rip to work with all Ghostscript versions, building libfontembed tests with correct path to test font, re-sharing of remote CUPS queues with cups-browsed and others cups-browsed: Allow sharing local queues pointing to remote CUPS queues and re-sharing printers discovered via BrowsePoll by default, using AllowResharingRemoteCUPSPrinters and NewBrowsePollQueuesShared directives in cups-browsed.conf (Issue #101, Pull request #218). driverless: Correctly unlink temporary file when generating PPD file (Pull request #220). cups-browsed: Fixed memory leaks (Pull request #219). foomatic-rip: PDF page count side-loads the PDF file to count the pages in, so it cannot be run in -dSAFER mode. Run even in -dNOSAFER mode to override the -dSAFER default of newer Ghostscript versions. This should not cause a security problem as we do not take an input file which could do arbitrary side-loads but we run hard-coded PostScript commands instead (Issue #216). libfontembed: Add checks to the test programs to not segfault if the test font file is not found (Pull request #214). Build System: Let ./configure fail if the supplied test font file path (or the default) does not exist (Pull request #214), also use the \"find\" command to find the test font file DejaVuSans.ttf under /usr/share/fonts, as every distribution has it somewhere else. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.27.4-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.27.4 released!",
+ "url": "/cups-filters-1.27.4-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, several minor fixes and especially memory issues in cups-browsed",
+ "content": "Bug fix release, several minor fixes and especially memory issues in cups-browsed libcupsfilters, cups-browsed: Fix memory issues in ppdgenerator and cups-browsed (Pull request #226). pdftops: Mention cups-filters README instead of CUPS README in debug log (Pull request #225). pdftopdf, gstoraster, foomatic-rip: Use \"-dSAFER\" Ghostscript option, instead of the deprecated \"-dPARANOIDSAFER\" (Pull request #224). Build System: Replace '==' in configure.ac test with '=', as the former is a bashism (Pull request #222). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.27.5-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.27.5 released!",
+ "url": "/cups-filters-1.27.5-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Several fixes/improvements on cups-browsed, to correctly determine the CUPS server to attach to, to correctly create queues pointing to a second local CUPS instance, and to not remove the locally created queues on shutdown. Also included several bug fixes from contributors",
+ "content": "Several fixes/improvements on cups-browsed, to correctly determine the CUPS server to attach to, to correctly create queues pointing to a second local CUPS instance, and to not remove the locally created queues on shutdown. Also included several bug fixes from contributors cups-browsed: Do not remove the created local queues on shutdown, to avoid their re-creation on restart, so that desktops get no cluttered with notifications of new queues being created. One can return to the old behavior via \"KeepGeneratedQueuesOnShutdown No\" in cups-browsed.conf (Ubuntu bug #1869981, #1878241). cups-browsed: Do not accept DNS-SD broadcasts of IPPS type of \"remote\" CUPS queues of another CUPS instance on the local machine. This way we get a local queue pointing to such a printer only in unencrypted version (IPP). For some reason printing from one CUPS server to another on the same machine works only unencrypted. foomatic-rip: Map two-sided-short-edge to DuplexTumble (Pull request #236) Build system: In configure.ac use AS_IF instead of AC_CHECK_FILE for font check (Issue #239, Pull request #240) cups-browsed: Cleaned up code for determining to which CUPS server (host/port/domain socket) to connect, so that connection via DomainSocket cups-browsed.conf directive, CUPS_SERVER and IPP_PORT environment variables and all defaults and methods of libcups, including CUPS' client.conf work. gstoraster, rastertopdf: Do not pass NULL to fprintf() (Pull request #230). libcupsfilters: Silence compiler warning (Pull request #229). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.0-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.0 released!",
+ "url": "/cups-filters-1.28.0-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "IPPS and IPP Fax Out support in driverless, log file size limitation and more options for cups-browsed, tons of bug fixes",
+ "content": "Feature release (probably the last one before 2.0.0) which adds IPP Fax Out support, IPPS support, and a command line option to reveal satndard IPP URIs to the \"driverless\" utility, added log file size limitation and command line options to control what happens to generated queues on shutdown to cups-browsed, fixed several bugs when printing PostScript input files, several bugs and memory leaks in cups-browsed, crashes on the presence of certain fonts, and many more fixes. driverless, driverless-fax, libcupsfilters: Added IPP Fax Out support. Now printer setup tools list an additional fax \"driver\". A fax queue is created by selecting this driver. Jobs have to be sent with \"-o phone=12345\" to supply the destination phone number (Pull request #280). libfontembed: Silenced warning with gcc 10.x (Pull request #287). cups-browsed: Added ./configure options --enable-saving-created-queues and --with-remote-cups-local-queue-naming (Pull request: #253, #285). cups-browsed: Fixed several memory leaks, mainly from the code to merge printer IPP attributes for clusters (Pull request #281, #283). driverless: Added \"--std-ipp-uris\" command line option to show listed URIs in standard hostname-based form (not the CUPS DNS-SD-service-name-based form. Only for manual call of the utility, for debugging purposes (Pull request #277). libfontembed: Removed assert() calls which cause crashes when unsupported emoji fonts are installed (Issue #254, Pull request #276). driverless: Added support for IPPS (use \"ipps://...\" URIs if possible, Issue #251, Pull request #270, #273). gstoraster, gstopdf: When converting PostScript to PDF use the \"pdfwrite\" output device with \"-dPDFSETTINGS=/default\" instead of with \"-dPDFSETTINGS=/printer\". This reproduces bitmaps in the PostScript file with their original image quality (Issue #272). cups-browsed: Limit log file size and add backup file for previous log entries. Introduced the configuration option DebugLogFileSize in cups-browsed.conf to set the actual limit in kilobytes or 0 to get the old behavior of an unlimited size for the log file (Issue #260, Pull request #267). gstoraster, gstopdf: Do not apply margins when output format is PDF, as then we convert an incoming PostScript file to PDF (pre-pdftopdf) and do not prepare the pages for the printer (post-pdftopdf, Issue #250). cups-browsed: Do not write any log messages directly to stderr, there were some concerning timeouts on queue creation (Issue #260). Build system: Fix cross-compilation without DejaVu test font in configure.ac (Issue #262, Pull request #263). libcupsfilters: Respect the fact that PPD keywords are case-sensitive when adding \"*cupsManualCopies: True\" in PPD file (Issue #242). libcupsfilters: Older versions of libcups (< 2.3.1) had the enum name for fold-accordion finishings mistyped. Added a workaround. cups-browsed: Remove left-over local queues from the previous session more quickly when CUPS legacy browsing is turned on. cups-browsed: Left-over local queues from the previous session for which the corresponding remote printer did not appear again did not get removed as they were considered externally overwritten. gstoraster, gstopdf: Add option \"-dDoNumCopies\" to Ghostscript command line if we are outputting PDF (called via gstopdf wrapper) and the number of copies supplied to CUPS is 1 (4th command line argument). In this case we convert incoming PostScript to PDF and need to respect embedded PostScript commands to implement the number of copies (Issue #255, CUPS Issue #5796, OpenSUSE bug #1173345). imagetoraster: Potential null dereference fix (when no valid PPD is supplied, Pull request #256). cups-browsed: Call cupsGetNamedDest() only if \"OnlyUnsupportedByCUPS No\" Sample PPDs: Corrected ColorModel default for Generic PWG Raster PPD to Color (Pull request #247). cups-browsed: Mark the temp queue as cups-browsed-generated during setting printer-is-shared (Pull request #246). cups-browsed: Remove mentions of README and AUTHORS files in the man page (Pull request #244). Sample PPDs: In Generic-PDF_Printer-PDF.ppd add option to switch between color and grayscale printing (Pull request #237). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.1-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.1 released!",
+ "url": "/cups-filters-1.28.1-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release to fix several bugs in the new IPP Fax Out support by the \"driverless\" utility and also to fix some minor issues",
+ "content": "Bug fix release to fix several bugs in the new IPP Fax Out support by the \"driverless\" utility and also to fix some minor issues COPYING: Fixed several typos libcupsfilters: Fixed typo in log message of get_printer_attributes functions. cups-browsed: Fixed typos in configuration file and man page libcupsfilters: Let the PPD generator not suffix page size names with \".Borderless\" if all page sizes would get this suffix, for example for printers which generally print borderless. libcupsfilters: Added \"faxPrefix\" option for generated IPP Fax Out PPDs, so that this option also appears in print dialogs. driverless: List addresses for local services correctly when using \"--std-ipp-uris\" (with \"localhost\" hostname). driverless: Make calls of the ippfind utility somewhat faster, setting the timeout of ippfind to automatic. libcupsfilters: Resolve DNS-SD-based URIs for local services correctly (using hostname \"localhost\"). libcupsfilters: In get_printer_attributes() functions do not try to convert URIs which are not DNS-SD-based (Issue #294). libcupsfilters: In get_printer_attributes() functions also support URIs with \"dnssd://...\" scheme. libcupsfilters: Moved signal handling back into main function of the get_printer_attributes() variants, it got moved out accidentally. driverless: For generating a PPD, independent whether via \"driverless URI\" or \"driverless cat URI\", always allow CUPS driver URIs (prefixed with \"driverless: \" or \"driverless-fax:\") and pure IPP URIs. driverless: Accept clean IPP URIs also for 'driverless cat ...' (Issue #295, Pull request #296). driverless-fax: Do not use fixed path for call of driverless itself (Pull request #293). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.10-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.10 released!",
+ "url": "/cups-filters-1.28.10-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, more reliable CUPS browsing in cups-browsed, improved PDF printer PPDs, minor fixes",
+ "content": "Bug fix release: More reliable legacy CUPS browsing in cups-browsed, improved PDF printer sample PPDs, with borderless page sizes, eliminated unneeded dependency on DjVu font, minor fixes Sample PPDs: Add borderless page size definitions to Generic PDF Printer, HP Color LaserJet CM3530 MFP PDF, and Ricoh PDF Printer PPD files. Sample PPDs: From the PDF PPD files removed the unneeded \"*cupsFilters2: ...\" line. For CUPS it does not make any difference. libcupsfilters: Fixed pdftopdf filter to correctly support page ranges without upper limit, like \"10-\" (Pull request #399). libcupsfilters: Use wildcard tag (IPP_TAG_ZERO) search for \"media-type\" and \"media-type-supported\" in the PPD generator (Pull request #398). implicitclass, parallel: Added missing newlines at error messages. libfontembed: Removed unneeded fontembed/main.c and ttfread executable. Eliminates the dependency on DejaVuSans.ttf (Issue #386). gstoraster: Refactor the filter a little to clarify handling of page counts and set job-impressions for TotalPageCount in PWG-Raster header (Pull request #394). cups-browsed: Make NotifLeaseDuration configurable and renew after half the lease duration not 60 sec before end. The early renewal improves reliability on busy systems a lot. For easier development and debugging short durations from 300 sec on can get selected (Pull request #378). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.11-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.11 released!",
+ "url": "/cups-filters-1.28.11-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, containing backports of many of the bugs recently fixed during the preparation of the cups-filters 2.x release.",
+ "content": "Bug fix release, containing backports of many of the bugs recently fixed during the preparation of the cups-filters 2.x release. Important is that cups-browsed's queue naming is aligned with CUPS' temporary queue naming now and several bugs affecting driverless printing are fixed. libcupsfilters: Let PPD generator take default ColorModel from printer (CUPS issue #277). Braille: In vectortopdf check inkscape version to call inkscape with the correct command line (Issue #315, Pull request #443). Build system: Make missing DejaVuSans.ttf non-fatal in ./configure as the font is only needed for test programs, not for actual use of cups-filters (Issue #411). libcupsfilters: In imagetoraster() fixed crash with SGray (Issue #435). cups-browsed: Naming of local queues is matched to CUPS' current naming of temporary queues (no leading or trailing underscores), to avoid duplicates in print dialogs which support CUPS' temporary queues. libcupsfilters: Make cupsRasterParseIPPOptions() work correctly with PPDs (Issue #436). libcupsfilters: Let colord_get_profile_for_device_id() not return empty file name, to avoid error messages in CUPS error_log. foomatic-rip: Debug message was wrongly sent to stdout and not to log (Issue #422). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.12-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.12 released!",
+ "url": "/cups-filters-1.28.12-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, again backports of cups-filters 2.x, page geometry fixes for print-scaling and number-up, cups-browsed, serial backend",
+ "content": "Bug fix release, containing backports of many of the bugs recently fixed during the preparation of the cups-filters 2.x release. This time many page geometry bugs in the pdftopdf and imageto... filters were fixed especially with print-scaling and number-up, but also bugs in cups-browsed and in the serial backend got fixed. imagetoraster, imagetopdf: Fixed comparison of the image size with the page size for print-scaling=auto. The image size in pixels was compared with the page size in PostScript points (1/72 inch). imagetoraster, imagetopdf: Fixed the \"print-scaling=none\" (crop-to-fit) mode, also use crop-to-fit always when requested, do not fall back to fit-to-page when the image size differs significantly from the page size (Issue #362). libcupsfilters: Changed the default PPI resolution for images as input files from 128 to 200 (Pull request #446). implicitclass: Do not check availability of \"gs\" and \"pdftops\" executables, instead, check by the presence of \"gstoraster\" and \"pdftoraster\" filters whether we have configured cups-filters for Ghostscript and/or Poppler use. libcupsfilters: In the PPD generator for the driverless utility and cups-browsed add \"*cupsFilter2: ...\" lines for all supported driverless data formats (PDF, Apple/PWG Raster, PCLm), and add lines for legacy data formats (PCL, PostScript) only if no driverless formats available. libcupsfilters: Always use encryption for ipps. RFC7472 requires that 'ipps' must be used over HTTPS, but the driverless utility does not enforce encryption (Pull request #433). serial: Add a 10-msec sleep and at the end add a tcdrain(). For some unknown reason, every printing file need sleep a little time to make sure the serial printer receive data is right (Pull request #431). libcupsfilters: Fix resolver functions for DNS-SD-based URIs, to make resolve_uri() also work when DEVICE_URI env variable is set and to make ippfind_based_uri_converter() not re-direct stdin. pdftopdf: Set default for print-scaling to avoid \"should never happem\" log messages and undefined behavior. pdftopdf: Fix orientation-requested = 0. Consider this as \"automatic selection and not as error. pdftopdf: Fixed all combinations of print-scaling and number-up for printers with asymmetric margins (top != bottom or left != right) and for input files containing pages with different sizes and/or orientations. Fixes backported from 2.x branch. pdftopdf: Add 2% tolerance for input size larger than output page when \"print-scaling=auto\" or \"print-scaling=auto-fit\" is used and too large input pages should be scaled, fitting documents not. This prevents a random-looking behavior if input and output page size seem to be equal, but in reality there are slight differences between size dimensions. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.13-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.13 released!",
+ "url": "/cups-filters-1.28.13-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, for correct printing on printers which take in the paper long-edge-first and for Apple LaserWriter printers",
+ "content": "Bug fix release, for correct printing on printers which take in the paper long-edge-first and for Apple LaserWriter printers. pdftopdf: Fix N-up printing when paper is taken long-edge-first by the printer. pdftopdf: Fix cropping (\"print-scaling=none\" and \"print-scaling=fill\") when paper is taken long-edge-first by the printer (Issue #454). pdftops: Use Poppler for all Apple LaserWriter models (Issue #452). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.14-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.14 released!",
+ "url": "/cups-filters-1.28.14-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release to get correct PDF output when using \"landscape\", \"orientation-requested\", and/or \"nopdfAutoRotate\" options, and to get PCLm printing work on printers not telling their PCLM default resolution.",
+ "content": "Bug fix release to get correct PDF output when using \"landscape\", \"orientation-requested\", and/or \"nopdfAutoRotate\" options, and to get PCLm printing work on printers not telling their PCLM default resolution. pdftopdf: Correct the output when suppressing auto-rotation (option \"nopdfAutoRotate\"). Depending on the situation pages got cropped in the wrong orientation or de-centered. pdftopdf: Correct the output when the \"orientation-requested\" or the \"landscape\" option is supplied. Output could be de-centered (Issue #456), portrait-oriented pages be wrongly cropped and division of the output page into cells for N-up done in the wrong orientation. rastertopdf: In PCLm output mode the filter failed to generate PCLm if the printer has no \"pclm-source-resolution-default\" IPP attribute. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.15-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.15 released!",
+ "url": "/cups-filters-1.28.15-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, to make all HP LaserJet PostScript printers correctly work.",
+ "content": "Bug fix release, to make all HP LaserJet PostScript printers correctly work. pdftops: In pdftops identify old LaserJets more precisely for working around PostScript interpreter bugs, older printers need Poppler, newer models need Ghostscript (Ubuntu bug #1967816). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.16-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.16 released!",
+ "url": "/cups-filters-1.28.16-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, to make images be printed in their original size with \"print-scaling=none\" and to not use deprecated data types for reading TIFF images.",
+ "content": "Bug fix release, to make images be printed in their original size with \"print-scaling=none\" and to not use deprecated data types for reading TIFF images. imagetoraster, imagetopdf, libcupsfilters: Added support for reading the resolution of an image from its EXIF data when loading it. This way we get the image reproduced in its original size with \"print-scaling=none\" (Issue #362). libcupsfilters: Replaced deprecated data types uint16 and uint32. The function to read TIFF image files via libtiff in cupsfilters/image-tiff.c uses the deprecated types uint16 and uint32. The replacements for these types are uint16_t and uint32_t. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.17-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.17 released!",
+ "url": "/cups-filters-1.28.17-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, to more reliably discover all printer capablities from driverless printers, especially borderless printing, and to preferably use Apple Raster instead of PWG Raster or PCLM",
+ "content": "Bug fix release, to more reliably discover all printer capablities from driverless printers, especially borderless printing, and to preferably use Apple Raster instead of PWG Raster or PCLM. libcupsfilters: In PPD generator create only one *cupsFilter2: line for raster. Only use the most desirable/reliable format, usually Apple Raster (Issue #498). libcupsfilters: In get_printer_attributes() poll media-col-database separately if needed. On some printers one gets media-col-database only this way. Often it reveals important functionality, like for example borderless printing (Issue #492). libcupsfilters: Let PPD generator also parse media-col-ready IPP attribute. media-col-ready lists the loaded media, in contrary to media-ready, as list of complete descriptions of the media (media-col data structure). This often lists also variants like borderless (it is the same physical paper). Especially useful when media-col-database is not available (Issue #492). libcupsfilters: In generate_sizes() consider all margin alternatives. When generating the PPD file for a driverless printer, and in the media-{left,right,top,bottom}-margin-supported printer IPP attributes there was more than 1 value, the first value (which often was the 0 for borderless printing) was not considered, leaving the borderless functionality of many printers undiscovered (Issue #492). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.2-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.2 released!",
+ "url": "/cups-filters-1.28.2-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release to mainly fix cups-browsed not shutting down and the driverless utility being slow when listing available printers/faxes",
+ "content": "Bug fix release to mainly fix cups-browsed not shutting down and the driverless utility being slow when listing available printers/faxes driverless: Free allocated memory, use MAX_OUTPUT_LEN (Pull request #304). driverless: driverless: Make the two ippfind tasks(for IPP and IPPS) run in parallel (Pull request #302, #305, #306). braille: Support new liblouis tables not containing a display name (Pull request #303) Build system: Let ./configure not error out when there is more than one DejaVuSans.ttf test font candidate (Issue #300). cups-browsed: Crash when a remote printer set as default gets removed, due to missing variable in printf() call (Issue #299). libcupsfilters: Removed all signal handling and global variables from get_printer_attributes() and ippfind_based_uri_converter(). This is overkill for these quick operations and causes problems when shutting down cups-browsed (Issue #298). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.3-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.3 released!",
+ "url": "/cups-filters-1.28.3-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release to sove problems caused by an inconsistency between the resolvers for DNS-SD-based URIs",
+ "content": "Bug fix release to sove problems caused by an inconsistency between the resolvers for DNS-SD-based URIs libcupsfilters, cups-browsed: Fixed inconsistency between resolvers for DNS-SD-based URIs, resolve_uri() and ippfind_based_uri_converter(). Now both return a freeable string. libcupsfilters: Fix uninitialized buffer and parsing ippfind output in ippfind_based_uri_converter() function (Issue #308, Pull request #309). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.4-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.4 released!",
+ "url": "/cups-filters-1.28.4-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, mainly to solve CUPS performance problems caused by the IPP fax support of the \"driverless\" utility",
+ "content": "Bug fix release, mainly to solve CUPS performance problems caused by the IPP fax support of the \"driverless\" utility driverless: Avoid duplicate PPD list entries from the same device via UUID driverless: Reduce ippfind calls by \"driverless\" and \"driverless-fax\"called by CUPS. Let \"driverless list\" list both print and fax PPDs and \"driverless-fax list\" do nothing. driverless: Avoid duplicate listings in printer discovery, by \"driverless-fax\" not listing any URI as \"driverless\" lists them all already. driverless: Vastly improve performance by doing only one ippfind call instead of two (IPP, IPPS) as ippfind accepts more than one reg type on the command line. Sample PPDs: Corrected manufacturer name in Fuji_Xerox-DocuPrint_CM305_df-PDF.ppd. More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.5-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.5 released!",
+ "url": "/cups-filters-1.28.5-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release for a quick, potential crasher correction in cups-browsed",
+ "content": "Bug fix release for a quick, potential crasher correction in cups-browsed cups-browsed: UUID from IPP response was used after its pointer was freed by ippDelete() (Pull request #311). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.6-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.6 released!",
+ "url": "/cups-filters-1.28.6-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, especially memory leaks and performance of cups-browsed, but also on the PPD generator and foomatic-rip",
+ "content": "Bug fix release, fixing lots of memory leaks in cups-browsed, fixed cups-browsed hanging several seconds when there are local print queue with invalid DNS-SD-based URIs, several fixes on the PPD generator for IPP printers, taken from OpenPrinting's fork of CUPS, and fixing bugs on foomatic-rip libcupsfilters: In generated PPDs add a grayscale mode if there are only color printing modes (from OpenPrinting CUPS). libcupsfilters: In generated PPDs add an \"OutputBin\" option also if it has only one choice (OpenPrinting CUPS pull request #18). libcupsfilters: Generated PPDs could have an \"Unknown\" default InputSlot (OpenPrinting CUPS issue #44). cups-browsed: Removed unneeded IPP attribute additions preventing the created local queues from preserving a location or description the user assigns to them (Issue #323). cups-browsed: Removed all calls of the resolve_uri() function of libcupsfilters, as these are not actually needed and in case the supplied DNS-SD-based URI is not resolvable, the function gets stuck for ~5 seconds. cups-browsed: Fixed several memory leaks, mainly from the code to merge printer IPP attributes for clusters (Pull request #322). cups-browsed: Silenced compiler warning. foomatic-rip: Fix infinite loop and input from file on raw printing (Pull request #318). foomatic-rip: Remove temporary file created during pdf-to-ps conversion (Pull request #313). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.7-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.7 released!",
+ "url": "/cups-filters-1.28.7-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release to remove the support quality check from the \"driverless\" utility to do not break CUPS' PPD listing facility and several fixes for generating PPDs for driverless printers",
+ "content": "Bug fix release to remove the support quality check from the \"driverless\" utility to do not break CUPS' PPD listing facility and several fixes for generating PPDs for driverless printers driverless: Removed the support quality check from Pull request #235 as it takes significant time for each printer being listed, making cups-driverd (lpinfo -m) timing out when there are many printers (OpenPrinting CUPS issue #65). libcupsfilters: In the PPD generator give priority to Apple Raster against PDF (Issue #331). libcupsfilters: Added NULL check when removing \".Borderless\" suffixes from page size names (Issue #314, Pull request #328). libcupsfilters: In the cupsRasterParseIPPOptions() map the color spaces the same way as in the PPD generator (Issue #326, Pull request #327). libcupsfilters: Fixed addition of grayscale mode in generated PPD files, to avoid duplicate entries (OpenPrinting CUPS issue #59). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.8-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.8 released!",
+ "url": "/cups-filters-1.28.8-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bugfix release, to fix several different issues",
+ "content": "Bug fix release, to fix several different issues libcupsfilters: Made check whether the driverless PPD to generate should be a fax out PPD more reliable (Issue #343). foomatic-rip: Options in the 5th command line argument of the CUPS filter command line are separated only by white space and not by comma, also make sure that an option \"none\" is not considered a custom page size (Issue #348). implicitclass: Raise timeout for cups-browsed's answer from 20s to 60s (Pull request #346). libcupsfilters: In the PPD generator really give priority to Apple Raster against PDF (Issue #331). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-1.28.9-released",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters 1.28.9 released!",
+ "url": "/cups-filters-1.28.9-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Bug fix release, fixes backported from the master (2.x) branch",
+ "content": "Bug fix release, fixes backported from the master (2.x) branch. libcupsfilters: Silenced compiler warnings libcupsfilters: Removed duplicate code in the apply_filters() function. driverless: If there are no driverless IPP printers available let \"driverless\" terminate with exit code 0 and not 1, to follow CUPS' standard of backends in discovery mode terminating with 0 if there are no appropriate printers found (Issue #375). gstoraster, foomatic-rip: Fixed Ghostscript command line for counting pages as it took too long on PDFs from evince when printing DjVu files (Issue #354, Pull request #371, Ubuntu bug #1920730). cups-browsed: Renamed ldap_connect() due to conflict in new openldap (Issue #367, Pull request #370). pdftoraster: Free color data after processing of each page (Pull request #363). cups-browsed: Always save \"...-default\" option entries from printers.conf, regardless of presence or absense of PPD file (Pull request #359). cups-browsed: Start after network-online.target (Pull request #360). texttopdf: Set default margins when no PPD file is used (Pull request #356). More Details and Download"
+ },
+ {
+ "id": "post:cups-filters-Second-Generation-Final-2.0.0-Release",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters Second Generation - Final 2.0.0 Release!",
+ "url": "/cups-filters-Second-Generation-Final-2.0.0-Release",
+ "headings": [
+ "libppd Postscript Parsing Heap Overflow (CVE-2023-4504)",
+ "Miscellaneous fixes",
+ "libcupsfilters",
+ "libppd",
+ "cups-filters",
+ "cups-browsed",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "Now it is there! The 2.0.0 release! Security vulnerability fix and final bug fixes",
+ "content": "Now, in the last 3 months, we got only few bug reports, and a security vulnerability in CUPS, in code which got overtaken into libppd, and therefore the vulnerability is also there. To get the security fix into a release and 3 months being a long time after RC2 I am finally releasing 2.0.0 right now. From the bug report: The ppd_scan_ps() function in the libppd code base provides functionality that scans through a string looking for the next Postscript object. When iterating through a string which contains an open parenthesis and ends with a single backslash (0x5c) character, the code incorrectly iterates forward a character without properly checking the bounds of the string resulting in a 1 byte read beyond the allocated heap buffer. This is fixed by adding the missing NULL check when, after a backslash was read, the character escaped by the backslash is read. A few other bugs got reported and fixed since RC2. These fixes are also included. See the lists below. And here are the lists of all the changes in detail: cfFilterUniversal(): Support application/vnd.cups-postscript Some filters (like hpps from HPLIP) produce this MIME type, so if the client uses a classic driver/Printer Application and the server IPP Everywhere, jobs fail because the library is not able to find a suitable conversion (Pull request #31). CHANGES.md: Added reference to Chromium bug report. INSTALL: We need Ghostscript 10.01.1 to get all changes for Raster output ppd_scan_ps(): Fix CVE-2023-4504 Added check for end of buffer/string when reading escaped character after backslash, return NULL (invalid string) if no character follows. Promoted the static function \"ppd_decode()\" of ppd/ppd.c into the API function \"ppdDecode()\". ppdEmitJCLPDF(): Decode \"JCLToPDFInterpreter\" value in ppdEmitJCLPDF() Fixes \"classic\" (non-driverless) PDF printing (Issue #24). ppdLoadAttributes(): Apply cfIEEE1284NormalizeMakeModel() to NickName Make and model for the printer IPP attributes are extracted from the PPD's NickName, which sometimes misses the manufacturer's name. Extract it from the PPD's Manufacturer field or derive it from the model name if possible. Enhanced alternative for pull request #21. Makefile.am: Fix disabling testppdfile Missing conditionals made the binary built when disabled (Pull request #18). universal: Enable application/vnd.cups-postscript as input There are filters which produce this MIME type (such as hpps of HPLIP), and if someone uses such driver on a client and the server has an IPP Everywhere/driverless printer, the job fails (Pull request #534, requires libcupsfilters 2.0.0). Ensure we always send a valid name to remove_bad_chars() In case the found queue is a CUPS remote queue shared via DNS-SD, the rp_value can be without '/', which leads to cups-browsed crash if it is set to create the local queue based on the remote name (Pull request #13). Use description/location from server if available, otherwise from client When we create a local queue we first check whether we actually got description and location strings from the remote server/printer, if they are empty we do not set empty strings but use the IPP attributes saved locally for our local queue. This way, if the server does not provide description/location and the user sets their own, that one is conserved through reboots and daemon restarts (Issue #16). libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got implemented."
+ },
+ {
+ "id": "post:cups-filters-Second-Generation-First-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters Second Generation - First Beta Release!",
+ "url": "/cups-filters-Second-Generation-First-Beta-Release",
+ "headings": [],
+ "tags": [],
+ "snippet": "cups-filters is now split into 5 sub-repositories and we have released the first beta of the 2.x series",
+ "content": "We now finally completed the first beta of the second generation of cups-filters! The cups-filters project is now split into several parts, similar to CUPS on its transition to the 3.x series. There are the following parts: libcupsfilters: The central library with the filter functions and some useful functions for printer drivers, human-readable strings and translation handling for IPP attributes, ... It does not contain any support for PPD files. libppd: PPD file support library providing the complete support for PPD files from libcups (2.x and earlier, see ppd/ppd.h), the CUPS PPD compiler and utilities (ppdc, see ppd/ppdc.h) and functions to convert PPD Options into IPP attributes, to add PPD file support to the filter functions of libcupsfilters, to handle collections of PPD files, ... This library is only for legacy PPD and driver support, it should not motivate anyone to create new PPD files! cups-filters: Legacy CUPS filter/backend executables for CUPS 2.x. Uses both libcupsfilters and libppd. Any XXXtoYYY filters, foomatic-rip, driverless, ... braille-printer-app: The Braille embosser driver code plus Chandresh Soni's GSoC work to turn this code into a Printer Application. cups-browsed: Daemon to automatically create local print queues for network printers and remote CUPS queues and to create printer clusters. Will be turned into a Printer Application later (GSoC project?). libcupsfilters is completely free of PPD file support, same for braille-printer-app. libcupsfilters can be used for all kinds of Printer Applications and wherever print data or scanned data has to get converted. The Braille Printer Application is a native Printer Application, it does not use PPD files internally. libppd contains the complete PPD file support for Printer Applications which retro-fit PostScript PPD files or classic CUPS drivers. These Printer Applications are usually created based on pappl-retrofit. Distributions using the New Architecture for printing and scanning will not install libppd by default, as it is not needed any more. cups-filters provides the filter executables needed by CUPS 2.x or earlier. Most executables are just simple wrappers and all the internal workings have moved into the filter functions in libcupsfilters, and the PPD file support into libppd. This package requires libppd, but it is for PPD-based classic CUPS versions only anyway. cups-browsed is currently supporting and generating PPD files (for CUPS 2.x), and therefore also depending on libppd. In a later version, when it is turned into a Printer Application, the PPD file support will be removed. An important goal of the separation is to put all PPD support in their own project so that they can get discontinued later and this way we can easily stop maintaining the PPD file support code while all the other useful code of the former cups-filters will live on. libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got committed."
+ },
+ {
+ "id": "post:cups-filters-Second-Generation-Release-Candidate-2",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters Second Generation - Release Candidate 2!",
+ "url": "/cups-filters-Second-Generation-Release-Candidate-2",
+ "headings": [
+ "cups-browsed 100% CPU!",
+ "The Unsupported Resolution Attack!!",
+ "All-Snap Ubuntu Desktop",
+ "libppd sync-up with CUPS",
+ "First Vulnerability Report",
+ "libcupsfilters",
+ "libppd",
+ "cups-filters",
+ "cups-browsed",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "Now we are really close - Resolution handling, mirrored output, no output at all, beh vulnerability, cups-browsed 100% CPU, libppd vs. CUPS sync",
+ "content": "After the cups-filters 2.x release party in Brno (Ubuntu 23.04 and Fedora 38 with 2.0rc1) there also came the first bug reports from users. And together with other fixes a lot of stuff came together, so I decided to issue a second release candidate before actually landing the final. First bug report coming up was that cups-browsed is taking up between 25% and 100% of one CPU core (Ubuntu bug #2018504). Especially my colleagues complained about this when we were all meeting for a week at Canonical's Engineering Sprint two weeks after the Ubuntu 23.04 release (and one of them posted this bug report), and after we were all home again nobody was able to reproduce it any more. Fortunately there were other users able to reproduce this bug and so we do not need to wait for the next Engineering Sprint in November to get it fixed. Even not able to reproduce it by myself I investigated the workflow, especially after multi-threading got introduced. And there I found that if during creation or update of a local print queue the destination IPP printer cannot get accessed a global variable is set, to stop the loop of updating all local queues and remove the local queue whose destination got lost. Main problem was that the variable did not get reset, so all future update loops got immediately stopped, without even a first update being done, and as the updates still were due, the loop got immediately started again, causing a busy loop for the rest of the life of the cups-browsed process. To fix this, I have simply done away with this variable altogether and simply mark the printer as disappeared for the local queue be removed in the next updating round. This is my original design and was already done with multi-threading in mind. What actually happened on the Engineering Sprint was that I have a lot of shared printers on my laptop, of the Printer Applications I am developing and testing, and when I left our team's meeting room for a meeting with other people, the shared printers got unaccessible for the colleague's laptops and the bug showed up ... There were also some Ubuntu and Fedora users reporting bugs on printing, starting from uglinesses like all jobs coming out mirrored, or, the more ecological way, nothing coming out at all, up to unsupported resolution attacks. The unsupported resolution attack was performed by the Chromium Browser, sending jobs with resolution=96dpi option and these getting printed as garbage by CUPS. It was not intended to save ink by printing less pixels, but simply a bad choice for a default resolution when no resolution info is provided by the PPD and also missing support for PPD files with only *DefaultResolution=... but no \"Resolution\" option. The Chromium developers have fixed that on the Chromium side, but the final solution is on the way. The reporter of the bug also reported the problem to us and made us aware that we do not ignore unsupported resolutions and simply rasterized in them, instead of, as with other job attributes/options, to ignore unsupported values. Now this is fixed to defend our users against such attacks from applications. And, once investigating our resolution handling, I have fixed also some other resolution-related bugs to get more consistent behavior and especially resolution settings in the pseudo-PostScript code of non-\"Resolution\" options of the PPDs (like \"cupsPrintQuality\") being respected. During the development work on the all-Snap Ubuntu Desktop my colleagues started to test the CUPS Snap (which is included in the installation image but not in the immutable operating system core) amd we found out that cups-browsed broke printing when restoring saved printer settings and attributes due to a CUPS bug with the print-quality attribute, making CUPS setting the invalid default velue \"0\" when it receives any invalid value and not simply ignoring that inquiry (and logging an error). We work around this CUPS problem now by not saving and restoring printer IPP attribute default for the local queues any more (the PPD option defaults should be good enough). The development of libppd, a library which conserves all of CUPS' PPD file support for retro-fitting Printer Applications before it gets removed from CUPS in the 3.x generation, started nearly exactly 3 years ago. Now in these 3 years after grabbing CUPS' PPD supporting code for libppd a lot has happened with CUPS and also this code received several bug fixes (including some memory leaks) and also even small feature additions by adding extra attributes to generated PPDs so that CUPS can better support all IPP functionality of all driverless printers. I have overtaken these changes now to be in sync with CUPS. Especially retro-fitting Printer Applications now always list all media types of the PPD file! And last, but not least, our second release candidate contains the fix for our first security vulnerability reported via GitHub. It was the beh CUPS backend (Backend Error Handler) allowing to execute arbitrary commands by supplying jobs with forged job titles. The backend is not that often used, but this was also a nice case to find out how to handle any reported vulnerability (which made me writing a tutorial). And here are the lists of all the changes in detail: Ignore unsupported resolution values when preparing a Raster header via cfRasterPrepareHeader() function, to avoid rasterization with wrong resolution (Issue #29, Ubuntu bug: #2022929, Chromium issue #1448735). cfRasterPrepareHeader(): When taking default resolution from urf-supported printer IPP attribute, use first value (lowest) of the list, to match the ppdLoadAttributes() function of libppd. cfIPPAttrResolutionForPrinter(): List of resolutions is not IPP_TAG_RANGE, corrected the search to use IPP_TAG_ZERO. cfIEEE1284NormalizeMakeModel(): Do not consider \"XPrinter\" as made by Xerox, only \"XPrint\" is (OpenPrinting CUPS pull request #506). INSTALL: Recommend QPDF 11.4.0 as it fixes loss of content filled into interactive forms as (Issue #28). INSTALL: Fixed some typos. ppdFilterPSToPS(): Fixed reverse output order. When converting the former pstops CUPS filter into the filter function, some function calls got wrongly replaced by new ones, resulting in no output at all when the input should be re-arranged into reverse order. This broke printing with all PostScript printers (and proprietary CUPS drivers needing PostScript as input) which do reverse-order by default (Issue #20, Ubuntu bug #2022943). Fixed resolution handling when converting PPDs to printer IPP attributes For PWG/Apple Raster or PCLm output resolutions in job options or pseudo-PostScript code in the PPD get ignored and instead, the lowest resolution of the description of the Raster format used in the PPD file gets always used, which reduced output quality (Ubuntu bug #2022929). ppdFilterLoadPPD(): Actually create sample Raster header also for Apple/PWG Raster All PPD files with \"MirrorPrint\" option cuased mirrored printout If a PPD contains an option \"MirrorPrint\", the ppdFilterLoadPPD() sent the option mirror=true to the filter functions, regardless of the actual setting of \"MirrorPrint\" (which is usually \"False\" by default), making all jobs coming out with mirrored pages (Ubuntu bug #2018538). PPD file generator: Put *cupsSingleFile: True into generated PPD as some driverless IPP printers do not support multi-file jobs (CUPS issue #643). Add CUPS PPD attributes *cupsLanguages: ... and *cupsStringsURI ... to generated PPDs so that CUPS loads printer-specific option names and translations from the printer and uses them without need of static translations in the PPD file. CUPS renames the PPD option choice name \"Custom\" to \"_Custom\" when a fixed choice is named as such, to distinguish from CUPS' facility for custom option values. We do now the same when loading PPD files. Prevent duplicate PPD->IPP media-type name mappings, now we do not have dropping of some media types in the Printer Applications any more. When not specifying a media source and the page size is small (5x7\" or smaller) do not request the photo tray but auto instead. Do not override color settings from print dialog (\"ColorModel\") with print-color-mode setting. Make ppdFilterPSToPS() recognize %%PageRequirements: DSC comment. Correctly display \"Xprinter\" instead of Xerox for Xprinter devices Fix the job-pages-per-set value (used to apply finishings correctly) for duplex and N-up printing. Make the testppd build test program also work if it is started from an environment with non-English locale. Minor bug fixes, silencing warnings (especially of clang), fixing typos in comments, coding style, ..., and also some fixes for memory leaks. beh backend: Use execv() instead of system() - CVE-2023-24805 With execv() command line arguments are passed as separate strings and not the full command line in a single string. This prevents arbitrary command execution by escaping the quoting of the arguments in a job with forged job title. beh backend: Extra checks against odd/forged input - CVE-2023-24805 Do not allow / in the scheme of the URI (= backend executable name), to assure that only backends inside /usr/lib/cups/backend/ are used. Pre-define scheme buffer to empty string, to be defined for case of URI being NULL. URI must have :, to split off scheme, otherwise error. Check return value of snprintf() to create call path for the backend, to error out on truncation of a too long scheme or on complete failure due to a completely odd scheme. beh backend: Further improvements - CVE-2023-24805 Use strncat() instead of strncpy() for getting scheme from URI, the latter does not require setting terminating zero byte in case of truncation. Also exclude . or .. as scheme, as directories are not valid CUPS backends. Do not use fprintf() in sigterm_handler(), to not interfere with a fprintf() which could be running in the main process when sigterm_handler() is triggered. Use static volatile int for global variable job_canceled. parallel backend: Added missing #include lines Fixed cups-browsed getting stuck in busy loop When the function create_queue() fails to create a local print queue and the failure is not intermittent, it sets a global variable to stop the main thread's loop for updating local queues. With the variable not reset no queue updates happened ever again and cups-browsed fell into a busy loop taking up to 100% CPU. We have solved this by doing away with the variable and simply mark these printers as disappeared (Ubuntu bug #2018504). Do not record *-default IPP attributes of local CUPS queues Many of the *-default IPP attributes represent properties already covered by the PPD option defaults which we also record. In addition, there is also print-quality-default where IPP reports draft, normal, and high settings while CUPS only accepts 3, 4, and 5, and on everything else it sets print-quality-default=0 which is invalid and jobs do not get printed. So we stop saving and loading these attributes. Build system: Removed unnecessary lines in Makefile.am Removed the TESTdir and TEST_SCRIPTS entries in Makefile.am. They are not needed and let make install try to install run-tests.sh in the source directory, where it already is, causing an error. run-tests.sh: Use pkgconfig instead of deprecated cups-config (Pull request #9). libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got implemented."
+ },
+ {
+ "id": "post:cups-filters-Second-Generation-Release-Candidate",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters Second Generation - Release Candidate!",
+ "url": "/cups-filters-Second-Generation-Release-Candidate",
+ "headings": [
+ "libcupsfilters",
+ "libppd",
+ "cups-filters",
+ "cups-browsed",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "Release approaching - Page orientation, image scaling, text in landscape, 16-bit color and 1-bit mono, API adjustment for libcups3, color on color printers fast ...",
+ "content": "Now we are finally coming to the final release of the components of the second generation of cups-filters, version 2.0.0. This means going through open bug reports and pull requests, looking for what can get fixed and merged, checking whether the work from the assignments given to GSoC contributor candidates during the selection process got actually included, ... Also one or another bug report motivates to do further, more intense and systematic testing, as for example GSoC candidate Sourabh Sav did not find a way to suppress auto-rotation of an image when one prints it. This made me discover that the orientation-requested attribute was mostly not working with our filter functions and I tested systematically to make it working as expected everywhere, and so not only stopped auto-rotation when desired but also gave full control about orientation of images and text, even discovered that one could not layout plain text input in landscape orientation on the sheet. Now this is all fixed and working. The beta releases being included in Ubuntu 23.04 helped on finding bugs, too, as for example in Ubuntu bug #2014976 a user has a driverless color printer for which cups-browsed auto-creates a print queue. The printer takes too long to print the pages and also prints grayscale by default. The grayscale was caused by libppd's PPD file generator for driverless printers not auto-selecting color as default color mode option when the printer's IPP response reports \"auto\" (commit). The slow printing was caused by cups-browsed's implicitclass CUPS backend choosing PDF as output format when the printer in addition supports the much more reliable Apple Raster (commit). This is all fixed in the Release Candidate which today made it in time into Ubuntu 23.04 before tomorrow's Final Freeze (release Thursday next week). And the Release Candidate is the stage when the API has to be finalized. Having given the addition of libcups 3.x support to libcupsfilters as an assignment to GSoC contributor candidate Gayatri Kapse I have found out that we are using 2 dirty workarounds to convert a DNS-SD-based device URI for IPP printers into a standard host-name-based device URI. These 2 had both their own API functions. As the new libcups will finally have a proper API function for this task I have adapted the API already now, despite the libcups3 support will actually be added only in versions 2.1.0 of all the components. And here are the lists of all the changes in detail: Make orientation-requested work correctly In the filter functions cfFilterImageToRaster(), cfFilterImageToPDF(), cfFilterTextToPDF(), and cfFilterPDFToPDF() supplying the attributes orientation-requested or (no)landscape do the expected, rotating content 0/90/180/270 degrees. Auto-rotation is always done in the printer's default direction, +90 or -90 degrees as described by the landscape-orientation-requested-preferred IPP attribute or by the \"*LandscapeOrientation: ...\" PPD keyword (via libppd). The ppi attribute works correctly now,no cropping and using more than one sheet if the image gets too large. If more than one image-scaling-related attribute is supplied, only the one with the highest priority is used, no mixing with unexpected results. Default is always print-scaling=auto. cfFilterTextToPDF() is now capable of printing text in landscape layout, controlled by the orientation-requested and landscape attributes. The prettyprint attribute of the cfFilterTextToPDF() now uses wider margins for binding/stitching/punching as originally designed. If the printer has even wider margins this is taken into account. cfFilterImageToRaster(), cfFilterImageToPDF(), cfFilterTextToPDF(), and cfFilterPDFToPDF() all work now correctly also with no printer attributes/capabilities supplied at all, and also with and without supplying a page size. With PDF input the input page sizes are used if applicable. As last mean we resort to US Letter page size (Issue #26). The cfFilterUniversal() filter function now considers the output of cfFilterImageToPDF() correctly as application/vnd.cups-pdf and not as application/pdf, avoiding duplicate application of margins or rotation. cfFilterImageToRaster() now produces 16-bit-per-color output if requested by the job/printer, and does not output a blank page any more (Issue #25, pull request #22). On 1-bit dithered output white background got a grid of dots An off-by-one bug in cfOneBitLine() made white areas appear with a grid of black dots (1 per 16x16 square). This corrected now (Issue #20). DNS-SD device URI resolution: Cleaned API for upcoming libcups3 support. For resolving DNS-SD-service-name-based device URIs for IPP printers as CUPS uses them, libcups2 does not offer any useful API and we therefore ended up implementing 2 workarounds. As libcups3 has an API function for it we have adapted our API for its use (libcups3 support will get actually added in version 2.1.0). Cleaned up the image scaling and rotation code in cfFilterImage...(), removing duplicate code and doing some simplification. cfFilterImageToPDF() could crash when an image could not get loaded and print-scaling was set to fill or none, as a part of the image processing was not covered by the NULL check. cfFilterUniversal(): Added NULL checks for parameters, so that the function can get called without parameters. Added -std=c++17 C++ compiler flag (Pull request #18) Needed to build libcupsfilters with QPDF 11. Removed unneeded #include entries for libcups PPD generator for driverless printers: Set default color mode when printer attrs say \"auto\" Actual printer default color mode did not get set and then often \"Gray\" got set for color printers. Now we always choose the \"best\" mode (Ubuntu bug #2014976). ppdLoadAttributes(): Find default page size also by dimensions Some PPDs can contain the same page size twice with different names, whereas the PWG cache created from the PPD contains each size only once. This could make the default size not being found when the PPD is converted to IPP attributes. Now we search also by size and not only by name (Caused Ubuntu bug #2013131). PPD generator for driverless printers: Add *LandscapeOrientation: according to the landscape-orientation-requested-preferred printer IPP attribute. ppdFilterLoadPPD(): Corrected PPD attribute name so that for printers which receive PWG Raster a sample Raster header gets created. Make the testppdfile utility getting built and installed by default. Improved formatting of reports generated by ppdTest(). foomatic-rip: Fix a SIGPIPE error when calling gs (Pull request #517) Ubuntu's autopkgtest for foo2zjs shows foo2zjs's testsuite failing with cups-filters 2.0beta3 only on the ppc64el architecture. This is cause by a timing issue in foomatic-rip which is fixed now. Coverity check done by Zdenek Dohnal for the inclusion of cups-filters 2.x in Fedora and Red Hat. Zdenek has fixed all the issues: Missing free(), files not closed, potential string overflows, ... Thanks a lot! (Pull request #510). Dropped all C++ references and obsolete C standards (Pull requests #504 and #513) With no C++ compiler needed, there is no need for any checks or setting for C++ in configure.ac. configure.ac: Change deprecated AC_PROG_LIBTOOL for LT_INIT (Pull request #508) Prefer sending jobs in Apple Raster instead of in PDF If a destination printer supports both PDF and Apple Raster, and if it is not a remote CUPS queue, prefer sending the job in Apple Raster, as printers print this more reliably (Ubuntu bug #2014976) run-tests.sh: Let emulated printers support PDF input To test that cups-browsed prefers Apple Raster when the printer supports both PDF and Apple Raster as input format, we let the printers emulated by ippeveprinter also support PDF. implicitclass backend: NULL-initialize filter data field for Raster header We are running a filter chain without PPD file, so we do not have Raster header, so initialize it to NULL. libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got implemented."
+ },
+ {
+ "id": "post:cups-filters-Second-Generation-Second-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters Second Generation - Second Beta Release!",
+ "url": "/cups-filters-Second-Generation-Second-Beta-Release",
+ "headings": [
+ "libcupsfilters",
+ "libppd",
+ "cups-filters",
+ "General",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "First round of bug fixes, for page size handling, translation support, build systems, source code documentation",
+ "content": "During creation of the Debian/Ubuntu packages for the components of the 2nd-generation cups-filters and also during the further development of the Common Print Dialog Backends (CPDB) some bugs were discovered which are fixed now. Also the adaptation of the source code documentation files to the individual components was not yet complete. So there were many things to fix and these fixes are now available in the second beta release. Filter functions did not handle the page size correctly when no printer IPP attributes are supplied (in case of classic CUPS filter no PPD file). Now if a page size is supplied with the job, this one is simply used, otherwise the sizes of the input pages and as a last mean US Letter. In the cfCatalog...() API for obtaining human-readable strings and translations of attribute/option and choice names, we added suport for specifying the user's UI language now, to receive the requested strings in the correct language, and not only human-readable strings in English. In the cfCatalog...() API also removed the const qualifiers from output string pointers as these strings get allocated by the functions. Let API header files catalog.h and ipp.h not include config.h. Fixed building libcupsfilters with and without libpoppler. By default, libpoppler is used, to not use it, supply the --disable-poppler option to ./configure. Unnecessary ./configure options for the former PDF-to-PostScript filter function (has moved to libppd as ppdFilterPDFToPS) which were forgotten during the separation, are removed now. All AC_DEFINE macro calls in configure.ac got corrected, setting the macros in config.h really to 1 after testing positive. libcupsfilters does not use glib, removed the check in configure.ac. In libcupsfilters.pc.in added libqpdf under Libs.private. In the PPD file generator for driverless printing with CUPS we now support more than 2 resolutions in Apple Raster/AirPrint. The urf-supported IPP attribute was only parsed correctly when its RS part had only 1 or 2 and not more resolutions specified. We have corrected now for an arbitrary amount of resolutions, taking the lowest for \"draft\", the highest for \"high\" and one in the middle for \"normal\" print quality. Update cfCatalogLoad() calls for API change in libcupsfilters. In libcupsfilters we have added language/translation support to the cfCatalog...() API functions via OpenPrinting/libcupsfilters#2. This changes the cfCatalogLoad() calls in libppd (both in the PPD generator for driverless printing). For a quick solution we supply NULL as language for now, resembling the old behavior. We look into language support in the PPD generator later. ppdFilterEmitJCL(): Added NULL check for PPD not being supplied. Classic CUPS filters created based on filter functions using ppdFilterCUPSWrapper() and also filter functions of libppd (ppdFilter...()) should also work without PPD file and not crash if no PPD file is supplied. Make build of genstrings optional. genstrings is only a development tool for the PPD compiler, not a user tool, therefore we make its build optional. Corrected installation path for include files for *.drv files. The PPD compiler ppdc (and underlying functions) of libppd searches for include files in /usr/share/ppdc and not in /usr/share/cups/ppdc any more. Tons of fixes in the source code documentation: README.md, INSTALL, DEVELOPING.md, CONTRIBUTING.md, COPYING, NOTICE, ... Adapted the files to the individual components, added links. Include NOTICE in distribution tarballs In configure.ac added foreign to to AM_INIT_AUTOMAKE() calls. Makes automake not require a file named README. Removed the empty README files. Cleaned up .gitignore libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got committed."
+ },
+ {
+ "id": "post:cups-filters-Second-Generation-Third-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "cups-filters Second Generation - Third Beta Release!",
+ "url": "/cups-filters-Second-Generation-Third-Beta-Release",
+ "headings": [
+ "libcupsfilters",
+ "cups-filters",
+ "General",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "More bug fixes, especially for those discovered during the distro packaging, mainly in build system and source code documentation.",
+ "content": "During creation of the Debian, Ubuntu, and Red Hat packages for the components of the 2nd-generation of cups-filters and also during the investigation of reported issues some more bugs got discovered and fixed. Especially in all the component's source code tarballs the LICENSE file was missing, which is a problem for Linux distributions using the packages. Now all license- and copyright-relevant files, AUTHORS, COPYING, LICENSE, and NOTICE are included in the source tarballs of all the 4 components. Also unnecessary dependencies, remaining from the times when everything was only a single repository, and overlooked during the separation, got removed, especially in libcupsfilters. And minor functional glitches and shortcomings, discovered by users (using cups-filters 1.x but the problem continued in 2.x) and by Debian´s and Ubuntu's automatic testing during package build (autopkgtest), got spotted and fixed. cfFilterGhostscript(): Select correct ICC profile for PCL-XL. When using the cfFilterGhostscript() filter function to generate PCL-XL (PXL, PCL 6, Ghostscript output devices \"pxlmono\", \"pxlcolor\") output, always the color IPP profile srgb.c was used, also for monochrome output (\"pxlmono\") and this makes Ghostscript error out. Now we correctly select sgray.icc for monochrome output. cfGetPrinterAttributes(): Poll media-col-database separately if needed. Some printers are not able to handle a get-printer-attributes request querying both the all group attribute and the media-col-database attribute, so query the latter with a separate call in such cases. cfGenerateSizes(): Also parse the media-col-ready IPP attribute for page sizes and margins. This often reveals extra margin variants, like borderless. Removed public cfPDFOut...() API (cupsfilters/pdfutils.h). This API only makes sense if the API of fontembed is also public, but this we made private earlier. Build system, README.md: Remove unnecessary dependencies overlooked during the separation: zlib (only needed by libppd), Freetype (not needed any more after removal of pdftoopvp), Avahi and GLib (both only needed by cups-browsed). Thanks a lot, Zdenek Dohnal (Pull request #7). COPYING, NOTICE: Added copyright year 2023 COPYING, NOTICE, AUTHORS: Added Jai Luthra and Vikrant Malik texttopdf: Do not include fontconfig.h in the CUPS filter wrapper Build system: Do not explicitly check for libpoppler-cpp The cups-filters package does not contain any code using libpoppler-cpp, therefore we let ./configure not check for it. Add templates for issue reports on GitHub. This makes a selection screen appear when clicking \"New Issue\" in the web UI, to select whether the issue is a regular bug, a feature request, or a security vulnerability. COPYING, NOTICE: Simplification for autotools-generated files autotools-generated files can be included under the license of the upstream code, and FSF copyright added to upstream copyright list. Simplified COPYING appropriately. Makefile.am: Include LICENSE in distribution tarball libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-filters: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion Note that braille-printer-app will only be released once the conversion to a Printer Application got committed."
+ },
+ {
+ "id": "post:hp-printer-app-1.3.0",
+ "source": "static",
+ "type": "post",
+ "title": "HP Printer Application 1.3.0",
+ "url": "/hp-printer-app-1.3.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "HP Printer Application v1.3.0 adds support for snap server configuration settings and updates the builds.",
+ "content": "HP Printer Application v1.3.0 adds support for snap server configuration settings and updates the builds. Changes include: Switched to using a configure script. Updated documentation for current PAPPL. Added support for snap server configuration settings (Issue #21) Updated macOS and Linux binaries to use PAPPL 1.4.x. Enjoy! Download HP Printer Application v1.3.0 Install HP Printer Application Snap Home Page "
+ },
+ {
+ "id": "post:ippusbxd-1.34-released",
+ "source": "static",
+ "type": "post",
+ "title": "ippusbxd 1.34 released!",
+ "url": "/ippusbxd-1.34-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "This release is mainly to improve the DNS-SD advertising to equal the one of the network mode of the device and also to advertise its AirScan scanning capabilities, but we also have some communication and code base improvements.",
+ "content": "This release is mainly to improve the DNS-SD advertising to equal the one of the network mode of the device and also to advertise its AirScan scanning capabilities, but we also have some communication and code base improvements. DNS-SD-advertise the devices capabilities based on polling the device via IPP (printing and send-fax part) and via HTTP (eSCL scanning part, if available), the records now contain the same information as the DNS-SD records which the printer broadcasts through its network connection Improved code base by formatting, header files, comments in the header files, and improving debug output Added exponential backoff for print read requests when printer's responses are empty for saving resources and reducing log file spam Apparmor: Matched path when bin and sbin directories are merged More Details and Download"
+ },
+ {
+ "id": "post:libcups-3.0.0",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0.0",
+ "url": "/libcups-3.0.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0.0 is the first stable release of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0.0 is the first stable release of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Added cupsLangIsRTL API. Added cupsOAuthGetDeviceGrant, cupsOAuthGetJWKS, and cupsOAuthGetUserId APIs. Added httpGetCookieValue and httpGetSecurity APIs. Added an \"install\" sub-command to the cups-x509 command. Added a \"--user-agent\" option to the ipptool command. Updated documentation (Issue #113) Updated the cupsOAuth APIs to support sharing of some OAuth values between the system (root) and per-user cache values. Updated the cupsJWTNew API to accept an optional JSON claims object. Updated the httpSetCookie API to support multiple \"Set-Cookie:\" header values. Updated ippfind to use the cupsGetClock API. Updated ippeveprinter to include all ready and supported attributes and values in the environment when processing a job. Fixed ipptransform media handling to preserve input document dimensions when \"media\" or \"media-col\" are not specified (Issue #102) Fixed cupsJSONExport functions with empty arrays or objects. Fixed httpGetDateTime for dates in the far future (Issue #124) Fixed input checks for cupsCreateCredentials and cupsCreateCredentialsRequest APIs (Issue #125) Fixed return values of ippDateToTime when the timezone isn't GMT. Fixed a potential timing issue with cupsEnumDests. Fixed a bug in the Avahi implementation of cupsDNSSDBrowseNew. Fixed a memory leak in httpClose. Fixed some Coverity-detected issues. Fixed support for device authorization grants. Enjoy! Download v3.0.0 "
+ },
+ {
+ "id": "post:libcups-3.0b1",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0b1",
+ "url": "/libcups-3.0b1",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0b1 is the first beta release of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0b1 is the first beta release of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Documentation updates (Issue #32) Split out libcups and tools from CUPS 2.x. Simplified the configure script. Now require a C99-capable C compiler. Now require GNU TLS, LibreSSL, or OpenSSL. Now require ZLIB. Now require POSIX or Windows threading support. Now require the poll function (WSAPoll on Windows). Now install with a prefix by default to allow coexistance with CUPS 2.x (Issue #21) Added new GENERATE-FILE directive for ipptool test files. Added new ATTR-IF-DEFINED and ATTR-IF-NOT-DEFINED directives to IPP data files (Issue #3) Added ippFile API for working with IPP data files as used by ipptool, ippexeprinter, and other tools (Issue #14) Added a roll to the default color ippeveprinter printer. Added new DNS-SD API (Issue #19) Added new PWG media sizes. Added new WITH-ALL-VALUES-FROM predicate for ipptool files (Issue #20) Added new SAVE-ALL-CONTENT, WITH-ALL-CONTENT, and WITH-ALL-MIME-TYPES predicates for ipptool files (Issue #22) Added, modernized, and promoted the localization interfaces to public API (Issue #24) Added public JSON API (Issue #31) Added new basename variable for use in ipptool files (Issue #44) Updated the CUPS API for consistency. Fixed ipptool's handling of EXPECT for member attributes (Issue #4) Fixed ipptool's support for octetString values (Issue #23) Removed all obsolete/deprecated CUPS 2.x APIs. Removed (obsolete) Kerberos support. Removed support for SecureTransport (macOS) due to deprecation of the platform API. Removed support for SChannel (Windows) due to restrictions on its use in domain accounts. Enjoy! Download v3.0b1 "
+ },
+ {
+ "id": "post:libcups-3.0b2",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0b2",
+ "url": "/libcups-3.0b2",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0b2 is the second beta release of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0b2 is the second beta release of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Added the ipptransform command to replace/upgrade the ippevepcl and ippeveps commands (Issue #65) Added cupsFormDecode and cupsFormEncode APIs (Issue #49) Added cupsJWT APIs to support JSON Web Tokens (Issue #50, Issue #52) Added ippAddCredentialsString and ippCopyCredentialsString APIs (Issue #58) Added cupsCreateCredentialsRequest and cupsSignCredentialsRequest APIs and updated cupsCreateCredentials API to better support X.509 certificates (Issue #59) Updated the configure script to add _FORTIFY_SOURCE=3 (previous level was 2) when not using address sanitizer and when it hasn't already been added (Issue #51) Updated the httpAddrListen function to use the maximum backlog value. Fixed ipptool limit on the size of an attribute value that would be printed (Issue #5) Fixed some configure script issues (Issue #48) Fixed JSON output bug in ipptool. Fixed CUPS_DNSSD_IF_INDEX_LOCAL when using Avahi. Enjoy! Download v3.0b2 "
+ },
+ {
+ "id": "post:libcups-3.0rc1",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0rc1",
+ "url": "/libcups-3.0rc1",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0rc1 is the first release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0rc1 is the first release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Added cupsFormatString and cupsFormatStringv APIs to safely format UTF-8 strings. Added support for per-user instances of cups-locald (Issue #69) Added httpConnectURI API. Added \"end\" argument to cupsParseOptions API. Renamed httpReconnect to httpConnectAgain. Updated cupsDestInfo to accept a cups_dest_flags_t argument. Updated cupsCopyString and cupsConcatString APIs to safely terminate UTF-8 strings. Updated list of attributes included in the destination options. Updated cupsAddIntegerOption and cupsGetIntegerOption to use the long type. Updated httpAddrConnect() to handle POLLHUP together with POLLIN or POLLOUT. Updated the various tool man pages, usage output, and examples. Updated ippCreateRequestedArray for the Get-Documents and Get-Output-Device-Attributes operations. Updated ipptool to validate IPP, PDF, and .strings files using the \"WITH-[ALL-]CONTENT\" predicate (Issue #87) Now use installed PDFio library, if available. Now use NotoSansMono font for ipptransform text conversions. Brought back IPP/2.x and related conformance test files (Issue #85) The ipptransform program now supports uncollated copies. Fixed GNU TLS crash. Fixed PCL output from ipptransform (Issue #72) Fixed JSON output from ipptool. Fixed hang/crash in cupsEnumDests/cupsGetDests (Issue #74) Fixed encoding of IPv6 addresses in HTTP requests (Issue #78) Fixed encoding of IPP_TAG_EXTENSION values in IPP messages (Issue #80) Fixed error handling when reading a mixed 1setOf attribute (Issue #83) Fixed non-quick copy of collection values. Fixed error handling in cupsConnectDest. Fixed TLS negotiation using OpenSSL with servers that require the TLS SNI extension. Fixed a certificate loading issue with OpenSSL. Fixed cupsAreCredentialsValidForName with OpenSSL. Fixed how ippeveprinter responds to an unsupported request character set. Enjoy! Download v3.0rc1 "
+ },
+ {
+ "id": "post:libcups-3.0rc2",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0rc2",
+ "url": "/libcups-3.0rc2",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0rc2 is the second release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0rc2 is the second release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Updated httpConnectAgain to re-validate the server's X.509 certificate (Issue #90) Updated the source tarball script to include the PDFio sources. Fixed handling of empty resolution values passed to ipptool (Issue #63) Fixed a compressed file error handling bug (Issue #91) Fixed the default User-Agent string sent in requests. Fixed a recursion issue in ippReadIO. Enjoy! Download v3.0rc2 "
+ },
+ {
+ "id": "post:libcups-3.0rc3",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0rc3",
+ "url": "/libcups-3.0rc3",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0rc3 is the third release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0rc3 is the third release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Updated cupsCreateCertificateRequest to store the new private key separately. Updated cupsSaveCredentials to validate the input credentials, support using a saved private key from cupsCreateCertificateRequest, and support credential removal as documented. Updated the raster functions to report more issues via cupsRasterGetErrorString. Fixed a crash bug on Windows. Enjoy! Download v3.0rc3 "
+ },
+ {
+ "id": "post:libcups-3.0rc4",
+ "source": "static",
+ "type": "post",
+ "title": "libcups v3.0rc4",
+ "url": "/libcups-3.0rc4",
+ "headings": [],
+ "tags": [],
+ "snippet": "libcups v3.0rc4 is the fourth release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs.",
+ "content": "libcups v3.0rc4 is the fourth release candidate of the CUPS v3 library and tools which remove deprecated APIs, add new APIs, and normalize existing APIs. Changes include: Added cupsCopyCredentialsPublicKey API. Added cupsGetClock API. Added cupsJWTLoadCredentials API. Added \"client.conf\" man page. Added cups-oauth and cups-x509 utilities (Issue #108) Updated documentation (Issue #99) Updated cupsDNSSD APIs on Windows (Issue #29) Updated the ipptool utility to support the --bearer-token and --client-name options. Updated cupsOAuthGetMetadata to support Microsoft Azure/Entra OAuth servers. Updated ipptransform to support generation of PCLm output in addition to PWG Raster data. Updated cupsEnumDests and cupsGetDests to support printer browsing and filtering options in client.conf (Issue #106) Fixed handling of finishings/finishings-col and media/media-col in the ippeveprinter tool (Issue #95) Fixed a duplicate printer reporting bug in cupsGetDests. Fixed handling of NULL path in cupsSaveCredentials API. Fixed handling of default authorization strings. Fixed validation of dateTime values with time zones more than UTC+11. Enjoy! Download v3.0rc4 "
+ },
+ {
+ "id": "post:libcupsfilters,-libppd,-cups-filters-2.1.0-Releases-including-vulnerability-fix",
+ "source": "static",
+ "type": "post",
+ "title": "libcupsfilters, libppd, cups-browsed - 2.1.0 Releases including vulnerability fixes",
+ "url": "/libcupsfilters,-libppd,-cups-filters-2.1.0-Releases-including-vulnerability-fix",
+ "headings": [
+ "Contained security fixes",
+ "New features since 2.0.0",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "All available fixes of recent RCE and DoS vulnerability CVEs included, also libcups3 support and filter workflow testing.",
+ "content": "These releases, skipping the beta phases, are quick releases after having fixed most of the security bugs making up a Remote Code Execution (RCE) vulnerability reported some weeks ago and a DoS vulnerability reported somewhat later. I had posted in detail here. The fixes provided by these releases are sufficient to prevent the described exploits, but there is still the bug of arbitrary command lines being allowed to be used by foomatic-rip, CVE-2024-47177, which will get fixed in both the 1.x and 2.x branches of cups-filters in the next days. cups-filters 1.29.0 and 2.1.0 will get released once this fix is in place. libcupsfilters CVE-2024-47076: cfGetPrinterAttributes5() does not validate or sanitize the IPP attributes returned from an IPP server, providing attacker-controlled data to the rest of the CUPS system (GHSA) Fix libppd CVE-2024-47175: ppdCreatePPDFromIPP2() does not validate or sanitize the IPP attributes when writing them to the PPD file, allowing the injection of attacker-controlled data into the resulting PPD (GHSA) Fix cups-browsed CVE-2024-47176: cups-browsed binds on UDP INADDR_ANY:631 trusting any packet from any source to trigger a get-printer-attributes IPP request to an attacker-controlled URL (GHSA) CVE-2024-47850: cups-browsed (before 2.5b1?) will send an HTTP POST request to an arbitrary destination and port in response to a single IPP UDP packet requesting a printer to be added. The request is meant to probe the new printer but can be used to create DDoS amplification attacks (on non-printer devices). This is a different vulnerability than CVE-2024-47176 but the remedy is the same, turning off or removing legacy CUPS browsing support in cups-browsed (GHSA) Preliminary fix turning off CUPS browsing in configuration file Final fix removing CUPS browsing and LDAP support libcupsfilters Support for building with libcups3, CUPS library of CUPS 3.x. Support for building with libcups of CUPS 2.5.x (Issue #36) CI/build/unit testing of filter functions using a table of test cases, each with input file, input and output formats, option settings, allows especially to create regression test cases based on reported bugs Convert INSTALL to INSTALL.md (Pull request #45) Add GitHub workflow for Canonical Open Documentation Academy OpenPrinting is participating in Canonical's Open Documentation Academy, as an organization in need of documentation. The workflow is still experimental and serves for auto-forwarding documentation-related issues. libppd Support for building with libcups3, CUPS library of CUPS 3.x (Pull request #27) Convert INSTALL to INSTALL.md (Pull request #34) cups-browsed Removed support for legacy CUPS browsing and for LDAP Legacy CUPS browsing is not needed any more and, our implementation accepting any UDP packet on port 631, causes vulnerabilities, and our LDAP support does not comply with RFC 7612 and is therefore limited. Fixes CVE-2024-47176 and CVE-2024-47850 as mentioned above libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion cups-browsed: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:libcupsfilters-and-libppd-Second-Generation-Forth-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "libcupsfilters and libppd Second Generation - Forth Beta Release!",
+ "url": "/libcupsfilters-and-libppd-Second-Generation-Forth-Beta-Release",
+ "headings": [
+ "libcupsfilters",
+ "libppd",
+ "General",
+ "Packages"
+ ],
+ "tags": [],
+ "snippet": "Coverity scans and appropriate fixes, QPDF 11+ compatibility, cupstestppd successor, lots of bug fixes",
+ "content": "Continuing the packaging for Debian, Ubuntu, and Red Hat distributions more bugs got found and fixed. First, Zdenek Dohnal from Red Hat has run all the components of the new generation of cups-filters through Coverity and found several bugs: Memory leaks, files not closed, possible string overflows, ... He fixed all these bugs in the upstream code. This assures reliability and security of all the new components, especially if being part of permanently running daemons. Thanks a lot, Zdenek! During the selection process for contributors for the Google Summer of Code 2023 we give some assignments to the candidates, usually reported bugs, but also other code-related work items which occur at OpenPrinting. This way we got some bugs fixed, from users reporting that their printer does not work in driverless mode or something wrong or nothing comes out as the printout. Especially with one candidate, having gotten assigned a bug report about the PostScript Printer Application not preventing the use of malformed, user-supplied PPD files, we realized that we did not transfer CUPS' valuable command line tool cupstestppd into libppd. This the candidate has done yet, as the library function ppdTest(), easily callable from a PPD-retrofitting Printer Application. libcupsfilters got updated to work with the latest version of QPDF (11) as building it showed a lot of warnings about the use of deprecated functions in QPDF. Now it should be ready for the upcoming QPDF 12. Do not free cf_image_t data structure in _cfImageZoomDelete() (cups-filters issue #507) The library-internal _cfImageZoom...() API does not create the cf_image_t data structure, so it should not free it, to avoid double-free crashes. This made the cfFilterImageToRaster() filter function (imagetoraster CUPS filter) crash. cfImageOpenFP(): Removed leftover HAVE_LIBZ conditionals In the 3rd beta we have removed the dependency on libz from the build system as there is no explicit dependency on it in libcupsfilters. Having forgotten to remove HAVE_LIBZ from the conditionals in cfImageOpenFP() PNG images were rendered as blank pages. See cups-filters issue #465. Compatibility with QPDF 11 and later Replaced deprecated PointerHolder with shared_ptr (PR #13) cfFilterPDFToPDF(): Replaced deprecated QPDF function name replaceOrRemoveKey by replaceKey. Set CXXFLAGS=\"-DPOINTERHOLDER_TRANSITION=0\" to silence QPDF warnings. INSTALL: Explain dependencies (PR #10) Transfer CUPS' cupstestppd utility to ppdTest() library function The valuable tool got forgotten in the first place, now it is available as ppdTest() library function and testppdfile command line utility. The command line utility only gets installed with ./configure called with --enable-testppdfile argument. In auto-generated PPDs do not set RGB default on mono printers (CUPS Issue #614) When a PPD for a driverless printer is generated by the ppdCreatePPDFromIPP() function and the get-printer-attributes IPP response gives \"print-color-mode-default=auto\" the PPD's default setting for \"ColorModel\" is always \"RGB\", even on monochrome printers, which makes printing fail on most devices. Now we ignore the \"print-color-mode-default\" if set to \"auto\". ppdLoadAttributes(): Added NULL check for missing PPD PageSize default Some PPDs, even \"everywhere\" PPDs generated by CUPS for a driverless IPP printer do not have a valid default value for the default page size, like \"Unknown\". Added a NULL check to avoid a crash by such PPD files. testppd: String got freed too early In this test program run by make check a string was used after already gotten freed. Discovered via a compiler warning, but program could have actually crashed. Coverity check done by Zdenek Dohnal for the inclusion of libppd in Fedora and Red Hat. Zdenek has fixed all the issues: Missing free(), files not closed, potential string overflows, ... Thanks a lot! configure.ac: Change deprecated AC_PROG_LIBTOOL for LT_INIT (PR #12) libcupsfilters: More Details and Download, Discussion libppd: More Details and Download, Discussion"
+ },
+ {
+ "id": "post:lprint-1.1.0",
+ "source": "static",
+ "type": "post",
+ "title": "LPrint 1.1.0",
+ "url": "/lprint-1.1.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "LPrint v1.1.0 adds support for EPL and 600dpi ZPL label printers, adds several auto-connfiguration and status reporting improvements, and fixes all known bugs in the previous release.",
+ "content": "LPrint v1.1.0 adds support for EPL and 600dpi ZPL label printers, adds status reporting and automatic label configuration for ZPL label printers, adds auto-setup and test labels for printers, adds system service files for macOS and Linux, and fixes all known bugs in the previous release. Changes include: Switched to PAPPL (Issue #20, #35) Fixed lprint default and lprint delete not working (Issue #17, Issue #40) Fixed server crashes on SIGINT (Issue #18) Fixed the reported date and time information when no printers were added (Issue #26) Fixed a startup bug on macOS (Issue #34) Now support auto-detection of printer drivers and auto-add USB printers the first time LPrint is run. Added the missing macOS binary package (Issue #33) Added launchd and systemd service files for running lprint as a service. Added support for Zebra/Eltron EPL2 printers (Issue #38) Added support for 600dpi ZPL thermal transfer printers. Added support for ZPL status/ready media updates. Added support for test pages. Temporarily removed support for DYMO LabelWriter Wireless printer (Issue #23) Enjoy! Download LPrint 1.1.0 Install lprint Snap Home Page "
+ },
+ {
+ "id": "post:lprint-1.2.0",
+ "source": "static",
+ "type": "post",
+ "title": "LPrint 1.2.0",
+ "url": "/lprint-1.2.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "LPrint v1.2.0 adds support for snap configuration and EPL/ZPL auto-typing support, and fixes a number of bugs.",
+ "content": "LPrint v1.2.0 adds support for snap configuration and EPL/ZPL auto-typing support, and fixes a number of bugs. Changes include: Documentation corrections (Issue #53, Issue #76) Added snap server configuration. Added --with-systemd configure option and install to $prefix/lib/systemd/system by default (Issue #50) Added EPL2 and ZPL auto-typing support (Issue #64) Changed the default log level for systemd to info (Issue #82) Fixed macOS installer to start LPrint server (Issue #48) Fixed configure script not using warning/preprocessor options in build (Issue #60) Fixed printer renaming algorithm to not truncate the name (Issue #60) Fixed missing \"print-color-mode=bi-level\" for bar code printing (Issue #76) Fixed label mode support in EPL and ZPL drivers (Issue #79) Fixed driver names for EPL printers (Issue #52) Enjoy! Download LPrint 1.2.0 Install lprint Snap Home Page "
+ },
+ {
+ "id": "post:lprint-1.3.0",
+ "source": "static",
+ "type": "post",
+ "title": "LPrint 1.3.0",
+ "url": "/lprint-1.3.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "LPrint v1.3.0 adds a new dithering algorithm, support for new printers, support for configuration files, and fixes a number of bugs.",
+ "content": "LPrint v1.3.0 adds a new dithering algorithm, support for new printers, support for configuration files, and fixes a number of bugs. Changes include: Added new dithering algorithm to better support barcode printing with shaded content. Added experimental Brother printer support (Issue #15) Added basic TSPL printer support (Issue #54) Added basic SEIKO printer support (Issue #58) Added experimental Zebra CPCL printer support. Added support for configuration files in \"/etc\", \"/usr/local/etc\", or \"/Library/Application Support\" (macOS). Updated ZPL driver to report 'media-needed' reason when out of labels during a job. Fixed copies support for ZPL printers (Issue #100) Fixed darkness calculations for EPL and ZPL printers (Issue #104) Enjoy! Download LPrint 1.3.0 Install lprint Snap Home Page "
+ },
+ {
+ "id": "post:lprint-1.3.1",
+ "source": "static",
+ "type": "post",
+ "title": "LPrint 1.3.1",
+ "url": "/lprint-1.3.1",
+ "headings": [],
+ "tags": [],
+ "snippet": "LPrint v1.3.1 is a bug fix release.",
+ "content": "LPrint v1.3.1 is a bug fix release. Changes include: Updated \"print-speed\" support in TSPL driver (Issue #120 and #121) Fixed lprint-modify man page (Issue #122 and #126) Fixed snap documentation for connecting LPrint to Avahi. Enjoy! Download LPrint 1.3.1 Install lprint Snap Home Page "
+ },
+ {
+ "id": "post:pappl-1.0.0",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL v1.0.0",
+ "url": "/pappl-1.0.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL is a simple C-based framework/library for developing CUPS Printer Applications, which are the recommended replacement for printer drivers.",
+ "content": "The first stable release of PAPPL is now available for download. PAPPL is a simple C-based framework/library for developing CUPS Printer Applications, which are the recommended replacement for printer drivers. Download PAPPL v1.0.0 Home Page Changes in 1.0.0 include: papplSystemLoadState would not load printers whose device IDs contained the # character (Issue #92) Passing \"auto\" for the driver name would cause a crash if there was no auto- add callback. Added papplPrinterGetPath API to get the path for a printer web page (Issue #97) The papplPrinterAddLink and papplSystemAddLink functions now accept an \"options\" argument instead of the \"secure\" boolean in order to allow links to be added to multiple places on the web interface in addition to requesting a secure (HTTPS) link (Issue #98) Enjoy!"
+ },
+ {
+ "id": "post:pappl-1.1.0",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.1.0",
+ "url": "/pappl-1.1.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.1.0 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10.",
+ "content": "PAPPL v1.1.0 is now available for download. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. Enjoy! Download v1.1.0 "
+ },
+ {
+ "id": "post:pappl-1.1b1",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.1b1",
+ "url": "/pappl-1.1b1",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10.",
+ "content": "The first beta release of PAPPL v1.1 is now available for download. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. Changes include: Added support for Windows 10 and higher. Added PAPPL_SOPTIONS_NO_TLS option to disable TLS support. Added Wi-Fi callbacks to support configuration over IPP-USB (Issue #45) Added buttons and sub-commands to pause and resume printers (Issue #124) papplMainLoop now uses a persistent location for state and spool files by default (Issue #128) papplMainLoop now supports clients talking to a system-wide server running as root (Issue #148) Added a \"set default\" button to the web interface (Issue #150) The drivers sub-command now reports the IEEE-1284 device ID for a given driver (Issue #157) Jobs can now be canceled and printers deleted when a processing job is trying to connect to a printer (Issue #163) The default media is now updated if the ready media for a given tray is updated (Issue #164) Fixed an issue with the \"drivers\" sub-command not working if you don't have a system callback. Fixed a deadlock issue on macOS. Added a new papplJobCreateWithFile API to allow printer applications to submit print jobs internally. Refactored the papplSystem hostname/port APIs to be consistent with the naming used for the papplClient APIs. Enjoy! Download v1.1b1 "
+ },
+ {
+ "id": "post:pappl-1.1b2",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.1b2",
+ "url": "/pappl-1.1b2",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10.",
+ "content": "The second beta release of PAPPL v1.1 is now available for download. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto- add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. Changes in 1.1b2 include: Added support for papplDeviceGetID with network devices (Issue #95) Added support for the \"compression\" option. Added English names for Tabloid and A3 media sizes in the web interface. Added \"server-hostname\" and \"listen-hostname\" server options to the default mainloop system callback. Fixed support for default printers, added indicator in web interface (Issue #182) Fixed support for printers with spaces in their names. Fixed the \"jobs\" subcommand. Fixed support for page-ranges. Fixed support for printers that do PDF beyond converting it to raster. Fixed support for mainloop subcommands on Windows. Fixed error message when Bonjour for Windows is not installed. Enjoy! Download v1.1b2 "
+ },
+ {
+ "id": "post:pappl-1.1b3",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.1b3",
+ "url": "/pappl-1.1b3",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto-add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10.",
+ "content": "The third beta release of PAPPL v1.1 is now available for download. PAPPL v1.1 adds support for Wi-Fi configuration, IPP-USB, printer driver lookup and auto- add functionality, improves management of multiple printers, and adds support for Microsoft® Windows® 10 and higher. Changes in 1.1b3 include: Added a new papplSystemSetAuthCallback API to support alternate authentication mechanisms (Issue #185) Added papplCreateTempFile and papplPrinterOpenFile file creation functions (Issue #186) Added support for a server-options option for the server sub-command (Issue #187) Added an optional callback for processing USB gadget print data. Added papplCopyString, papplGetRand, and papplGetTempDir utility functions. Calling papplSystemSetHostName did not also update the default TLS common name. Now map file:///dev/null to NUL: on Windows. Enjoy! Download v1.1b3 "
+ },
+ {
+ "id": "post:pappl-1.2.0",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.2.0",
+ "url": "/pappl-1.2.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.rc1 adds full localization, support for additional IPP features, and some other improvements.",
+ "content": "PAPPL v1.2.0 is now available for download. PAPPL v1.2 adds full localization, support for additional IPP features, and some other improvements. Changes in 1.2.0 include: Added papplMainloopShutdown API to trigger a shutdown of the system that was started by papplMainloop. Fixed mapping of MIME media types to IEEE-1284 Command Set values. Fixed a crash bug when no printers are added. Fixed compatibility issues with libcups3. The macOS menu extra did not update the list of available printers. No longer try to show the macOS menu extra when running from a root launchd service (Issue #201) Enjoy! Download v1.2.0 "
+ },
+ {
+ "id": "post:pappl-1.2.1",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.2.1",
+ "url": "/pappl-1.2.1",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.2.1 fixes key issues with localization, client limits, and compilation.",
+ "content": "PAPPL v1.2.1 is now available for download and fixes some key issues with localization, client limits, and compiling against older versions of CUPS. Changes in 1.2.1 include: Fixed a bug in the max-clients support code (Issue #205) Fixed compiler warnings (Issue #206, Issue #207) Fixed corruption in the English localization file. PAPPL didn't compile against CUPS 2.2.6 and earlier. Enjoy! Download v1.2.1 "
+ },
+ {
+ "id": "post:pappl-1.2.2",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.2.2",
+ "url": "/pappl-1.2.2",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.2.2 fixes key issues with localization, client limits, and compilation.",
+ "content": "PAPPL v1.2.2 is now available for download and is a general bug fix release. Changes in 1.2.2 include: Added debug logging for device management. Fixed a device race condition with job processing. Fixed a potential value overflow when reading SNMP OIDs (Issue #210) Fixed more CUPS 2.2.x compatibility issues (Issue #212) Fixed a 100% CPU usage bug when cleaning the job history (Issue #218) Fixed the default values of --with-papplstatedir and --with-papplsockdir to use the localstatedir value (Issue #219) Fixed a initialization timing issue with USB gadgets on newer Linux kernels. Enjoy! Download v1.2.2 "
+ },
+ {
+ "id": "post:pappl-1.2.3",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.2.3",
+ "url": "/pappl-1.2.3",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.2.3 fixes TLS upgrade, USB device ID, and vendor text option bugs.",
+ "content": "PAPPL v1.2.3 is now available for download and is a general bug fix release. Changes in 1.2.3 include: Fixed a bug in the TLS upgrade logic. Fixed a potential memory underflow with USB device IDs. Fixed web interface support for vendor text options (Issue #142) Enjoy! Download v1.2.3 "
+ },
+ {
+ "id": "post:pappl-1.2b1",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.2b1",
+ "url": "/pappl-1.2b1",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.b1 adds full localization, support for additional IPP features, and some other improvements.",
+ "content": "PAPPL v1.2b1 is now available for download. PAPPL v1.2 adds full localization, support for additional IPP features, and some other improvements. Changes include: Added macOS menubar icon/menu (Issue #27) Added support for localization, with base localizations for English, French, German, Italian, Japanese, and Spanish (Issue #58) Added interpolation when printing JPEG images or when using the papplJobFilterImage function with smoothing enabled (Issue #64) Added papplDeviceGetSupplies API to query supply levels via SNMP (Issue #83) Added support for custom media sizes in millimeters (Issue #118) Added papplPrinterGet/SetMaxPreservedJobs API and reprint web interface (Issue #189) Added IPP notifications support with papplSystemAddEvent and papplSubscriptionXxx functions (Issue #191) Added papplPrinterDisable and papplPrinterEnable functions and proper support for the IPP \"printer-is-accepting-jobs\" attribute. Added OpenSSL/LibreSSL support (Issue #195) Added papplSystemGet/SetMaxClients API (Issue #198) Updated papplPrinterSetReadyMedia to support up to PAPPL_MAX_SOURCE media entries, regardless of the number of sources. Enjoy! Download v1.2b1 "
+ },
+ {
+ "id": "post:pappl-1.2rc1",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.2rc1",
+ "url": "/pappl-1.2rc1",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.rc1 adds full localization, support for additional IPP features, and some other improvements.",
+ "content": "PAPPL v1.2rc1 is now available for download. PAPPL v1.2 adds full localization, support for additional IPP features, and some other improvements. Changes in 1.2rc1 include: Added explicit support for running macOS printer applications as a server. Added unit test support for the new SNMP-based supply level and status monitoring code. Updated USB gadget code to not enable gadget until system is started or USB options are set. Updated default spool directory to use a persistent, per-user location. Fixed DNS-SD advertising when adding a printer from the web interface. Fixed double \"Supplies\" buttons in the web interface. Fixed human-readable location fields in web interfaces. Fixed an issue with the default system callback for papplMainloop. Fixed an issue with papplDeviceList and DNS-SD discovery when there was no active system. Fixed printer compatibility issues with the new papplDeviceGetSupplies API. Fixed some locking issues with the macOS menubar icon. Enjoy! Download v1.2rc1 "
+ },
+ {
+ "id": "post:pappl-1.3.0",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.3.0",
+ "url": "/pappl-1.3.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.3.0 adds new job management, image printing, localization, and configuration features.",
+ "content": "PAPPL v1.3.0 is now available for download and adds new job management, image printing, localization, and configuration features. Changes in 1.3.0 include: Added debug logging for device management. Added support for job hold and release (Issue #15) Added support for PNG image scaling using embedded resolution information (Issue #65) Added papplLocGetDefaultMediaSizeName function to get the default media size for the current country (Issue #167) Added support for localized banners at the top of printer and system web pages (Issue #183) Added timer APIs to manage periodic tasks (Issue #208) Added support for network configuration via callbacks (Issue #217) Added APIs to limit the maximum size of JPEG/PNG images (Issue #224) Added support for the Clang/GCC ThreadSanitizer with the --enable-tsanitizer configure option. Added Norwegian Bokmål, Polish, and Turkish localizations. Added a password visibility button to the Wi-Fi password field. Changed names of PAPPL-specific attributes to use \"smi55357\" prefix. Updated USB device code to generate a 1284 device ID and use the manufacturer and product strings when necessary (Issue #234) Updated the USB gadget code to handle disconnections. Updated PAPPL to conform to the new prototype PWG 5100.13 specification (Issue #216) Fixed a device race condition with job processing. Fixed a initialization timing issue with USB gadgets on newer Linux kernels. Fixed a potential memory underflow with USB device IDs. Fixed web interface support for vendor text options (Issue #142) Fixed a potential value overflow when reading SNMP OIDs (Issue #210) Fixed more CUPS 2.2.x compatibility issues (Issue #212) Fixed a 100% CPU usage bug when cleaning the job history (Issue #218) Fixed the default values of --with-papplstatedir and --with-papplsockdir to use the localstatedir value (Issue #219) Fixed storage of label offsets for printers that implement them. Fixed some thread access issues on ARM. Fixed when the kernel USB printer driver is unloaded on Linux (Issue #233) Fixed papplDevicePrintf to allow the \"%c\" character to be 0. Enjoy! Download v1.3.0 "
+ },
+ {
+ "id": "post:pappl-1.3.1",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.3.1",
+ "url": "/pappl-1.3.1",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.3.1 is a general bug fix release.",
+ "content": "PAPPL v1.3.1 is now available for download and is a general bug fix release. Changes in 1.3.1 include: Fixed auto-add of USB printers Updated \"ipp-attribute-fidelity\" support Reduced sleep interval for USB gadget initialization Enjoy! Download v1.3.1 "
+ },
+ {
+ "id": "post:pappl-1.3.4",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.3.4",
+ "url": "/pappl-1.3.4",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.3.4 is a general bug fix release.",
+ "content": "PAPPL v1.3.4 is now available for download and is a general bug fix release. Changes in 1.3.4 include: Fixed builds with GNU TLS (Issue #292) Fixed a HTML error on the network configuration page. Changes in 1.3.3 include: Fixed USB serial number for DYMO printers (Issue #271) Fixed DNS-SD advertisements when the server name is set to \"localhost\" (Issue #274) Fixed hostname change detection when using mDNSResponder (Issue #282) Fixed authentication cookie comparisons for simple password mode. Fixed a potential time-of-use issue with PAPPL-created directories. Fixed handling of trailing '%' in log format strings. Updated TLS certificate generation to support more types of certificates and to use modern OpenSSL/GNU TLS APIs. Enjoy! Download v1.3.4 "
+ },
+ {
+ "id": "post:pappl-1.3",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.3.2",
+ "url": "/pappl-1.3",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.3.2 is a general bug fix release.",
+ "content": "PAPPL v1.3.2 is now available for download and is a general bug fix release. Changes in 1.3.2 include: Fixed PWG ImageBox values in raster page header Fixed a bug in the \"ipp-attribute-fidelity\" support Fixed printing of 1/2/4-bit grayscale PNG images (Issue #267) Fixed a potential buffer overflow in the logging code (Issue #272) Fixed reporting of \"xxx-k-octet-supported\" attributes. Updated the Wi-Fi configuration page to support hidden networks. Updated the Wi-Fi configuration page reload time to 30 seconds. Enjoy! Download v1.3.2"
+ },
+ {
+ "id": "post:pappl-1.4.0",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.0",
+ "url": "/pappl-1.4.0",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.0 is a feature release.",
+ "content": "PAPPL v1.4.0 is now available for download and is a feature release. Changes in 1.4.0 include: Added support for \"job-retain-until\" (Issue #14) Added new PAPPL-Create-Printers operation, and the PAPPL mainloop API now auto-adds local printers the first time a server is run (Issue #245) Added new papplDeviceRemoveScheme and papplDeviceRemoveTypes APIs to disable unwanted device types (Issue #259) Added support for suspending and resuming jobs at copy boundaries (Issue #266) Added support for server configuration files (Issue #279) Now preserve the paused state of printers (Issue #286) Fixed reporting of \"xxx-k-octet-supported\" attributes. Fixed printing of 1/2/4-bit grayscale PNG images (Issue #267) Fixed USB serial number for DYMO printers (Issue #271) Fixed a potential buffer overflow in the logging code (Issue #272) Fixed DNS-SD advertisements when the server name is set to \"localhost\" (Issue #274) Fixed hostname change detection when using mDNSResponder (Issue #282) Fixed authentication cookie comparisons for simple password mode. Fixed a potential time-of-use issue with PAPPL-created directories. Fixed handling of trailing '%' in log format strings. Updated the options sub-command to list vendor options and values (Issue #255) Updated web interface to show the age of jobs (Issue #256) Updated \"devices\" sub-command to have the PAPPL server find the devices instead of doing it directly (Issue #262) Updated default logging to be less chatty (Issue #270) Updated the Wi-Fi configuration page to support hidden networks. Updated the Wi-Fi configuration page reload time to 30 seconds. Updated TLS certificate generation to support more types of certificates and to use modern OpenSSL/GNU TLS APIs. Enjoy! Download v1.4.0 "
+ },
+ {
+ "id": "post:pappl-1.4.2",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.2",
+ "url": "/pappl-1.4.2",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.2 is a bug fix release.",
+ "content": "PAPPL v1.4.2 is now available for download and is a bug fix release. Changes include: Fixed potential crash while listing devices (Issue #296) Fixed potential deadlock issue (Issue #297) Fixed loading of previous state (Issue #298) Enjoy! Download v1.4.2 "
+ },
+ {
+ "id": "post:pappl-1.4.3",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.3",
+ "url": "/pappl-1.4.3",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.3 is a bug fix release.",
+ "content": "PAPPL v1.4.3 is now available for download and is a bug fix release. Changes include: Added \"smi55357-device-uri\" and \"smi55357-driver\" Printer Status attributes to Get-Printer-Attributes responses. Fixed missing mutex unlock in DNS-SD code (Issue #299) Fixed \"printer-id\" value for new printers (Issue #301) Fixed DNS-SD device list crash (Issue #302) Fixed Set-Printer-Attributes for \"output-bin-default\" and \"sides-default\" (Issue #305) Fixed default \"copies\" value with papplJobCreateWithFile. Enjoy! Download v1.4.3 "
+ },
+ {
+ "id": "post:pappl-1.4.4",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.4",
+ "url": "/pappl-1.4.4",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.4 is a bug fix release.",
+ "content": "PAPPL v1.4.4 is now available for download and is a bug fix release. Changes include: Fixed \"printer-settable-attributes-supported\" value (Issue #311) Fixed -n support for setting number of copies (Issue #312) Fixed papplPrinterSetDriverDefaults didn't set the \"orientation-requested-default\" value (Issue #313) Fixed job file preservation logic. Fixed builds against current libcups3. Enjoy! Download v1.4.4 "
+ },
+ {
+ "id": "post:pappl-1.4.5",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.5",
+ "url": "/pappl-1.4.5",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.5 is a bug fix release.",
+ "content": "PAPPL v1.4.5 is now available for download and is a bug fix release. Changes include: Fixed --disable-libpam configure option. Fixed support for \"finishings\", \"output-bin\", and \"sides\" options. Fixed IEEE-1284 device ID generation code. Fixed crash in retrofit printer application (Issue #322) Fixed some Coverity-detected threading issues. Enjoy! Download v1.4.5 "
+ },
+ {
+ "id": "post:pappl-1.4.6",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.6",
+ "url": "/pappl-1.4.6",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.6 is a bug fix release.",
+ "content": "PAPPL v1.4.6 is now available for download and is a bug fix release. Changes include: Fixed reporting of \"printer-strings-languages-supported\" attribute (Issue #328) Fixed saving of \"print-darkness-default\" and \"print-speed-default\" values (Issue #330 and #337) Fixed incoming \"raw\" print socket support (Issue #331 and #338) Fixed web interface support for \"printer-darkness\" (Issue #333) Fixed some issues discovered by OpenScanHub (Issue #335) Fixed localization of command-line (main loop) interface. Enjoy! Download v1.4.6 "
+ },
+ {
+ "id": "post:pappl-1.4.7",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.7",
+ "url": "/pappl-1.4.7",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.7 is a bug fix release.",
+ "content": "PAPPL v1.4.7 is now available for download and is a bug fix release. Changes include: PAM-based authentication did not work on Linux due to a glibc incompatibility (Issue #343) Fixed the web interface for setting the admin and print groups (Issue #356) Fixed the web interface for adding network printers on non-standard port numbers (Issue #360) Fixed some USB gadget error conditions. Fixed the Wi-Fi configuration web page. Fixed a logging deadlock issue. Fixed some threading issues. Fixed how PAPPL responds to an unsupported request character set. Fixed the \"no-tls\" server option. Enjoy! Download v1.4.7 "
+ },
+ {
+ "id": "post:pappl-1.4.8",
+ "source": "static",
+ "type": "post",
+ "title": "PAPPL 1.4.8",
+ "url": "/pappl-1.4.8",
+ "headings": [],
+ "tags": [],
+ "snippet": "PAPPL v1.4.8 is a bug fix release.",
+ "content": "PAPPL v1.4.8 is now available for download and is a bug fix release. Changes include: SECURITY: The web interface password didn't work properly (Issue #373) Now use the \"listen-hostname\" hostname as system hostname if a name is specified (Issue #369) Enjoy! Download v1.4.8 "
+ },
+ {
+ "id": "post:pappl-retrofit-First-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "pappl-retrofit - First Beta Release!",
+ "url": "/pappl-retrofit-First-Beta-Release",
+ "headings": [],
+ "tags": [],
+ "snippet": "pappl-retrofit 1.0b1 - Library for converting classic CUPS drivers/PPD files into Printer Applications",
+ "content": "This is the first beta release of the upcoming pappl-retrofit 1.0.0. This is a library to convert classic CUPS drivers, consisting of PPD files, CUPS filters, and sometimes also CUPS backends, into Printer Applications, the new format of printer drivers, mainly for CUPS 3.x which goes all-IPP and does not support the PPD/filter concept for printer drivers any more. Printer Applications are emulations of driverless IPP printers which on their other end pass on the jobs to the actual printer. pappl-retrofit uses PAPPL, library for Printer Applications, as its base, and so it does not need to care of the general functionality of Printer Applications. So it only contains the code to adapt classic CUPS drivers and PPD files into the Printer Application framework. To support as many classic drivers as possible pappl-retrofit supports all kinds of PPD files, with and without specification of a CUPS filter, installable accessory settings, CUPS extension for custom option values, *.drv PPD compiler files, PPD-file-generating executables, CUPS filters, CUPS backends, side and back channels for filter/backend communication, pre-filtering from the driverless-IPP-standard input formats to the input formats of the driver filters. pappl-retrofit also comes with the Legacy Printer Application, which when it is classically (not as Snap or other container) installed sees all classically installed CUPS drivers on the system and maps them into its IPP printer emulation, so that CUPS 3.x can make use of all these drivers. This way the user does not loose their old printer drivers on the transition to CUPS 3.x, which is especially important for (often proprietary) drivers from printer manufacturers. As this library was developed along with the 4 retro-fitting Printer Applications for PostScript, Ghostscript, HPLIP, and Gutenprint as the base for them, it has grown with these applications and contains all functionality they need. It has also grown with PAPPL, getting support for PAPPL's newest features. So we are not releasing now because we completed a pre-planned feature list but rather to have releases of this package and the Printer Applications for their easier adoption into Linux distributions. With this we will also version the Printer Application Snaps in the Snap Store, so that when distributions adopt them as their default printer drivers, they can also better manage their customer support. Feature-wise we are even not 100% complete. We will still add ink level read-out from the printer (SNMP-based network printers, same as supported by CUPS) and internationalization, but this will not cause any compatibility-breaking API changes. More Details and Download GitHub Discussion"
+ },
+ {
+ "id": "post:pappl-retrofit-Second-Beta-Release",
+ "source": "static",
+ "type": "post",
+ "title": "pappl-retrofit - Second Beta Release!",
+ "url": "/pappl-retrofit-Second-Beta-Release",
+ "headings": [],
+ "tags": [],
+ "snippet": "pappl-retrofit 1.0b2 - Fix issues in source code docs and allow installation of Legacy Printer Application as permanently running system daemon.",
+ "content": "This is the second beta release of the upcoming pappl-retrofit 1.0.0, to fix some issues in the source code documentation and to allow installation of the Legacy Printer Application as a permanently running system daemon. Support for Legacy Printer Application as system daemon We have added a systemd *.service file and an install mode for installing the Legacy Printer Application as system daemon. The mode is triggered by the --enable-legacy-printer-app-as-daemon option for ./configure. Then the *.service file gets installed and the executable legacy-printer-app gets installed into /usr/(local/)sbin/. README.md: Updated TODOs and fixed minor glitches Especially the PAPPL development got already far enough for localization and ink level reporting support, so that we do not need to tell any more that we are waiting for further the devlopment of PAPPL. CONTRIBUTING.md: Updated text to reflect pappl-retrofit COPYING, NOTICE: Fixed copyright year 2023 and simplified the file based on the fact that one can assign the package's license to all autotools-generated files. Adapted DEVELOPING.md to the pappl-retrofit API, it was still reflecting the CUPS API (file was copied over from CUPS. Removed _prDefaultPaperSize() from pappl-retrofit-private.h. The function got removed when PAPPL had introduced papplLocGetDefaultMediaSizeName() which replaces this functionality. More Details and Download GitHub Discussion"
+ },
+ {
+ "id": "post:pycups-2.0.3",
+ "source": "static",
+ "type": "post",
+ "title": "Pycups 2.0.3",
+ "url": "/pycups-2.0.3",
+ "headings": [],
+ "tags": [],
+ "snippet": "Pycups 2.0.3 contains changes related to deprecations and removals in newer Python3 versions.",
+ "content": "pycups 2.0.3 contains changes from 2.0.2 - mainly changes related to newer Python3 versions: removed shebang from example/cupstree.py ignore driverless utilities for postscriptdriver tags creation (Fedora bug #1873385) remove epydoc from Makefile (#27) fix invalid delete of pointer (#11) Makefile uses wrong Python (#32) define PY_SSIZE_T_CLEAN in cupsipp.h - fixes traceback during IPPRequest.writeIO with Python 3.10 fix the test.py when there is no printer installed (#46) Use PyObject_Call() instead of deprecated PyEval_CallObject() Version 2.0.3 was created to attempt to fix pycups installation via pip, but it was unsuccessful. Enjoy! Download Pycups v2.0.3 Home Page "
+ },
+ {
+ "id": "post:pycups-2.0.4",
+ "source": "static",
+ "type": "post",
+ "title": "Pycups 2.0.4",
+ "url": "/pycups-2.0.4",
+ "headings": [],
+ "tags": [],
+ "snippet": "Pycups 2.0.4 hotfix release",
+ "content": "The hotfix release removes install_requires from setup.py, which is used for generating OS requirements. Enjoy! Download Pycups v2.0.4 Home Page "
+ },
+ {
+ "id": "post:pyppd-1.1.0-released",
+ "source": "static",
+ "type": "post",
+ "title": "pyppd 1.1.0 released!",
+ "url": "/pyppd-1.1.0-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Vastly reduced memory consumption when extracting a PPD file and incorporated the patches of the Debian/Ubuntu package",
+ "content": "Vastly reduced memory consumption when extracting a PPD file and incorporated the patches of the Debian/Ubuntu package When extracting a PPD file from the archive streaming decompression is used now instead of decompressing the whole archive into memory at once (Issue #2), Thanks to Sambhav Dusad (@dsam82). Use JSON dumps instead of Pickle dumps, from Ubuntu/Debian to make archive reproducible, but also faster than Pickle dumps. Thanks to Didier Raboud (@OdyX). Sort PPD list before archiving, from Ubuntu/Debian to make archive reproducable. Thanks to Didier Raboud (@OdyX) Use \"python3\" in shebangs, from Debian/Ubuntu More Details and Download"
+ },
+ {
+ "id": "post:system-config-printer-1.5.16-released",
+ "source": "static",
+ "type": "post",
+ "title": "system-config-printer 1.5.16 released!",
+ "url": "/system-config-printer-1.5.16-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Release covering one year of bug fixes, translations, and updated README.md",
+ "content": "Release covering one year of bug fixes, translations, and updated README.md updates in README.md: build/install instructions, changes related to s-c-p with CUPS 3.x (IPP services/Printer Applications, no PPDs/drivers/static queues), TODOs, need of new developer(s) fix preserve_job_files default settings add debugprint covering failed fingerprint retrieval attempts Remove travis .travis.yml: run on focal and its newer python Make sure that applet.py is running one instance per user fix incorrect use of urllib.request remove python3-requests build: Migrate build system from Intltool to Gettext Makefile.am: Remove zanata usage udev-configure-printer.c: Fix possible use after frees and leaks scp-dbus-service.py: Fix typo in method call add option to disable xmlto manual generation allow + in device uris - gutenprint has a backend with + (fixes #208) tons of translations More Details and Download"
+ },
+ {
+ "id": "post:system-config-printer-1.5.17-released",
+ "source": "static",
+ "type": "post",
+ "title": "system-config-printer 1.5.17 released!",
+ "url": "/system-config-printer-1.5.17-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "Release covering half a year of bug fixes and translations",
+ "content": "Release covering half a year of bug fixes and translations Migrate from deprecated splittype to urlparse (#268) Support GNOME 42 dark style preference (#263) More Details and Download"
+ },
+ {
+ "id": "post:system-config-printer-1.5.18-released",
+ "source": "static",
+ "type": "post",
+ "title": "system-config-printer 1.5.18",
+ "url": "/system-config-printer-1.5.18-released",
+ "headings": [],
+ "tags": [],
+ "snippet": "system-config-printer-1.5.18 brings fix for application crash if libhandy is not installed and other fixes",
+ "content": "system-config-printer-1.5.18 brings fix for application crash if libhandy is not installed, which crashes the application on non-GNOME desktops, and other fixes, the complete list is here: Add into the .appdata.xml file (#269) Accessiblity improvements (#244) system-config-printer couldn't be uninstalled vi GNOME Software (#273) system-config-printer crashes due missing libhandy (#283) Updated config.sub and config.guess to fix configuration error on RiSC (#282) Use pkg-config or --with-cups-serverbin-dir for finding SERVERBIN (#234)"
+ },
+ {
+ "id": "post:website-is-up",
+ "source": "static",
+ "type": "post",
+ "title": "Untitled Article",
+ "url": "/website-is-up",
+ "headings": [],
+ "tags": [],
+ "snippet": "New website of openprinting is up and running as https://openprinting.github.io. Go check it out!",
+ "content": "New website of openprinting is up and running as https://openprinting.github.io. Go check it out!"
+ },
+ {
+ "id": "documentation:01-printer-application",
+ "source": "static",
+ "type": "documentation",
+ "title": "Printer Applications - A new way to print in Linux",
+ "url": "/documentation/01-printer-application",
+ "headings": [
+ "Brief History",
+ "What is a Printer Application?",
+ "Advantages of Printer Applications",
+ "Roles and Responsiblities",
+ "OpenPrinting",
+ "Manufacturer",
+ "User",
+ "Resources"
+ ],
+ "tags": [],
+ "snippet": "Ever wondered how a Printer works? What are the different steps involved between the print command and the final output? The following document contains information about the...",
+ "content": "Ever wondered how a Printer works? What are the different steps involved between the print command and the final output? The following document contains information about the history of printing and its evolution. It describes Printer Applications. What were the issues with the previous methodologies? How Printer Applications helped in solving them? Why it has been referred to as the \"Technology for Future\"? In the end, it also contains roles of different entities including OpenPrinting, Manufacturers, and the User. The first release of CUPS was back in 1997. [1] Since then, Printer Drivers consisted of PPD files and CUPS filters. PPD (PostScript Printer Description) is a decades-old data format created by Adobe, probably together with PostScript or shortly after, to describe capabilities and user-settable options of PostScript printers and which PostScript commands to embed in the print job to execute the option settings. PPD files describe the printer's capabilities and which filters to use to produce the data format needed by the printer. This format was adopted because in that time printing under Linux and Unix worked via PostScript. Applications sent jobs in PostScript which could be understood by PostScript printers. It allowed users to use all PostScript printers directly. The system supports printers, the user uses printers. CUPS made the move from built-in printer drivers in Ghostscript to CUPS filters, with the help of the CUPS Raster device-independent print raster format. CUPS raster drivers used PPD files because it used Ghostscript or (on IRIX) Impressario (a version of Adobe's PostScript interpreter) to produce raster data for printing, and they could use embedded PostScript commands to control page size, colour space, etc. Since both PostScript and raster printers could then use PPD files, Michael Sweet adopted PPD as a common printer description format, which also got used for his company's ESP Print Pro (GUI) software and then later macOS and GNOME/KDE. CUPS provides reserved directories to drop these PPD files and filters into, so adding a printer driver was rather easy. Nowadays applications send jobs in PDF and CUPS does the PDF-centric processing, already for 8 years, since the first release of cups-filters back in 2012. So PPD files do not really fit in the picture anymore, and they also had their shortcomings, especially being rather unflexible in the possible types of user-settable options. Also, the need to drop filters and PPDs into reserved directories of CUPS makes it difficult to provide CUPS and printer drivers in sandboxed packages, like Snaps. Already several years ago, mainly due to the advent of smartphones and the desire to also print from these devices, printers got equipped with driverless IPP printing functionality: AirPrint(released in 2010), IPP Everywhere, Mopria, Wi-Fi Direct Print. These standards are practically all the same, the printer advertises its presence, its network address, and basic capabilities via DNS-SD (aka BonJour, mDNS, zero-conf, implemented with Avahi in Linux), accepts communication and jobs from clients via IPP (Internet Printing Protocol), from the Printer Working Group, supplies complete capability info to clients via IPP and uses only common Page Description Languages (PDLs) for jobs: PDF, Apple Raster, PWG Raster, PCLm. A Printer Application is a background service, a GUI application, etc. that happens to respond to HTTP and IPP requests. It detects the supported printers and advertises those printers on the localhost as an IPP Everywhere printer. It can also listen on network interfaces (i.e. not just localhost) so provide access to a printer to all client devices on a network. Printer Applications are the recommended architecture for printer drivers. The Printer Application emulates a driverless IPP printer, so that the printing system does not need to distinguish, it simply needs to support driverless IPP printers. This way we add support for non-driverless printers and avoid deprecated and inconvenient methods, like using PPD (Postscript Printer Description) files on non-PostScript printers but also allow sandboxed packaging which allows providing OS-distribution-independent driver packages and improves security. In a sandboxed package, we cannot modify directory contents once it is built. Our system is no more modular. We cannot choose which printer driver package to install. Printer Applications address this problem of modularity and give us the same freedom as in the case of printer drivers. A Printer Application's Web Interface provides configurability and makes it more accessible to the user. Instead of the web interface, one can also use the standard interface IPP System Service. This allows defining configurable parameters that a device-independent client can poll from the IPP server and display in a GUI so that the user can change them appropriate to his needs. It allows creation and deletion of printers, viewing active and completed jobs, cancellation of job/jobs, configuring the loaded media and network settings, requesting software updates, etc. The underlying mechanism involves adding custom pages and contents using callbacks, static resources, or external files and directories. One Driver for one Manufacturer The classical printer driver binaries were specifically built for Linux distributions because the distribution provides the layout of CUPS, the libraries, and so on. Also, they have different packaging formats DEB, RPM, and many more. For each distro, drivers need to be built, packaged, and tested separately. It made the task next to impossible to execute. As a result, most of the hardware manufacturers refrained from making these drivers. Printing Applications have reduced the intensity of manufacturer's task to a great extent as now they only need one application for all printers, for all distributions, and distribute it through snaps. Usability Users are enabled to directly install and configure CUPS and Printer Application Drivers by just a few simple steps. They do not require to manually drop the PPD files in reserved directories and hence make the process less error-prone. Also, they just need to have a single Printer Application Driver for different printers from the same manufacturer. Easy Configuration Printer Applications also provide a Web Interface to easily configure Printer's Capabilities, helping people who were earlier unaware to change properties of a Printer in PPD files and were forced to pass the same printing options through the Command line, every time. Good Bye PPD! PPD files which were earlier used to describe the printer's capabilities and which filters to use to produce the data format needed by the printer are not required by Printer Application. Diversified Nature Printer Applications have a lot in common. Therefore Michael Sweet has created PAPPL, a library that provides all the common functionality which is needed in every Printer Application. However, the manufacturer is expected to write the drivers on their own (using PAPPL) and defining functions like identifying the start of the page, the start of a line, etc, leading to Printer Application's Diversified Nature. Technology for Future As we know, Linux is moving to sandboxed packaging (Snap for example) and printing is also moving in that direction. In a sandboxed package, we cannot modify directory contents once it is built. Our system is no more modular. We cannot choose which printer driver package to install. Printer Applications address this problem of modularity and give us the same freedom as in the case of printer drivers. Roles Flowchart CUPS Snap [2] This is a complete printing stack in a Snap. It contains not only CUPS but also cups-filters, Ghostscript, and Poppler. It is everything which is required for printing, except Printer Drivers. Till Kamppeter has created this in order to provide a complete printing stack for a purely Snap-based Operating System. PAPPL [3] Printer Applications have a lot in common. It would be a lot of re-inventing the wheel if everyone who wants to create a printer driver has to implement all this. Therefore Michael Sweet has created PAPPL, a library which provides all the common functionality which is needed in every Printer Application. Web Interface Printer Applications also provide a Web Interface to easily configure Printer's Capabilities. This GUI helps people who were unaware to change printer properties directly in PPD files and were forced to pass the similar printing options through Command line, each and every time. CUPS filters [8] These are APIs that can be utilized to perform the conversion of data of files from one format to another. Currently, PAPPL supports only raster printers and that too for very few specific input formats like JPEG and PNG. For adding support for non-raster printers like PDF and PostScript printers, you need to supply an external utility that converts the whole job’s data into a data stream which the printer understands. Openprinting and CUPS Filters again come to the rescue here. Manufacturers can use CUPS Filters to design these external utilities and decide which set of Filters to use and the order in which these should be invoked depending upon the efficiency and input-output formats. Kindly refer to guidelines for designing of printer applications [4] for more details. Providing Sufficient Guidance OpenPrinting also helps the manufacturer about designing of printer [4] and scanner drivers.[5] It also guides them about packaging those drivers and uploading on Snap Store. [6] It also educated users about using Printer Application Drivers. It provides neccessary documentation and tutorial for all the above mentioned things. [7] The Manufacturer besides manufacturing Printers and Scanners, is also expected to design drivers for the same. They can use PAPPL[3] library which certainly reduces their task to an great extent. Also they could take help from the documentation and tutorial developed by the OpenPrinting team. [4] [5] After designing the drivers, they need to package them and Upload it to Snap Store. Again, documentation and tutorial for the same have developed by the OpenPrinting team which could be referred. [6] The user is relieved from most of the complexities and is just required to install CUPS and Printer Application Driver (based on the manufacturer). Further, he has the option to change his printer properties through the Web GUI provided with Printer Application. The OpenPrintring team has also worked out documentation and tutorials about installing CUPS and Drivers and using Web-based GUI, making the switch to this new technology easier for all. [7] [1] How all this began [2] CUPS Snap [3] PAPPL [4] Tutorial to Design Printer Drivers [5] Tutorial to Design Scanner Drivers [6] Packaging Drivers and Uploading them to Snap Store [7] User Manual [8] CUPS Filters "
+ },
+ {
+ "id": "documentation:02-designing-printer-drivers",
+ "source": "static",
+ "type": "documentation",
+ "title": "Designing Printer Drivers",
+ "url": "/documentation/02-designing-printer-drivers",
+ "headings": [
+ "papplMainLoop",
+ "Version number",
+ "Autoadd Callback",
+ "Sub-command name",
+ "Data"
+ ],
+ "tags": [],
+ "snippet": "This document contains a complete tutorial as well as information for manufacturers with examples for designing printer drivers. If you are looking for information regarding the...",
+ "content": "This document contains a complete tutorial as well as information for manufacturers with examples for designing printer drivers. If you are looking for information regarding the use of printer drivers, kindly refer to User Manual A driver is a code or data specific to a certain model or group of hardware devices, needed to make the hardware work with the hardware-model-independent code of the operating system. Printing in Linux has moved towards Driverless Printing, which means there is no need for any hardware-model-specific code or data. However, there are some problems with the current framework. For example, some printers(especially the old ones) that cannot handle IPP requests are devoid of driverless printing capability. Printer Applications help to address these issues. Kindly refer Printer Applications - A new way to print in Linux to learn more about Printer Applications, its working and benefits. For Designing the Printer Application Driver, it would be a lot of re-inventing the wheel if everyone who wants to create a printer driver has to implement all things from scratch. Therefore Michael Sweet has developed PAPPL , a library that provides all the common functionality which is required in every Printer Application. The flowchart below mentions the components of the driver that needs to be designed by you (boxes in blue color), along with the PAPPL utilities (boxes in red color) that would be used by your designed components. Flowchart The following tutorial helps you to understand how to design each component and integrate the PAPPL Utilities to reduce your work. papplMainLoop is the main entry point for the application. It runs a standard main loop with a system callback. Also allows the printer application to define its own usage callback and have an application specific subcommand. The papplMainloop function runs until all processing for the current sub-command is complete, returning the exit status for the program. Before looking at the arguments, you must be aware that there are two ways to configure the papplMainloop: Use system callback argument The system is an object of type pappl_system_t that manages client and device connections, listeners, the log, printers, and resources. In addition, it provides an optional embedded web interface, raw socket printing, and USB printer gadget (Linux only). The system callback argument specifies a function that will create a new system, i.e. a pappl_system_t object. You can use the callback function to customisably configure system properties using the PAPPL System Utilities . This includes configuring Footer HTML on your web interface and setting up drivers. You can refer designing system callback guidelines for retrieving more information about the System Callback function. Without system callback function PAPPL allows the manufacture to refrain from the hardships of designing a system callback to create a system. You can specify the system callback as NULL and pass on only a few arguments: Footer HTML Number of drivers Drivers Driver Callback If the \"system_cb\" argument is passed as NULL, PAPPL automatically sets up the list of drivers passed as \"drivers\" arguments and add the Footer HTML for the web interface (in \"footer\" argument is not NULL). A default system object is created for the printer application, which supports multiple printers and a web interface. The argc and argv arguments for papplMainLoop are those provided to the main function. Other arguments are given below. This argument is simply a string literal, denoting the numeric version of the printer driver that conforms to semantic versioning guidelines with up to four numbers, for example \"1.2.3.4\" Examples of valid version number are \"1.0\", \"2.1\", etc. The \"footer_html\" argument can be provided to override the default footer text that appears at the bottom of the web interface. As mentioned above, you can pass this argument as NULL and add the footer in system callback function. If system callback and \"footer_html\" argument both are NULL the default is used. The \"num_drivers\" argument specifies the number of drivers for printers. Specify 0 if the drivers are configured in the system callback. The drivers list is a collection of names, descriptions, IEEE-1284 device IDs, and extension pointers. You can pass this argument as NULL if the drivers are configured in the system callback. A valid example for HP DeskJet, HP LaserJet, and a generic PCL driver, looks like this: The driver callback is responsible for providing the data associated with each driver and is called when the system is creating a new printer. It also responsible for letting the application know what functions to call when performing job functions like starting a job, starting a page, writing a line, ending a page, ending a job, printing a raw job, etc. You can pass this argument as NULL if the drivers are configured in the system callback. Else, for designing the driver callback function, refer to the design driver callback guidelines. The \"autoadd_cb\" argument specifies a callback for automatically adding new printers with the \"autoadd\" sub-command. It tells PAPPL which driver to use for the printers it finds. This argument is a string literal that denotes the additional custom sub-command supported by your printer driver. By default, PAPPL helps each driver to support the following sub-commands: add cancel default delete devices drivers jobs modify options printers server shutdown status submit If your printer doesn't support any additional custom sub-command, you may specify the argument as NULL. This callback argument is the function that is to be executed when the sub-command(other than the default sub-commands) is specified. Since each driver is not bound to support additional sub-command, one may specify this argument as NULL in case the printer driver does not support any additional sub-command. If you wish to support additional sub-command, then specify the name of the sub-command in the sub-command name argument and design a function using the design sub-command callback guidelines. The System Callback function creates a system object and allows restoring the previous system configuration(if any). Kindly refer to the Design system callback guidelines for retrieving more information about the System Callback function. This function helps the user to know about the capabilities of your printer by showing the set of sub-commands and options supported by your printer. For retrieving the output of this function, the user needs to pass the --help argument. One may specify the usage callback argument as NULL in the papplMainloop function. The default function is utilized in this situation. The default function shows the default list of sub-commands and options. The output of the default usage callback function is shown below. If your printer supports only the default set of sub-commands, you can use the default usage callback function. If you wish to output different information when the user uses --help command-line argument, follow the designing usage callback function guidelines. This argument is a string literal and provides the application-specific data for any of the callback functions. The usage callback function receives only one argument, i.e. the callback data. The function objective is to show the usage details of the printer. Hence, the design guidelines for this function is quite trivial. It consists of a series of printf statements describing each supported sub-command and option. It can then return. This function allows the printer application to have an application-specific subcommand. The Sub-Command callback function receives six arguments Basename, Number of options, Options, Number of files, Name of files, and Callback data. It then returns a new sub-command object. The system callback function receives three arguments Number of options, Options, and Callback data. It then returns a new system object. Design Guidelines: Declare Objects and Variables The following objects and variables have to be declared: | DataType | Variable Name | Significance | |------------------|---------------|----------------------| | pappl_system_t* | system | System object | | char* | val | Current option value | | char* | hostname | Hostname | | char* | logfile | Log file | | char* | system_name | System name | | char* | spooldir_name | spool-directory | | char* | authservice | auth-service || pappl_loglevel_t | loglevel | Log level | | int | port | Port number | | pappl_soptions_t | soptions | System options | | pappl_version_t | versions | Software versions | | Note | |--------------------------------------------------------------------------------------------------------------------------------------------| |Naturally, you can define other names for variables. We have assumed them as given in the table to reduce ambiguity in the subsequent steps.| Fetch values using cupsGetOption From the above listed objects/variables, the following variables can get their values from corressponding option name, using cupsGetOption PAPPL utility: | Variable Name | Option name | |---------------|-----------------| | loglevel | log-level | | logfile | log-file | | hostname | server-hostname | | system_name | system-name | | port | server-port | The syntax for using cupsGetOption is: Notes: The return type for cupsGetOption utility is char*. Hence for \"log-level\" and \"server-port\" options, first fetch them into the val variable. The values taken by loglevel variable based on value returned by \"log-level\" cupsGetOption can be summarised using the following table: | log-level Option | Value for loglevel variable | |------------------|-----------------------------| | fatal | PAPPL_LOGLEVEL_FATAL | | error | PAPPL_LOGLEVEL_ERROR | | warn | PAPPL_LOGLEVEL_WARN | | info | PAPPL_LOGLEVEL_INFO | | debug | PAPPL_LOGLEVEL_DEBUG | The port variable can be retrived from \"server-port\" option using atoi function. Don't forget to add a check for the port number. It must be between 0 to 65535(both inclusive). Create a system using papplSystemCreate The variables defined and fetched above are passed to papplSystemCreate utility to create a system. The system is an object of type pappl_system_t that manages client and device connections, listeners, the log, printers, and resources. It implements a subset of the IPP System Service (PWG 5100.22) with each printer implementing IPP Everywhere™ (PWG 5100.14) and some extensions to provide compatibility with the full range of mobile and desktop client devices. In addition, it provides an optional embedded web interface, raw socket printing, and USB printer gadget (Linux only). The soptions variable is passed as the first argument, which is an bitwise ORed of the following options: | System Option | Significance | |:---------------------------:|:------------------------------------------------------------------:| | PAPPL_SOPTIONS_DNSSD_HOST | Use hostname in DNS-SD service names instead of serial number/UUID | | PAPPL_SOPTIONS_LOG | Include link to log file | | PAPPL_SOPTIONS_MULTI_QUEUE | Support multiple printers | | PAPPL_SOPTIONS_NETWORK | Include network settings page | | PAPPL_SOPTIONS_NONE | No options | | PAPPL_SOPTIONS_RAW_SOCKET | Accept jobs via raw sockets | | PAPPL_SOPTIONS_REMOTE_ADMIN | Allow remote queue management (vs. localhost only) | | PAPPL_SOPTIONS_SECURITY | Include user/password settings page | | PAPPL_SOPTIONS_STANDARD | Include the standard web pages | | PAPPL_SOPTIONS_TLS | Include TLS settings page | The system_name variable fetched in 2nd Step is passed as second argument. Note that the system-name might be NULL. So, don't forget to add a check and pass a default value, in case the fetched system-name is NULL. The port number is passed as the third argument. You may pass it as 0 for auto. The 4th argument is a string literal that signifies DNS-SD sub-types. One may pass NULL for none. Pass the spooldir, logfile and loglevel variable fetched in 2nd Step as fifth, sixth and seventh argument respectively. You can pass NULL for the fifth and sixth arguments for default values. The 8th argument signifies the PAM authentication service. You may pass auth_service variable fetched in 2nd Step or NULL for none. If the system only supports TLS connection, pass true in the 9th argument, else false. Add system configurations The system object has tons of configurable attributes and correspondingly a huge number of PAPPL utilities to configure them. These include utilities like Setting Hostname, Setting the footer HTML for the web interface, etc. A detailed list of these function can be found at PAPPL System Utilities . Call the Driver setup function Pass the system object created in previous steps as an argument to the Driver setup function. See the design guidlines for knowing about the Driver setup function. Return System Object The system object created and set up in the previous steps is returned in this step. This function defines the list of printer drivers and driver callback function. The Driver setup function receives only one argument, i.e. system object. Design Guidelines: Define Drivers name and description Create two arrays of string literals, one for the names of the drivers and the other for their corresponding descriptions. Initialise them suitably and use as directed in 2nd Step. Call papplSystemSetPrintDrivers The received pappl_system_t object is passed as the first argument. Pass the number of drivers as the second argument The defined driver name and description array are passed as the third and fourth arguments respectively. Pass the Driver Callback Function as fifth argument. Pass the callback data as the 6th argument. This function tells the printer application what functions to call when performing job functions like starting a job, starting a page, writing a line, ending a page, ending a job, printing a raw job. Driver capability information and defaults(such as resolution, color, etc.) are also provided here. The callback function receives six arguments System object, Driver name, Device URI, Driver data, Driver Attributes, and Callback data. It then returns either true on success or false on failure. Design Guidelines: Add suitable checks You may check that the passed values of driver_name, device_uri, driver_data, and data variable is non-NULL. Further, you must verify that the callback data is the same as the data variable. Assign values to common driver_data members All the required information is stored in the pappl_pdriver_data_t [1] structure. These are a few examples of common driver attributes. For the entire list of attributes that can be provided, please look at the pappl_pdriver_data_t [1] structure. | Member | Significance | |--------------------|------------------------------------------------------| | identify | Identify-Printer function | | identify_default | \"identify-actions-default\" values | | identify_supported | \"identify-actions-supported\" values | | print | Print (file) function | | rendjob | End raster job function | | rendpage | End raster page function | | rstartjob | Start raster job function | | rstartpage | Start raster page function | | rwrite | Write raster line function | | status | Status function | | format | Printer-specific format | | orient_default | \"orientation-requested-default\" value | | quality_default | \"print-quality-default\" value | Assign rest of the values driver_data members based on driver_name Here is the list of all the attributes of pappl_pdriver_data_t structure, used to describe driver capability information and defaults. The ones that were not assigned in the previous step may be assigned depending on the name of the driver. | Member | Significance | |-------------------------------|-----------------------------------------------------| | bin[PAPPL_MAX_BIN] | Output bins | | bin_default | Default output bin | | borderless | Borderless margins supported? | | bottom_top | Bottom and top margins in hundredths of millimeters | | color_default | \"print-color-mode-default\" value | | content_default | \"print-content-default\" value | | darkness_supported | printer/print-darkness-supported (0 for none) | | duplex | Duplex printing modes supported | | features[PAPPL_MAX_VENDOR] | \"ipp-features-supported\" values | | finishings | \"finishings-supported\" values | | force_raster_type | Force a particular raster type? | | format | Printer-specific format | | gdither | , 'text', and 'graphic' dither array | | icons[3] | \"printer-icons\" values | | identify | Identify-Printer function | | identify_supported | \"identify-actions-supported\" values | | kind | \"printer-kind\" values | | make_and_model[128] | \"printer-make-and-model\" value | | media[PAPPL_MAX_MEDIA] | Supported media | | media_ready[PAPPL_MAX_SOURCE] | Ready media | | mode_supported | label-mode-supported | | num_bin | Number of output bins | | num_features | Number of \"ipp-features-supported\" values | | num_media | Number of supported media | | num_source | Number of media sources (trays/rolls) | | num_type | Number of media types | | num_vendor | Number of vendor attributes | | orient_default | \"orientation-requested-default\" value | | output_face_up | Does output media come out face-up? | | pdither | dither array | | ppm_color | \"pages-per-minute-color\" value, if any | | print | Print (file) function | | quality_default | \"print-quality-default\" value | | raster_types | \"pwg-raster-document-type-supported\" values | | rendjob | End raster job function | | rendpage | End raster page function | | rstartjob | Start raster job function | | rstartpage | Start raster page function | | rwrite | Write raster line function | | scaling_default | \"print-scaling-default\" value | | sides_default | \"sides-default\" value | | source[PAPPL_MAX_SOURCE] | Media sources | | speed_default | print-speed-default | | status | Status function | | tear_offset_supported[2] | label-tear-offset-supported (0,0 for none) | | top_offset_supported[2] | media-top-offset-supported (0,0 for none) | | tracking_supported | media-tracking-supported | | type[PAPPL_MAX_TYPE] | Media types | | vendor[PAPPL_MAX_VENDOR] | Vendor attribute names | | y_default | Default resolution | Difference between print and write function Both the print and write functions execute a similar task, but they are invoked by the printer application in a different situation. If the printer-specific format, i.e. the format which is understood by the printer and the format of the Job supplied is the same, then the print function is invoked. One may rightly guess that this is the case of raw print since no format conversion or processing is required. In the other case, the write function is used. This is complemented using other functions such as rstartpage, rendpage, rstartjob, and rendjob. rwriteVSrprint The function helps to identify a printer using display, flash, sound, or speech. The Identify function receives three arguments that are the Printer, Actions to take, and Messages (if any). The Identification methods are summarised in the table: | Identification Method | Action | |--------------------------------|--------------------------------| | PAPPL_IDENTIFY_ACTIONS_SOUND | Make a sound | | PAPPL_IDENTIFY_ACTIONS_DISPLAY | display a message (argument) | | PAPPL_IDENTIFY_ACTIONS_SPEAK | speak a message (argument) | | PAPPL_IDENTIFY_ACTIONS_FLASH | flashes a light on the printer | It is used to print a raw job (printer-ready) file, i.e. if the job format is the same as the format specified by the driver callback. The Print function receives three arguments that are Job, Job Options, and device. The \"job\" argument provides the current job object. The \"options\" pointer provides the current print job options. The \"device\" argument is a pointer used to send data to the printer. The function returns true on success and false on failure. This callback will sometimes send some printer initialization commands followed by the job file and then any cleanup commands. It may also be able to count the number of pages (impressions) in the file, although that is not a requirement. This function is called at the end of each page where the driver will typically eject the current page. The End Job function receives three arguments that are Job, Job Options, and device. The \"job\" argument provides the current job object. The \"options\" pointer provides the current print job options. The \"device\" argument is a pointer used to send data to the printer. The function returns true on success and false on failure. Note that the job data set by Start Job Function must be freed in this function. This function is called each time a page is completed. It helps in resetting the buffers used by the driver. The End Page function receives four arguments that are Job, Job Options, Device, and Page Number. The \"job\" argument provides the current job object. The \"options\" pointer provides the current print job options. The \"device\" argument is a pointer used to send data to the printer. The \"page\" argument specifies the current page number staring at 0. The function returns true on success and false on failure. This function is called at the beginning of a job to allow the driver to initialize the printer for the current job. The Start-Job function, like the End Job Function, receives three arguments that are Job, Job Options, and device. The \"job\" argument provides the current job object. The \"options\" pointer provides the current print job options. The \"device\" argument is a pointer used to send data to the printer. The function returns true on success and false on failure. This function is called when starting a page to allow the driver to do any per-page initialization and/or memory allocations and send any printer commands that are necessary to start a new page. Information regarding the page is obtained from the page header and attributes like resolution, margins, page size, orientation, and graphics are set appropriately. The Start Page function receives four arguments that are Job, Job Options, Device, and Page Number. The \"job\" argument provides the current job object. The \"options\" pointer provides the current print job options. The \"device\" argument is a pointer used to send data to the printer. The \"page\" argument specifies the current page number staring at 0. The function returns true on success and false on failure. This function writes a line of graphics and is called for each raster line on the page. It is typically responsible for dithering and compressing the raster data for the printer. The Write Line function receives five arguments that are Job, Job Options, Device, Line number, and Line. The \"job\" argument provides the current job object. The \"options\" pointer provides the current print job options. The \"device\" argument is a pointer used to send data to the printer. The \"y\" argument specifies the current line number. The \"pixels\" argument is a pointer to the content of current line. The function returns true on success and false on failure. The PAPPL status callback is used to update the printer state, supply levels, and/or ready media for the printer: The Printer Status Function receives only one argument and that is the printer. It returns true on success and false on failure. The callback can open a connection to the printer using the papplPrinterOpenDevice function. Currently, PAPPL supports only raster printers and that too for very few specific input formats like JPEG and PNG. For adding support for non-raster printers like PDF and PostScript printers, you need to supply an external utility that converts the whole job's data into a data stream which the printer understands. Refer to the below-mentioned steps to know how to implement the same. Set the printer-specific format in callback function. You need to set driver_data.format in callback function to the printer-specific format, i.e. the format/language accepted by the printer. A few examples could be \"application/postscript\", \"application/pdf\", etc. Add a filter callback You need to add filter callback from format received by the printer application(formats which you wish your printer can support and accept the job in) to printer-specific format(format/languages that the printer actually understands) using papplSystemAddMIMEFilter utility. | Parameter | Significance | |-----------|-----------------------------------------------| | system | System | | srctype | Source MIME media type (constant) string | | dsttype | Destination MIME media type (constant) string | | cb | Filter callback function | | data | Filter callback data | This utility is added in system callback after calling setup function in Step 5. The filter callback function converts the whole job's data into a data stream which the printer understands. The filter callback function receives 3 parameters, that are the Job, the Device, and the Filter data. Depending upon the features, stability, ease of use, documentation, pricing, and license you may use any third party API to perform this task of conversion. The default filter callback function added in PAPPL are _papplJobFilterJPEG and _papplJobFilterPNG which can be found in the file Job-Filter.c and can be referenced for writing your own callback function. 1 Printer/Scanner Application = 1 Snap: Don't make a Snap which contains tons of different printer and scanner applications. This is to ensure that you don't occupy lots of ports and network resources when you have many printer and scanner applications. Printer/Scanner/Fax support can be in a single application: To support multi-function devices you can put all the printer, scanner, and fax support into one application. For example, we recommend HPLIP to be put into one single application. Recommended: 1 Printer/Scanner Application per project or manufacturer/product line: It may be possible that a multi-function device may be served by different applications for printing and scanning. For example for legacy devices, scanning may be supported by retrofitted sane-airscan scanner application while printing is supported by the Gutenprint printer application. But here it is easier and better for the project, organization, and management that each project has its own printer/scanner application snap. So SANE will maintain a SANE scanner application snap and they put it on the Snap Store. Similarly, Gutenprint, HPLIP, foo2zjs, Epson, Canon, Ricoh, and so on will do the same. NOT make 1 Printer/Scanner Application for each device: For example, HP Laserjet 4 and HP Laserjet 5 should not have different applications. Otherwise, Snap Store will be cluttered with thousands of applications, and spotting the real application would be difficult. Also, it would result in a lot of code duplication, requiring more storage on the user's machine. 1 Printer/Scanner Application = 1 Port: If there are several devices connected to the system and they are served by one printer/scanner application, do not open ports for each device. Because you may run out of ports. Also, ports are not always the same on each boot as other applications may start up before on the next boot. For more than 1 device on 1 Application use URI: ipp://localhost:/ipp/print/ This is the recommended way to cope up with several devices by only using a single port. DNS-SD service names must be always the same: They must be independent of order application start at boot or of device discovery. To make sure that a printer application can serve several devices of the same model include the DNS-SD service name the CEON number of the devices. Web admin interface should allow: suppressing auto-setup for selected devices: Auto detecting devices might be unsuitable for some cases. For example, if two printer applications support the same device, the user must be able to select with which application he wishes to print. So web interface must contain the option to somehow blacklist a printer application. manual setup of additional devices/instances Necessary for legacy printers that cannot be auto-discovered in the network. configuration of options not accessible via IPP Many manufacturers have options that cannot be translated into IPP attributes. So web interface has to provide the possibility to set up these options. sane-airscan in SANE Scanner Application must be built without IPP Scan to avoid recursive discovery infinite loop (“Scanner bomb”) [1] Printer Application [2] HP Printer App Example [3] PAPPL [4] PAPPL System Utilities [5] Packaging Drivers and Uploading them to Snap Store [6] User Manual [7] PS Printer App Example "
+ },
+ {
+ "id": "documentation:03-designing-scanner-drivers",
+ "source": "static",
+ "type": "documentation",
+ "title": "Designing Scanner Drivers",
+ "url": "/documentation/03-designing-scanner-drivers",
+ "headings": [
+ "Introduction",
+ "How a PAPPL-based Scanner Driver should work",
+ "Designing Components",
+ "Example for PAPPL-based Scanner Driver",
+ "Template for PAPPL-based Scanner Driver",
+ "Design Guidelines",
+ "Resources"
+ ],
+ "tags": [],
+ "snippet": "Currently PAPPL only provides framework for Printer Applications. The codebase is currently under development and will be expanded in a future version of PAPPL to incorporate...",
+ "content": "Currently PAPPL only provides framework for Printer Applications. The codebase is currently under development and will be expanded in a future version of PAPPL to incorporate Multi Function Printer (MFP) functionalities such as scanning. This document contains information for manufacturers for designing scanner drivers. Note that since the codebase is still under development, the document describes things as planned to be executed. In case of any changes, it will be updated as soon as possible. Also a complete tutorial along with examples will be provided after the support for MFP functionality is released. A driver is code or data specific to a certain model or group of hardware devices, needed to make the hardware work with the hardware-model-independent code of the operating system. Printing in Linux has moved towards Driverless Printing and so does Scanning, which means there is no need for any hardware-model-specific code or data. Kindly refer to Tutorial to Design Printer Drivers to know more about Printer Applications and their designing. Designing Scanner Applications is very similar and expects the manufacturers to use the PAPPL framework to reduce their effort in implementing all things from scratch.. PAPPL provides support for the below-mentioned sub-commands by default: add cancel default delete devices drivers jobs modify options printers scan server shutdown status submit Once the User issues any of the following sub-commands, the printer/scanner application converts these commands (or corresponding IPP requests) into the necessary USB/network/etc. communication to perform a scan, get capabilities, and so forth. In the class of device that we are supporting with PAPPL, the scanner will only produce raster data. It might provide native TIFF support, but that is probably all about it. PDF for example is not supported. The PAPPL scan interface should pull image data for the current page in one of three formats: 1-bit grayscale, 8-bit grayscale, and 24-bit sRGB. It will then be up to PAPPL to deliver the pages to the Client in PNG, JPEG, TIFF, or PDF format. For PNG and JPEG, each page is a separate document in the scan job. For TIFF and PDF, a single document is generated and streamed to the Client in response to the Get-Next-Document-Data operation. The scanner interface returns a single page at a time as uncompressed (or losslessly compressed) data, and PAPPL will convert that to a handful of formats requested by the Client. In the case of IPP Scan, PDF and JPEG are required and PAPPL should support PNG for lossless compression of single images and TIFF for multi-page images. PAPPL provides callbacks for most of the events including submitting print/scan jobs, querying printer/scanner status and capabilities, and so forth to reduce the manufacturer's workload and hence designing scanner applications is very much similar to designing printer applications. The only difference is the additional callback support provided for the scan command. Since this support is added in PAPPL, you as a manufacturer do not need to worry about this implementation as well. Hence refer to Tutorial to Design Printer Drivers and follow the same for Designing Scanner Applications as well. This section is under development. It will be documented after the support for Multi Function Printer (MFP) functionalities is released. This section is under development. It will be documented after the support for Multi Function Printer (MFP) functionalities is released. 1 Printer/Scanner Application = 1 Snap: Don't make a Snap which contains tons of different printer and scanner applications. This is to ensure that you don't occupy lots of ports and network resources when you have many printer and scanner applications. Printer/Scanner/Fax support can be in a single application: To support multi-function devices you can put all the printer, scanner, and fax support into one application. For example, we recommend HPLIP to be put into one single application. Recommended: 1 Printer/Scanner Application per project or manufacturer/product line: It may be possible that a multi-function device may be served by different applications for printing and scanning. For example for legacy devices, scanning may be supported by retrofitted sane-airscan scanner application while printing is supported by the Gutenprint printer application. But here it is easier and better for the project, organization, and management that each project has its own printer/scanner application snap. So SANE will maintain a SANE scanner application snap and they put it on the Snap Store. Similarly, Gutenprint, HPLIP, foo2zjs, Epson, Canon, Ricoh, and so on will do the same. NOT make 1 Printer/Scanner Application for each device: For example, HP Laserjet 4 and HP Laserjet 5 should not have different applications. Otherwise, Snap Store will be cluttered with thousands of applications, and spotting the real application would be difficult. Also, it would result in a lot of code duplication, requiring more storage on the user's machine. 1 Printer/Scanner Application = 1 Port: If there are several devices connected to the system and they are served by one printer/scanner application, do not open ports for each device. Because you may run out of ports. Also, ports are not always the same on each boot as other applications may start up before on the next boot. For more than 1 device on 1 Application use URI: ipp://localhost:/ipp/print/ This is the recommended way to cope up with several devices by only using a single port. DNS-SD service names must be always the same: They must be independent of order application start at boot or of device discovery. To make sure that a printer application can serve several devices of the same model include the DNS-SD service name the CEON number of the devices. Web admin interface should allow: suppressing auto-setup for selected devices: Auto detecting devices might be unsuitable for some cases. For example, if two printer applications support the same device, the user must be able to select with which application he wishes to print. So web interface must contain the option to somehow blacklist a printer application. manual setup of additional devices/instances Necessary for legacy printers that cannot be auto-discovered in the network. configuration of options not accessible via IPP Many manufacturers have options that cannot be translated into IPP attributes. So web interface has to provide the possibility to set up these options. sane-airscan in SANE Scanner Application must be built without IPP Scan to avoid recursive discovery infinite loop (“Scanner bomb”) [1] Tutorial to Design Printer Drivers [2] PAPPL [3] PAPPL System Utilities [4] Packaging Drivers and Uploading them to Snap Store "
+ },
+ {
+ "id": "documentation:04-packaging-drivers",
+ "source": "static",
+ "type": "documentation",
+ "title": "Packaging Drivers and Release them to the Snap Store",
+ "url": "/documentation/04-packaging-drivers",
+ "headings": [
+ "Benefits of using snaps",
+ "Top Level metadata",
+ "Apps Metadata",
+ "Parts Metadata"
+ ],
+ "tags": [],
+ "snippet": "This document contains a complete tutorial as well as information for manufacturers with examples for packaging printer/scanner drivers and releasing them to the Snap Store. If...",
+ "content": "This document contains a complete tutorial as well as information for manufacturers with examples for packaging printer/scanner drivers and releasing them to the Snap Store. If you are looking for information regarding the designing of printer/scanner drivers, kindly refer to Tutorial to Design Printer Drivers and Tutorial to Design Scanner Drivers respectively. After designing the printer/scanner application, you need to distribute these applications, so that the users can directly download and install these applications to support the printers and scanners manufactured by your company. One of the primary concerns while packaging the driver is Distribution-independent packaging. The classical printer driver binaries were specifically built for Linux distributions because the distribution provides the layout of CUPS, the libraries, and so on. Also, they have different packaging formats DEB, RPM, and many more. For each distro, drivers need to be built, packaged, and tested separately. It made the task next to impossible to execute. As a result, most of the hardware manufacturers refrained from making these drivers. But OpenPrinting has reduced the intensity of your task to a great extent as now you only need one driver for all printers, for all distributions, and distribute it through snaps. Snaps are app packages for desktop, cloud, and IoT that are easy to install, secure, cross-platform and dependency-free. A snap is a bundle of an app and its dependencies that works without modification across many different Linux distributions. Snaps are more secure. Every package with all its libraries and files in its own sandbox(isolated from other snaps and the host system), fine-grained control for communication between packages. Snaps are easily discoverable and installable from the Snap Store, an app store with an audience of millions who can browse and install snaps graphically in the Snap Store or from the command-line. You are encouraged to dive deep into the official Snap Documentation to explore more about it. Most Snaps we create are driven using snapcraft.yaml. This file describes a snap’s build dependencies and run-time requirements, it integrates remote repositories and extensions and runs custom scripts and hooks for better integration with CI systems. As a distributor, you would create a snapcraft.yaml file. This will be used by the snapcraft command to build your snap. Next, you would upload this .snap file to the Snap Store and release it on the stable channel. To start building your snap, the initial step is to install snapcraft. Kindly refer the installation guidelines to follow the same. After installation, navigate to the directory containing your application and use the following command. This creates a buildable snapcraft.yaml template within a snap sub-directory relative to your current filesystem location. The snapcraft.yaml file starts with a small amount of human-readable metadata. This data is used in the presentation of your app in the Snap Store. The former keys define the build dependencies and run-time requirements. name This is the identifying name of the snap. It must start with an ASCII character and can only contain letters in lower case, numbers, and hyphens, and it can’t start or end with a hyphen. The name must be unique if you want to publish it to the Snap Store. In this field, you may wish to use the name of your organization along the part it is designed for. For help on choosing a name and registering it on the Snap Store, see Registering your app name . base The base keyword declares which base snap to use with your project. A base snap is a special kind of snap that provides a run-time environment alongside a minimal set of libraries that are common to most applications: As used above, core18 is the current standard base for snap building and is based on Ubuntu 18.04 LTS. See Base snaps for more details. version A human-readable string(enclosed within single-quotes) of maximum size 32 characters, represents the version number of your snap. A higher version number generally corresponds to a new application. summary A single line summary that maybe 79 characters long, describes the snap in short and simple terms. It is used when users are searching through the Store for your application. description Description is used to provide a little more detail about your application. You could as many lines as you want in this field. grade Grade defines the quality grade of the snap. It can have two values. devel: a development version of the snap, so as not to be published to the stable or candidate channels. stable: a stable release or release candidate, which can be released to all channels. We would be using the grade value as stable. confinement Confinement determines if the snap should be restricted in access or not. It could have three possible values. strict: for no access outside of declared interfaces through plugs. Can be published easily and installed without any special command-line argument. devmode: for unrestricted access to system resources. Snaps having this confinement cannot be published to Snap Store. classic: Allows access to your system’s resources in much the same way traditional packages do. To safeguard against abuse, publishing a classic snap requires manual approval, and installation requires the --classic command-line argument. We would be using the confinement value as strict. There is other metadata that can be used to provide more information to snapcraft besides the above-listed ones. One may refer to Snapcraft top-level format documentation to know about it. The apps keys and values in snapcraft.yaml detail the applications and services that a snap wants to expose, including how they’re executed and which resources they can access. Each application or service is an independent block, defined by a and corresponding combinations of keys and values. These are some of the keys that could be used. command The command to run inside the snap when is invoked. In most of the applications, command will be: bin/. daemon Declares that is a system daemon. plugs A list of plugs for interfaces to connect to. Other snapcraft apps metadata may be referred from Snapcraft Apps Metadata Documentation . A most basic example for writing apps metadata is given below: Note that you must specify the same as so that it can be invoked by just specifying the . However, if they differ, the program will be exposed as .. The most important part of the snap, that declares build dependencies and run-time requirements that will be pulled into your snap package. The parts key and value in snapcraft.yaml detail how parts are configured and built by the snapcraft. Each part is an independent building block, defined by a name and corresponding combinations of keys and values. These are some of the keys that could be used. plugin The plugin that will drive the build-process for this part. source A URL or path to a source tree to build. This can be a local path or remote and can refer to a directory tree, a compressed archive, or a revision control repository. source-type Used when the type of source entry cannot be detected. build-packages A list of packages required to build a snap. stage-packages A list of packages required at runtime by a snap. after Ensures that all the parts listed in after are staged before this part begins its lifecycle. Here is only a few parts metadata that is must to be used in a printer/scanner application. The other metadata can be referred from Snapcraft parts documentation . Your Application will contain at least these 3 parts: PAPPL dependency (jpeglib) PAPPL Application Other parts includes additional dependencies if needed by your application. Default Parts for Application These parts must be included in every application. They do not require modification and the developers may consider using it as boilerplate code for their applications. JPEGLIB PAPPL supports JPEG and PNG format and for loading the image data, it uses the jpeglib library. Hence it is a dependency for PAPPL and built using the autotool plugin. The Tape Archive (TAR) file can be fetched from the below-mentioned URL. PAPPL It is the most important part of an application and is also built using the autotool plugin. It is fetched from Michael's GitHub repository using the \"git\" source-type. The build-packages and stage-packages are mentioned below. Note the after key is essential as jpeglib is a building dependency for PAPPL. Hence PAPPL must be staged after jpeglib. Non-Default Parts for Application Application Dependency (Optional) Your application may use different libraries / Utilities / APIs, for example, the ones used for converting one format of data to another format, especially in the case of non-raster printers. In this case, those libraries are a dependency for the application, which needs to be specified in the parts section. Application The core of the snap. Note that the application has a dependency on libraries as well as PAPPL. Hence don't forget to add the after key so that the application must be staged at the last. Once you have a snap that works under strict or classic confinement, you’re ready to publish the snap in the Snap Store where it can be showcased to millions. The further steps are extensively covered in the official documentation of Snaps and can be located at Releasing to Snap Documentation ."
+ },
+ {
+ "id": "documentation:05-User-Manual",
+ "source": "static",
+ "type": "documentation",
+ "title": "User Manual for Printer Applications",
+ "url": "/documentation/05-User-Manual",
+ "headings": [
+ "Introduction",
+ "Before we start",
+ "What printer application do you need?",
+ "Installation",
+ "Snap",
+ "Applications",
+ "Web Interface",
+ "Create and Delete Printers",
+ "View Logs",
+ "Update the TLS certificates",
+ "Configure Printing Defaults",
+ "Set Location and DNS-SD name",
+ "Configure Networking Settings",
+ "Printer Specific Utilities",
+ "Working with Command-Line",
+ "Server Daemon",
+ "Devices",
+ "Handling Jobs",
+ "Other Utilities",
+ "Resources"
+ ],
+ "tags": [],
+ "snippet": "This document is a user manual, containing information about installing drivers provided as Printer/Scanner Applications, installing the CUPS Snap, configuring and using web...",
+ "content": "This document is a user manual, containing information about installing drivers provided as Printer/Scanner Applications, installing the CUPS Snap, configuring and using web interface options, and finally use the printer or scanner to print and scan respectively. The user is relieved from most of the complexities arising from classic CUPS printer drivers, like needing packages for their particular distro (or at least compatible with it). With new format for printer drivers they just need to install the driver provided as a Printer/Scanner Application (based on the manufacturer and model) and use the same to get their devices working. Further, many manufacturer's devices have options that cannot be translated into IPP attributes. So the users can change their printer/scanner properties through the Web GUI provided with the Printer/Scanner Application. If you have a modern, driverless IPP printer or scanner (AirPrint, Mopria, IPP Everywhere, Wi-Fi Direct Print), you do not need any Printer/Scanner Application. The Printer/Scanner Application you need to use depends on your printer's manufacturer, model and which classic driver supports it. We at OpenPrinting have developed Printer Applications covering printer drivers which are available in Debian/Ubuntu to provide retro-fitting (to keep the old devices working, but without adding new features) support for older devices which are currently supported in the distributions, and we provide the Legacy Printer Application for devices, which drivers are no longer supported by the manufacturer or they aren't in distributions for various reasons (no open-source license, no public source code, nobody packaged it...). The Legacy Printer Application is able to find classic drivers installed on the system and print on the supported printers. The PostScript Printer Application also allows uploading PPD files for printers via its web administration interface. We at OpenPrinting provide Printer Applications as Snaps, so these manuals contain Snap-related information. However distributions might provide Printer Applications packaged under classic packaging systems like DEB or RPM, or by another container solution, f.e. Podman or OCI containers. The exception is the Legacy Printer Application, which cannot be containerized due to its nature, so it is part of pappl-retrofit and can be shipped only by classic packaging systems. All the four Printer Applications currently available at OpenPrinting are only for retrofitting purposes and any new drivers should be written as native Printer/Scanner Applications, which can be shipped as a container (Snap, Podman, OCI containers) or via classic packaging systems. The Native Printer Applications can be provided by the printer's manufacturer or by community developers who have access to the printer. In case you require a classic driver, there are two ways depending on the source of your driver: For your printer you have used a driver which came with your distribution. Thn one of the Printer Applications at OpenPrinting contains it. For your printer you used a driver which is not in any package in your distribution, a proprietary driver from the printer's manufacturer for example. Install the Legacy Printer Application and it will see your classically installed driver and will use it. For installing Printer/Scanner Applications, you should have snap installed on your system. On many systems snap is already installed (for example Ubuntu), if not you can usually easily install it. To install snap from the Software Manager application, search for snapd and click Install. Alternatively, snapd can be installed from the command line: Once snap is installed, you can easily install any driver. Find the name of the application compatible with your device. This information will be provided by your device manufacturer. You can install the application browsing the Snap Store or from the command line: Many interfaces are automatically connected when a snap is installed, and this ability is a property of either the interface itself or the snap. Interfaces not connected automatically require the user to make a manual connection using the snap connect command. Information regarding which interfaces require manual connection will be mentioned by the manufacturer. The embedded server can also provide a web interface to the Printer/Scanner Application, and PAPPL includes a standard web interface that can be customized and/or overridden. Aside from the usual status monitoring functionality, the web interface can be configured to allow remote users (with proper authentication) to: Create and delete printers Set the printer location and DNS-SD name Configure the loaded media Configure remote access accounts Configure networking settings such as the hostname Update the TLS certificates used by the server Interface Create printers Resource path: /addprinter Add Printer The addition of a printer requires only the following attributes: Name of the printer Device can be one of the following: Label Printer Office Printer Network Printer The choices here vary with the Printer Application and the available printer devices. Usually, here you will see printers which were discovered on your system, both local (USB and also manufacturer-specific or legacy connection types) and network printers. ideally only the ones supported by this Printer Application. Sometimes also manual options, like \"Network Printer\" with the possibility to enter a hostname/IP in the next field, are available, too. Hostname/IP Address of the printer required only in the case of a Network Printer. Driver Name needs to be selected from the available list of drivers provided by the manufacturer. Resource path: /logs Logs The complete system logs can be viewed here. If you prefer to read the text file instead, use the resource path: /logfile.txt. Following are the options that can be used to update the Transport Layer Security (TLS) certificates used by the server: Create New TLS Certificate Resource path: /tls-new-crt Create New TLS Certificate This form creates a new 'self-signed' TLS certificate for secure printing. Self-signed certificates are not automatically trusted by web browsers. Create TLS Certificate Request Resource path: /tls-new-csr Create TLS Certificate This form creates a certificate signing request ('CSR') that you can send to a Certificate Authority ('CA') to obtain a trusted TLS certificate. The private key is saved separately for use with the certificate you get from the CA. Install TLS Certificate Resource path: /tls-install-crt TLS Install This form will install a trusted TLS certificate you have obtained from a Certificate Authority ('CA'). Once installed, it will be used immediately. Printing Resource path: //printing Printing Defaults Many manufacturer's devices have options that cannot be translated into IPP attributes. So the web interface provides the possibility to set up these options. The printing defaults are automatically fetched for each job and the user is not required to pass them each time using the command-line. Media Resource path: //media Media Config You can use this segment to configure the loaded media including the size, offset, and rolls. Resource path: /config Config Networking Resource path: /network Networking The option can be used to configure networking settings such as the hostname and also to see the list of interfaces/addresses. Security Resource path: /security Security You may use this option for setting the access password. Apart from configuring printing defaults for the printer, these are the other printer-specific utilities. Supplies (Only available for Office Printers) Resource path: //supplies Supplies This utility helps the user to know the remaining supplies of different inks in the cartridge(s) of the printer. Identify Printers This option supports printer identification, usually a sound or a light on the printer, which is a requirement for IPP Everywhere™ and is used to visually or audibly isolate a particular printer for the user. Print Test Page This option helps in testing printer functionality, by issuing a print command for a sample test page. Before start working with your device, you must know about the capabilities of your printer/scanner by viewing the set of sub-commands and options supported by your printer/scanner. For retrieving this information, you need to pass the --help argument: The default list of sub-commands and options available with all applications is shown below. Note: Printer Application can have additional sub-commands. You can get the information about them using the --help argument. Start Server Before adding devices and submitting jobs, you must start the application as a server daemon: The list of options you could use are: | Option | Significance | |-----------------|----------------------| | spool-directory | Spool directory | | log-file | Log File | | server-hostname | Hostname | | log-level | Log Level | | server-port | Port | | admin-group | Administrative Group | Close Server You can close the daemon using the following command: Adding Device Add a printer queue. The following fields are required to be mentioned for creating a printer queue: Device name Device URI Driver Name Default Options (Optional) You can obtain the possible list of values via the call with the drivers sub-command: You can also obtain the possible list of values via the call with the devices sub-command: Setting Default Device Get/Set the default the printer queue. The default device is used when the device is not inputted along with the job. Get the Default Device Set the Default Device Modifying Printer Modify a printer queue by changing the following fields: Device URI Driver Name Default Options Deleting Device Delete a printer queue. Submit Jobs Submit a file for printing. Cancel Jobs All jobs Specific Job List devices List the connected printers. List drivers List the supported drivers. List jobs List pending print jobs. List printer options List the supported options. List printers List the printer queues. Status Show server/printer/job status. [1] Printer Application [2] Snap Documentation [3] PS Printer App README [4] HP Printer App Man Page [5] PAPPL Documentation "
+ },
+ {
+ "id": "project:00-cups",
+ "source": "static",
+ "type": "project",
+ "title": "CUPS",
+ "url": "/project/00-cups",
+ "headings": [
+ "Project Links"
+ ],
+ "tags": [],
+ "snippet": "CUPS is the standards-based, open source printing system for Unix®-like operating systems. CUPS uses the Internet Printing Protocol (IPP) to support printing to local and network...",
+ "content": "CUPS is the standards-based, open source printing system for Unix®-like operating systems. CUPS uses the Internet Printing Protocol (IPP) to support printing to local and network printers. OpenPrinting is continuing the development of CUPS to further improve printing. Home Page GitHub Downloads "
+ },
+ {
+ "id": "project:01-cups-filters",
+ "source": "static",
+ "type": "project",
+ "title": "Cups-Filters",
+ "url": "/project/01-cups-filters",
+ "headings": [
+ "Project Links"
+ ],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "project:02-foomatic",
+ "source": "static",
+ "type": "project",
+ "title": "Foomatic",
+ "url": "/project/02-foomatic",
+ "headings": [
+ "Project Links"
+ ],
+ "tags": [],
+ "snippet": "Foomatic is a database-driven system for integrating free software printer drivers with the CUPS printing system and also with an easy-to-use command-line interface for direct,...",
+ "content": "Foomatic is a database-driven system for integrating free software printer drivers with the CUPS printing system and also with an easy-to-use command-line interface for direct, spooler-less printing. Foomatic consists of three packages: foomatic-db-engine Foomatic's database engine generates PPD files from the data in Foomatic's XML database. It also contains scripts to directly configure print queues and handle jobs. foomatic-db The collected knowledge about printers, drivers, and driver options in XML files, used by foomatic-db-engine to generate PPD files. It also contains manufacturer-supplied PPD files which got released under free software licenses. foomatic-db-nonfree Foomatic database extension consisting of manufacturer-supplied PPD files released under non-free licenses which restricts them in how they can get redistributed."
+ },
+ {
+ "id": "project:03-ippusbxd",
+ "source": "static",
+ "type": "project",
+ "title": "IPPUSBXD",
+ "url": "/project/03-ippusbxd",
+ "headings": [
+ "Project Links"
+ ],
+ "tags": [],
+ "snippet": "IPPUSBXD is a userland driver for IPP-over-USB class USB devices. It has been designed for Linux but uses a cross platform usb library allowing eventual porting to Windows and...",
+ "content": "IPPUSBXD is a userland driver for IPP-over-USB class USB devices. It has been designed for Linux but uses a cross platform usb library allowing eventual porting to Windows and other non-POSIX platforms. The IPP-over-USB standard was ratified by the USB forum in 2012. As of 2014 Mac OS X implemented this standard and with the addition of ippusbxd Linux shall as well. IPPUSBXD depends on POSIX threads, POSIX networking, and libusb as developed by the community at libusb.info IPPUSBXD has the following advantages: At runtime links only with libc, pthreads, libusb, and libavahi*. On a typical system these libraries will already be in RAM. This gives ippusbxd a minimal ram footprint. Requires no read access to any files. Ships with a strict AppArmor profile. Runs warning & leak free in valgrind Compiles warning free in clang Analyzed warning free in Coverity Can be installed anywhere Near zero CPU usage while idle Low CPU usage while working"
+ },
+ {
+ "id": "project:031-driverless-printing",
+ "source": "static",
+ "type": "project",
+ "title": "Driverless Printing",
+ "url": "/project/031-driverless-printing",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "project:04-print-dialog",
+ "source": "static",
+ "type": "project",
+ "title": "Common Print Dialog Backends",
+ "url": "/project/04-print-dialog",
+ "headings": [
+ "Project Links"
+ ],
+ "tags": [],
+ "snippet": "The Common Printing Dialog Backends (CPDB) project of OpenPrinting is about separating the print dialogs of different GUI toolkits and applications (GTK, Qt, LibreOffice, ...)...",
+ "content": "The Common Printing Dialog Backends (CPDB) project of OpenPrinting is about separating the print dialogs of different GUI toolkits and applications (GTK, Qt, LibreOffice, ...) from the different print technologies (CUPS/IPP, Google Cloud Print, ...) so that they can get developed independently and so always from all applications one can print with all print technologies and changes in the print technologies get supported quickly. If one opens the print dialog, the dialog will not talk directly to CUPS, Google Cloud Print, or any other printing system. For this communication there are the backends. The dialog will find all available backend and sends commands to them, for listing all available printers, giving property/option lists for the selected printers, and printing on the selcted printer. This communication is done via D-Bus. So the backends are easily exchangeable and for getting support for a new print technology only its backend needs to get added."
+ },
+ {
+ "id": "project:05-miscellaneous",
+ "source": "static",
+ "type": "project",
+ "title": "Miscellaneous",
+ "url": "/project/05-miscellaneous",
+ "headings": [
+ "Implementing PWG standards for Linux and other Posix-style operating systems",
+ "Work with printer manufacturers on making printer drivers"
+ ],
+ "tags": [],
+ "snippet": "We help printer manufacturers to write print drivers and get printers working on Linux and other Posix-style operating systems.",
+ "content": "We help printer manufacturers to write print drivers and get printers working on Linux and other Posix-style operating systems."
+ },
+ {
+ "id": "page:about-us",
+ "source": "static",
+ "type": "page",
+ "title": "About Us",
+ "url": "/about-us",
+ "headings": [
+ "OpenPrinting",
+ "A Brief History",
+ "Major Roles",
+ "Our Code of Conduct: Code of Conduct"
+ ],
+ "tags": [],
+ "snippet": "Learn more about OpenPrinting",
+ "content": "How did this all begin? Our principal achievements What we are currently doing Before 2006, linuxprinting.org and Free Standards Group's OpenPrinting WorkGroup were working on the printing architecture for Linux. Till Kamppeter was the manager of linuxprinting.org and FSG's OpenPrinting WG was led by Tom Hastings, Michael Sweet, Ira McDonald, Claudia Alimpich, Glen Petrie, and Norm Jacobs. linuxprinting.org was known as the de facto standard repository for printer drivers on Linux. In parallel, FSG's OpenPrinting workgroup designed standard APIs for the Linux/Unix printing workflow. In July 2006 linuxprinting.org merged with FSG's OP WorkGroup and Till Kamppeter was hired to lead OpenPrinting. On January 22, 2007, the FSG and the Open Source Development Labs(OSDL) merged to form The Linux Foundation. Now, OpenPrinting is a free software organization under The Linux Foundation. OpenPrinting Works on the development of new printing architectures, technologies, printing infrastructure, and interface standards for Linux and UNIX-style operating systems. Collaborates with IEEE-ISTO Printer Working Group (PWG) on IPP projects. Is working with SANE to make driverless scanning a reality. Maintains cups-filters which allows CUPS to be used on any Unix-based (non-macOS) system. Is responsible for the Foomatic database. Is working on the Common Print Dialog Backends project. Takes care of integrating the printing infrastructure with all types of operating systems (classic distro, immutable distro, ...) and software distribution technologies (Snap, Docker, ...)"
+ },
+ {
+ "id": "page:achievements",
+ "source": "static",
+ "type": "page",
+ "title": "OpenPrinting - Our principal achievements",
+ "url": "/achievements",
+ "headings": [
+ "All free drivers to be used with CUPS",
+ "Getting all Linux distributions to use CUPS",
+ "PDF instead of PostScript as standard print job format",
+ "Common Print Dialog",
+ "Grand Unified Ghostscript: CUPS support, third-party built-in drivers ...",
+ "cups-filters",
+ "cups-browsed",
+ "Common Print Dialog Backends",
+ "CUPS upstream home is OpenPrinting now",
+ "The CUPS Snap",
+ "All free drivers in a PPD-less world - OR - All free drivers in Snaps",
+ "Driverless printers on USB - IPP-over-USB",
+ "\"localhost\" support in Avahi",
+ "SANE backends for driverless scanning - eSCL and WSD (AirScan)",
+ "The OpenPrinting web site"
+ ],
+ "tags": [],
+ "snippet": "What we have done so far",
+ "content": "This page represents the state of August 2022 In the 21 years from the beginning of OpenPrinting up to now we have changed a lot of things to improve the user experience with printing on free software and Posix-style operating systems (like Linux). I have worked on this full-time since mid-2000, first at MandrakeSoft in Paris, from mid-2006 on I got paid by the Free Standards Group and from 2007 on by the Linux Foundation, for leading the OpenPrinting project, and in addition part-time by Canonical for maintaining the printing part of Ubuntu. And from Feb 2012 on I got full-time employee of Canonical, to continue leading the OpenPrinting project. So thanks to MandrakeSoft/Mandriva, the Linux Foundation, and Canonical to make this project possible and successful! My first task back in 2000 at MandrakeSoft was to switch over Mandrake Linux from LPD to CUPS, and this was not only making the first RPM packages of CUPS, but also to make sure that for the users of the first ever Linux distribution which uses CUPS as printing system all hardware (printers) which was supported in the previous distro version (using LPD) is still supported. THis meant especially that I need PPD files and CUPS filters (wrappers) for all drivers, and there were already many in the free software printing stone age ... Printer drivers were not such a well-defined thing as current CUPS drivers consisting of filters and PPD files or even Printer Applications are. They somehow turned a standard input format (usually PostScript or some bitmap format which Ghostscript was able to generate) into what the printer needs, but this was all what made a software be a printer driver. Drivers could be some output device compiled into Ghostscript, or some tiny, simple filter executable which turns Ghostscript's output into at least one of the input data formats of the printer, or one had Ghostscript Uniprint files to use the first data-driven Ghostscript driver, ... But anything machine-readable which tells how to use the driver and which user-settable options are there was usually not included. Here third-party projects like Magic Filters or apsfilter came into play ... Fortunately, there was a site named linuxprinting.org which tried exactly this. Exactly it was a database of printer models and of free software drivers, telling which printers work with free software (and therefore is not a \"Paperweight\") and if so, with which driver. But the very special thing of the site was that it did some automated, systematic integration of printer drivers with printing systems, and there were several printing systems: LPD, LPRng, PDQ, and ... CUPS! So this system provided a universal wrapper CUPS filter for printer drivers, named cups-o-matic plus a generator for PPD files which uses the printer and driver properties (page sizes, color modes, trays, other user-settable options, driver command lines, ...) stored in the database to generate a PPD for each valid printer/driver pair. The problem was that the database was not completely populated, many drivers were missing the information on how to execute them (command line, options, ...). So I asked the site's author to complete the missing info and as he did not have the time to enter this detaiiled information, he gave me full write access and I could complete the database by myself, solving the driver integration problem. So now I had PPD files and the universal cups-o-matic filter for all drivers and so the printer drivers made it into the age of CUPS. So the second generation of printing with free software could start. Later on, with Grant not having time for his project any more and me coming up with more and more feature requests he passed the project over to me in mid-2001 and so I got the leader of linuxprinting.org, also known as Foomatic. Now, with one distribution, Mandrake Linux, using CUPS as its standard printing system, me, together with Kurt Pfeifle, continued marketing CUPS on conferences and especially by organizing a community booth about printing every year on the LinuxTag, in that time the largest free software show in Europe, from 2001 on until 2006. This, and probably also the good user experience with printing in Mandrake Linux, also convinced the other distributions, Red Hat, SUSE, Debian, ... to switch over to CUPS, using my Foomatic work. CUPS got the new standard for printing on all Posix-style operating systems! Even Mac OS had adopted CUPS in 2002 (where I do not know whether my work had also influence on Apple. Have I perhaps promoted Michael Sweet to make it into Apple?)! Decades ago, when it began with the POSIX-style operating systems, there were commercial Unix systems, usually used in data centers at universities or larger companies. Printers were either line printers which printed plain text or PostScript laser printers as only option for text-and-graphics printing. So applications sent jobs in plain text or PostScript and PostScript turned to be the standard print job format for graphical printing. Later on, and especially with the introduction of Linux for PCs, there was also need for printing on consumer-grade, usually non-PostScript printers. Here Ghostscript came into place to render the PostScript coming in from applications and either generate the printer's format with a built-in driver or a generic bitmap format for an external driver. This principally works but is not the best solution. PostScript is a format from 1984 and does not support important elements of modern document creation, like transparency. It is also a Turing-complete programming language which opens possibilities for abuse. Also for publishing printable documents on the internet PDF, Adobe's successor of PostScript was already used. And PDF is still developed on by Adobe. So Michael Sweet and me, we decided on making the standard print job format to be PDF and I announced this decision on the first OpenPrinting Summit which I organized, 2006 in Atlanta. Principally, PDF as standard print job format means that applications send jobs in PDF and non-PDF input is converted to PDF by CUPS, then page management (N-up, output order, selected pages, ...) is done in PDF, and after that the PDF is converted to the final format needed by the printer. To implement this we needed several new CUPS filters for the PDF-based print workflow, imagine, as a first approach, to replace all pstoXXX filters by pdftoXXX. Also the central pstops filter had to be replaced by a pdftopdf filter. Fortunately, Ghostscript accepts also PDF and not only PostScript as input, so that all printer drivers involving Ghostscript could be continued to be used. Also CUPS itself did not need any change as its excellent filter system, completely controlled by MIME types and MIME conversion rules and the filters themselves being separate executables, one only needed to add the new filters and to change the conversion rules. For coding the filters I have found volunteers in the community and at some member companies of the PWG. Later on, when we started participating in the Google Summer of Code in 2008, we ran also some filter implementation projects there. GUI and application projects have practically all switched to send print jobs as PDF. As I am maintainer of the CUPS package in Ubuntu I had switched it to the PDF-based print workflow as soon as I had all filters together, not yet having an organized upstream home for these filters, neither an extra upstream project nor imclusion in CUPS. I simply added a filter source package to the CUPS package of Ubuntu. Only when I introduced cups-filters in the end of 2011 I was able to switch the official CUPS filters (which were cups-filters then) to the PDF-based printing workflow and so all distributions got switched over. This is the only project on which we failed (but others succeeded, see below). On the first OpenPrinting Summit in 2006, at Lanier (now Ricoh) in Atlanta, Georgia we had a group of GUI/Usability experts to brain-storm about a better print dialog design and we had them even meeting again on further Summits continuing in breakout sessions. The result was not only new approaches in the GUI design of the print dialog, but also the idea of having one and the same print dialog for all applications, independent which toolkit they use, which we called the Common Print Dialog. For this the print dialog should be a part of the desktop environment (GNOME, KDE, ...) and available for the applications as a D-Bus service. The applications will then shout into the D-Bus instead of opening their own print dialog, ending up with always having the GTK dialog when using GNOME and always having the Qt dialog when using KDE. So the user will see only one type of print dialog in their desktop environment, independent which applications they are using. The actual coding started in 2008, when we (the Linux Foundation, not only OpenPrinting) were for the first time mentoring in the Google Summer of Code. Lars Karlitski (Lars Übernickel in that time) has created the D-Bus interface and also coded on the GTK dialog while another student coded on the Qt dialog. The D-Bus interface got completed and working, but the dialog GUIs got far from complete. Also students in the 2009 GSoC (where Lars was mentoring) did not complete the dialogs. Also Lars, Peter Sikking (one of the GUI experts on the Summits, running a GUI/usability design firm), and me regularly met in-person (very rare in the free software world) in Berlin (Peter and me lived there, Lars 2 hours driving away from Berlin) to work on the GUI design of the dialog. As we did not succeed to complete the coding of the complex design of the dialog we tried to get funding for paid developers completing it. The German government organization Bundesamt für Sicherheit in der Informationstechnik (BSI, Federal Authority for IT Security) wanted to give a part as they were switching around 200 work places from Windows to Linux and wanted an easy printing experience for their users. Later on we also got Canonical into the boat. They hired Lars full-time for this task, but as soon as he was hired I told this to the people from the BSI but then they did not answer my e-mails any more and so we considered the project failed. It was no problem for Canonical having hired Lars and our project being discontinued. There was enough GTK/GNOME work for Lars to do, and after some years he switched to Red Hat. So I have got him into a nice career. In my opinion our failure was trying to create the perfect GUI for the dialog. If we had simply used the D-Bus interface and the original print dialogs of GTK and Qt we had probably succeeded ... But, many years later, I have seen this idea being actually implemented. But it is not clear whether it got picked up from my presentations of the idea of the Common Print Dialog on conferences or whether it was created independently. The implementation happened to be in the Flatpak system for distribution-independent packaging of desktop applications (in contrary to Snap only desktop applications, no command line utilities, system daemons, system components, or core systems). Flatpak comes from freedesktop.org, and is popular in the RedHat-ish world. Flatpaked desktop applications communicate with the host system/the outside world through so-called Portals, so for printing they use the Printing Portal. In contrary to Snap's interfaces the Portal is not an AppArmor permission to access a certain part of the host system (or another Snap) or a mount of certain parts of the host's (or another Snap's) file system, but instead, it is a D-Bus API which provides common GUI dialogs for common tasks (choose file, save file, print, ...), where the dialog comes from the desktop environment (GNOME or KDE) and so is the one of the desktop environment, a common dialog and is de-coupled from the user application via the D-Bus interface. So when using the GNOME desktop and printing from a flatpaked KDE app we should see GNOME's print dialog. See more details in my \"Flatpak and Printing\" article. When Michael Sweet created printer drivers (ESP Print) and finally CUPS during the 90s of the previous century, he included a modified version of Ghostscript as PostScript interpreter to print incoming PostScript jobs from applications on non-PostScript printers. Main modification was most probably adding the output of the device-independent CUPS Raster format or a predecessor of it. Later on, when CUPS was released as free software, the modified Ghostscript was also made available as free software, named ESP Ghostscript. This Ghostscript got the Ghostscript of the Linux distributions when they adopted the CUPS printing system. Michael Sweet and me, we continued its development. Especially I added all the third-party Ghostscript drivers which the distributions had to add to GPL Ghostscript as patches on their own, making Ghostscript in distributions always one of the packages with the most patches. ESP Ghostscript also got an improved, easier to control build system based on autoconf and I added a patch from Mandrake which made the X11 output device dynamically loadable, so that the same binary executable of Ghostscript can be used in both desktop and headless server systems. In May 2006, the Ghostscript developers announced that from version 8.54 on they will merge the former commercial, leading-edge (AFPL) and the free GPL development branch, which was only based on the previous major release, and so doing the leading-edge developemnt as free software, usable by the Linux distributions. Ghostscript leading edge is now GPL! Posted 7 Jun 2006 by raph I have some great news to report. The leading edge of Ghostscript development is now under GPL license, as is the latest release, Ghostscript 8.54. By switching to the GPL, we're reaffirming our commitment to the free software world. One big reason for this decision was to reduce the lead time between bugs being fixed in the development tree and users seeing the fixes, especially those users dependent on Linux distributions. Moving forward, we'd also like to resolve the effective fork with \"ESP Ghostscript\", so that our development tree is suitable directly for use in Linux distributions without a lot of extra patches. It would be very nice if all the GPL patches could be incorporated into the main tree without any license restrictions (which means that we need copyright assignment), but realistically, we'll still have to implement an apartheid system of some kind, so that a GPL-only subdirectory exists that gets deleted out of our commercial releases. Linux distributions continued using ESP Ghostscript though, due to the CUPS Raster output device and the complete set of built-in printer drivers. As the upstream Ghostscript development is under GPL now, Michael Sweet decided to discontinue the separate ESP Ghostscript development and merge ESP Ghostscript into GPL Ghostscript. In April 2007 I started the merger moving all the extra features of ESP Ghostscript into GPL Ghostscript, making up the Grand Unified Ghostscript, which was released as version 8.60 in August 2007. It was really a large surgery on GPL Ghostscript but worked out smoothly with the great collaboration of Ghostscript's upstream developers of that time (esp. Ralph Giles, Raph Levien, Ray Johnston), Michael Sweet, distribution package maintainers Werner Fink (SUSE) and Bernhard Rosenkränzer (Ark Linux), for testing all the changes, adapting patches to GPL Ghostscript, upstreamizing distribution patches ... In the CUPS Blog I posted: The Grand Unified Ghostscript Officially Released: GPL Ghostscript 8.60 Now the merger between ESP Ghostscript and GPL (upstream) Ghostscript is done and available in an official, stable release. Artifex has released GPL Ghostscript 8.60, which is is now the Ghostscript recommended for use in Linux distributions. Now the latest and greatest Ghostscript will make it into the distros. This new version contains especially the CUPS raster output device, IJS and OpenPrinting Vector interfaces for driver plug-ins, all built-in printer drivers listed in the OpenPrinting database, X display drivers in a separate shared library, and many more improvements and bug fixes. From then on, all distributions switched to GPL Ghostscript (Ubuntu Gutsy Gibbon, 7.10 and the patch hell in the distribution packaging had an end. In February 2007, Apple acquired ownership of the CUPS source code and hired Michael Sweet, for continuing CUPS developemnt as free software (GPL2/LGPL2 licensing terms), and for using CUPS as the printing system of Mac OS. As Apple uses their own, proprietary filter suite (note that one can easily replace the filters in CUPS, see \"PDF instead of PostScript as standard print job format\" section above) and not the free software filters which originally came with CUPS, they dropped the further development of most of these filters, removed them from the CUPS source code repository, and passed them over to OpenPrinting. This happened with the CUPS 1.6.0 release in July 2012. As the actual pass-over happened somewhat earlier, I created the cups-filters project starting from the filters and backends which Apple had abandoned end of 2011. Right away, even before I did the very first release of cups-filters, I pulled the plunge for the PDF-based printing workflow everywhere, adding the PDF-related filters which we developed already since 2006 and tested already for several years in Ubuntu. This way, right away when distributions had to include cups-filters when they updated CUPS to version 1.6.x, they automatically got switched to the PDF-based print workflow. This did not cause any complaints and most applications probably had already switched over that time. During the following 11 years up to now the filters were continuously maintained and developed. Especially we are preparing cups-filters for the New Architecture of printing, meaning that we do not have PPD files any more and classic printer drivers are replaced by Printer Applications (emulators of IPP printers): Driverless printing support: Output formats for driverless printing got included:PDF, PWG Raster, Apple Raster, PCLm) Filter functions: Filter executables turned into filter functions, library functions with standardized call scheme, also for easy chaining. This rerduces external function calls and also makes it easier to use the filters from Printer Applications (Software-emulated IPP printers to replace printer drivers). They also do not use environment variables and log into a log function, to make them also easy to use in non-CUPS environments. Use without PPD files: As use of PPD files will end with CUPS 3.x and already the CUPS Snap does not support adding PPD files for new printer drivers any more, the filter functions can now also be used with IPP attributes instead of with PPD files. These changes will soon appear in the second generation of cups-filters, version 2.x. CUPS 1.6.x did not only drop the free software filters but also switched from its own broadcasting/browsing to easily share queues to remote systems using CUPS to the standard DNS-SD method. This way CUPS is especially a complete emulation of a driverless IPP printer, advertising itself via DNS-SD, speaking IPP 2.x, and understanding standard data formats like PDF, and in addition, we have less clutter by different network communication protocols being used. What we lost by this is that CUPS clients do not auto-create a queue to a printer shared by a CUPS server any more. The user can find the DNS-SD self-advertising remote CUPS queues but there are no local queues automatically set up any more which point to these remote printers. So the user cannot \"just print\" on a remote CUPS printer any more, without manually setting up a local queue first. Ubuntu 12.10 shipped CUPS 1.6.x for the first time. Filters were there, even for PDF-based printing but the automatic setup of client queues pointing to remote CUPS printers was missing. As there was not much time for creating something new before Feature Freeze I simply patched the broadcasting/browsing functionality of CUPS 1.5.x into Ubuntu's CUPS 1.6.x but clearly expressed that this is an interim solution for only this Ubuntu release and something better will come with the next Ubuntu release, 13.04. And I found the \"something better\". In the end of 2012 I created an auxiliary daemon which gets triggered by the DNS-SD advertising of the remote CUPS queues and this way automatically creates the client queues, it even removes the local queue again when the shared printer disappears (for example when one leaves the network). So this is very close to what are the temporary queues in modern CUPS. I named this daemon \"cups-browsed\" and added it to the cups-filters project. And with this the user experience in the distributions did not change with the transition from CUPS 1.5.x and 1.6.x With the time, cups-browsed got a lot of new features, advancing to be a universal auxliary daemon for CUPS, especially the former Red Hat printing maintainer Tim Waugh added functionality that cups-browsed does (when activated by configuration file) the classic CUPS broadcasting/browsing as there are still many long-term-supported enterprise distributions, both servers and desktops around and they often still have CUPS 1.5.x or older. Also a clustering facility, much more sophisticated than CUPS' implicit classes (which also disappeared with 1.6.x) got added, highly configurable for manual and automatic clustering, different fail-over and load-balancing schemes, and even clusters of completely different printers (laser, photo inkjet) and by the job and its option settings cups-browsed determines which is the most suitable printer. But most importantly, unfortunately, cups-browsed turned a stop-gap for overcome the fact that print dialogs do not support the temporary queues which got introduced in CUPS some years ago. Temporary queues are CUPS' replacement for the missing auto-creation of client queues pointing to remote printers. A client can discover a remote printer via DNS-SD and then send a job to the local CUPS as CUPS had a queeu pointing to this printer. Then CUPS auto-creates the queue, prints the job, and when the queue stays idle for a minute afterwards, removes the queue again. Print dialogs did not switch to the new print destinations API of libcups and so did not discover such printers. So I have added a configuration option to cups-browsed to check whether a discovered remote printer would print on via the local CUPS through a temporary queue and in this case create a permanent queue pointing to this printer, in a way that CUPS considers the creation of a temporary queue unneeded. Once this done I had to keep cups-browsed in the standard desktop installation of Ubuntu up to today, as not all print dialogs support temporary queues yet. I hope I will be able to remove cups-browsed from Ubuntu soon. Some years after having failed with the Common Print Dialog Aveek Basu suggested to revive the project, but I was unsure about that. And when I was fixing a CUPS-related bug in the GTK print dialog I discovered that it uses backends for different print technologies. This brought up a new idea in me to improve the print dialogs. It was back in 2017, CUPS already having the concept of the temporary queues, auto-created by CUPS when a client prints on a DNS-SD-discovered IPP printer through the local CUPS and the local CUPS does not need to have a queue set up for this printer. For a client to know for which printers it can simply send jobs to the local CUPS, it needed a special, newly introduced API of libcups, but in print dialogs the switchover to the new API was missed out for many years, making the dialogs only displaying the permanent, usually manually set up, print queues Also, now with the introduction of the new Architecture of printing, going all-IPP and not using PPD files any more, print dialogs would need another update to not try to load the PPD file from CUPS (or even directly from the file system) to obtain the printer capabilities and options, but instead, use CUPS APIs of libcups, which internally use CUPS's current methods to get the needed information about the printer. The delays in GUI toolkit (GTK, Qt) and desktop application projects to update their print dialogs to new technologies, caused by missing volunteers for maintaining the print dialogs and also long release cycles, led us to the idea to move the responsibility on the communication with the print technology away from GUIs and applications and towards the maintainers of the print technology itself (OPenPrinting in case of CUPS). For this we separated the communication with the actual print technology (CUPS, print-to-file, cloud printing services, ...) out of the print dialog GUIs and applications by using a D-Bus interface. So the communication with the print technology happens in a backend module which provides a standardized D-Bus service, providing methods for listing available printers, listing options an choices for a given printer, printing a job on a given printer, ... The print dialogs get frontends which call these D-Bus methods. There is one backend per print technology (CUPS, print-to-file, cloud printing services, ...) and a print dialog is supposed to shout into the D-Bus and get a list of available printers for each of This we call the \"Common Print Dialog Backands\" and the project started back in the Google Summer of Code 2017. Here is the final report of Nilajana Lodh who worked on cpdb-libs, the central libraries with the D-Bus interface. The D-Bus interface was actually working a support for it in LibreOffice was implemented in the same Google Summer of Code but we did not get it into the GTK and Qt print dialogs yet. In this year's (2022) Google Summer of Code we have another contributor working on it and his work is promising. End of 2019 Michael Sweet left Apple to start Lakeside Robotics. After that any further developemnt of CUPS at Apple stopped. In 2020 there were only a few commits on Apple's CUPS GitHub to fix one urgent security bug. Bug reports stayed untouched and accumulated. In September 2020 Michael teamed up with us to fork Apple CUPS to fix bugs, incorporate distribution patches, and continue its development. In the beginning it was meant to be temporary, until Apple resumes to develop CUPS. As Apple did not resume the upstream work on CUPS in the following months, we have made OpenPrinting now the official upstream home for CUPS. We now continue developing CUPS, independent of Apple. So we can add features and lead CUPS into the New Architecture without PPD files and with Printer Applications. CUPS has a new home page now and what was formerly our fork is now the official CUPS repository. We started releasing the 2.4.x series end-2021, now without \"opX\" suffix of forked CUPS versions. Also all documentation files which come with it are updated to point to the OpenPrinting resources. Mailing list for development discussions is our printing-architecture list. So today Apple CUPS is the version of CUPS that is provided with macOS® and iOS® while OpenPrinting CUPS is the version of CUPS being further developed by OpenPrinting for all operating systems. This way we could establish a roadmap for upcoming CUPS releases, especially in the end of 2023 releasing CUPS 3.x with the NEW Architecture of handling printers IPP-only without PPDs and classic drivers. Michael has presented development plans on Linux Plumbers 2021 and the OpenPrinting Summt/PWG Meeting 2022. In October 2017 I started snapping (= packaging as a Snap) CUPS. Canonical started Snap in that time to have a sandboxed, Linux-distribution-independent packaging system to make distribution of software for Linux as easy as distribution of apps on smartphones. Users of any distribution with snapd installed (and snapd one can easily install on all systemd-based Linuxes) can find application software packages in the Snap Store and install it right away. No need to have packages for exactly that release of the Linux distribution one is using, and finally also software released after the distribution one is using is available. Snap has also a rigorous security system, encapsulating the application's file systems against each other and only allowing controlled communication between different Snaps and also beteween Snaps and the host system via well-defined interfaces. And the Snap Store team has to give explicit permission for automatic connection of interfaces which could be dangerous in some form. So one can easily and safely install third-party software and is not restricted to what one's distribution has packaged for the release in use. My work on the CUPS Snap got motivated by Canonical's plans of creating an all-Snap Linux distribution, not using Debian packages at all any more. So everything, including the printing system (and also the printer drivers) had to be in Snaps. Fortunately, Snap was so well-designed that it allows also packaging command line tools and even system daemons (Flatpak for example only packages GUI applications, see my blog post) and so I could snap right away. But there were a lot of challenges in these 5 years until the CUPS Snap got into production use for the first time: How to add printer drivers (note that Michael Sweet brought in the solution with the Printer Applications only on the OpenPrinting Summit 2018, slides) Providing the \"cups-control\" interface by the CUPS Snap Including D-Bus in \"cups-control\" First idea of a \"cups\" interface for only printing, not managing CUPS System users and groups See the README.md of the CUPS Snap for more links. Once everything working the biggest challenge was the \"cups\" interface through which application Snaps can safely print but canmnot mess up the system's CUPS, independent whether classically installed or the CUPS Snap. Note that the \"cups-control\" interface which was there from the beginning allows full access to the system's CUPS and so was considered \"dangerous\", meaning that in apps uploaded to the Snap Store it does not get connected automatically. The \"cups\" interface is considered \"safe\" and therefore auto-connects. After a year of design and implementation work of me together with Canonical's snapd team we made the \"cups\" interface exclusively connecting to the CUPS Snap, auto-installing the CUPS Snap as a dependency if it is not already installed. The CUPS Snap contains a new-enough CUPS where my Snap mediation functionality is built in, rejecting administrative tasks of Snaps not connecting via \"cups-control\". So if the CUPS Snap is the user's standard CUPS, all is working as expected. If the user has a classically installed CUPS, the CUPS Snap goes into proxy mode, cloning the queues of the system's CUPS and passing all jobs simply through to the system's CUPS, so that the user's queues and drivers (also proprietary ones) continue to get used and the user gets the same experience for snapped and classically installed apps. Administrative CUPS requests from application Snaps get always blocked, so the CUPS Snap's CUPS works as a firewall for the system's CUPS. Here are some threads on the snapcraft.io forum about the development of the interface (including documentation for who wants to snap their apps): New interface: “cups” for all Snaps which print (How to use, how it exactly works) The \"cups\" interface, by Graham Morrison My original documentation request for the \"cups\" interface Handling of the “cups” plug by snapd, especially auto-connection (How we came to the proxy mode of the CUPS Snap) “cups” interface merged into snapd - Additional steps to complete And by the time of writing this, two applications in the Snap Store are actually using the \"cups\" interface: onlyoffice-desktopeditors and FreeCAD. Due to their dependency on the CUPS Snap they made the installation count of the CUPS Snap sky-rocket from 4200 to 75000. And we can expect much more as soon as the Firefox, Chromium, and LibreOffice Snaps switch over ... This also means that the CUPS Snap got integral part of the Snap eco-system. It is live and in production now. Now we are looking forward for the first distribution using the CUPS Snap as its default printing environment (Ubuntu 23.04 ???) and for the first all-Snap Ubuntu distribution. After having transferred all free software drivers from the dark age of LPD to CUPS in the beginning of the glory days of OpenPrinting we now have been at the point of transferring them again, this time from classic CUPS drivers consisting of PPD files and filters into Printer Applicatioms, emulations of IPP printers. Many, many years ago, in the good old times of CUPS 1.4 (August 2009) PPD files got deprecated, but continued to be used up to today, due to lack of a new concept for printer drivers. This concept came up only on the OpenPrinting Summit/PWG Meeting 2018 in Sunnyvale, CA, when Michael Sweet introduced the concept of Printer Applications in his CUPS Plenary. Printer Applications are emulations of driverless IPP printers (IPP Everywhere, AirPrint), so behave exactly like a modern network printer. Internally, they connect to non-driverless printers and convert incoming jobs from at least one of the driverless standard data formats (PDF, PWG Raster, Apple Raster, PCLm) into the printer's native language. They also know about the supported printer's capabilities and supply this information on a client's get-printer-attributes IPP request. They also advertise there presence by DNS-SD as network printers do. This means that printer drivers are emulations of driverless IPP printers, so CUPS only needs to deal with driverless IPP printers, as a printer is either actually a driverless IPP printer, or it is taken care of by a Printer Application, or it is a remote CUPS printer (and CUPS is also an emulation of driverless IPP printers). And this way CUPS can go all-IPP, no PPD files and printer-specific filters any more! And this CUPS we are approaching now: In CUPS 3.x (or if you prefer video: The Ubuntu Indaba) the deprecated PPD file support will get finally removed. Also if the CUPS Snap is used as the standard printing system, we cannot use classic CUPS drivers any more but have to resort to Printer Applications. This is due to the nature of Snaps, having a static, immutable file system where we cannot add extra files, in our case PPD files and filters. One could now say that CUPS is flexible enough to move the PPD and filters directories into the dynamic file system of the Snap (hey, we can add PPD files to the PostScript Printer Application Snap, why not drivers to the CUPS Snap?) but this is not desired, as copying executable files (the filters) into a Snap would break the security principles of Snaps. But now one can think why did we rush the classic printer drivers into Printer Applications right now? We have still time until end of 2023 when CUPS 3.x gets released? The main reason is that I want to switch Ubuntu 23.04 (release April 2023) to use the CUPS Snap as its default printing system, as a dress rehearsal for the New Architecture to test all its shiny new components (the Printer Applications, the GNOME Control Center, the print dialogs with Common Print Dialog Backends, ...). If I wait for the release of CUPS 3.x, the next available Ubuntu release is 24.04 LTS (Long Term Support) and doing such a high-impact change as the New Architecture in an LTS is very risky, therefore I would very much like to make use of the \"small\" Ubuntu releases before. And all the talk about an all-Snap Ubuntu distribution ... Yes, I have transferred all free software printer drivers which come with Debian (and so also with Ubuntu) into 4 driver-retro-fitting Printer Applications. Only driver not transferred (yet) is the Braille printer driver included in cups-filters (but this is in the works now). But do not think I have all these drivers rewritten into filter functions and turned their PPD file generators into get-printer-attributes IPP responders. No, I would never do it, as such code changes one has to test, and how should I test the drivers for ~10000 printer models without having the actual printers, but having a hall with 10000 printers inside one would also need a lot of people to do the testing. So the way to go is \"do not touch the running code\" and encapsulate it in Printer Applications. I started writing a PostScript Printer Application for printing on PostScript printers with their manufacturer's PPD files (~4000 PPDs included in the Snap, all free ones which come with distributions, user can add own ones) and once having this completely working (with support for installable accessories, polling settings from the printer, ...) I decided to generalize this for CUPS drivers and turn this into a library), ending up with the pappl-retrofit project based on Michael Sweet's PAPPL. Using this library the effort for retro-fitting CUPS drivers is low, and needs only very small changes in C code for configuring the Printer Application and for a method to find out which printers are supported. More substantial C programming is only needed if one wants to add some special functionality (like downloading HP's proprietary plugin in the HPLIP Printer Application). The original PPD files (or PPD generators) and filters are then packaged together with the Printer Application and that's it. pappl-retrofit has all functionalities to list the PPD files, to generate get-printer-attributes IPP responses from the PPD files, find the best PPD option settings for given job IPP attributes, create media-ready lists of loaded media, run CUPS filters to execute the print jobs, stream jobs whenever possible, ... Once created this library it was quick and easy to get all these drivers into Printer Applications. 2 of the 4 (HPLIP, Gutenprint) are for still actively maintained drivers and so will sooner or later get replaced by native (= no PPD files used internally) Printer Applications. So we currently have: PostScript Printer Application (Snap Store): Printer Application Snap for PostScript printers which are supported by the manufacturer's PPD files. User can add PPD files if the needed one is not included or outdated. HPLIP Printer Application (Snap Store): HPLIP in a Printer Application Snap. Supports nearly every HP printer ever made. Installing HP's proprietary plugin (needed for a few printers) into the Snap is supported and easily done with the web interface, and it gets automatically updated. Gutenprint Printer Application (Snap Store): High quality output and a lot of knobs to adjust, especially for Epson and Canon inkjets but also for many other printers, for example dye sublimation photo printers, in a Printer Application Snap. Ghostscript Printer Application (Snap Store): Printer Application with Ghostscript and many other drivers, for practically all free-software-supported printers which are not PostScript and not supported by HPLIP or Gutenprint. It contains all the printer drivers for which there is no separate Snap. And Michael Sweet has also made a Printer Application for label printers, based on the label printer drivers which come with CUPS: LPrint (Snap Store): Supports Dymo LabelWriter and Zebra ZPL label printers, with all label-printer-typical options: Label modes, tear-off offsets, media tracking, media top offset, print darkness, resolution, roll selection, speed, ... Note that this is a native Printer Application. It does not simply encapsulate the CUPS filters and PPD files which come with CUPS. And there is also a Legacy Printer Application (included in the pappl-retrofit) project which, when classically installed (do not try to snap it) sees all classically installed CUPS drivers and makes them available in a Printer Application. This is especially useful for proprietary drivers. So we will not lose the support for any of the currently supported printers when switching over into the PPD-less, all-IPP New Architecture ... Now the third generation of printing with free software can start ... IPP, the Internet Printing Protocol, was originally designed as a network protocol, based on HTTP. So one could think that modern, driverless printers are only driverless if connected via the network, and not when connecte dvia USB. This is not the case, as fortunately, the situation was taken care of and driverless IPP printers do also IPP-over-USB, a standard to carry over the driverless nature of such a printer to USB. To get this also working under Linux a daemon is needed which connects to rhe USB device and on the other end listens on a port on localhost and advertises the printer via DNS-SD, so that it appears like a network printer for clients. The first approach was ippusbxd, a GSoC project by Daniel Dressler back in 2014. It is written in C and its architecture is simple: ippusbxd simply relays a TCP connection to USB. This does not work very well. I found Alexander Pevzner presenting his \"airscan\" SANE backend on the SANE mailing list and I told him that this is exactly what I need for driverless scanning support. So hea sked me to test his backend on my printer and we could weed out some bugs. Then I also wanted to know whether my printer which prints via IPP-over-USB would also scan via IPP-over-USB, even with scanning being eSCL and not IPP. So I tried his backend also via ippusbxd and it kind of worked but not really reliably. I told this to Alexander and he created the alternative approach ipp-usb with a first working version within a few hours, and solved my problem this way. I could print, scan, and use the web admin interface of the printer perfectly. About ippusbxd he writes: Unfortunately, the naive implementation, which simply relays a TCP connection to USB, does not work. It happens because closing the TCP connection on the client side has a useful side effect of discarding all data sent to this connection from the server side, but it does not happen with USB connections. In the case of USB, all data not received by the client will remain in the USB buffers, and the next time the client connects to the device, it will receive unexpected data, left from the previous abnormally completed request. Actually, it is an obvious flaw in the IPP-over-USB standard, but we have to live with it. So the implementation, once the HTTP request is sent, must read the entire HTTP response, which means that the implementation must understand the HTTP protocol, and effectively implement a HTTP reverse proxy, backed by the IPP-over-USB connection to the device. And this is what the ipp-usb program actually does. ipp-usb is written in Go, as Go provides an HTTP library with the needed functionality, which is missing in C. But as Go links executables statically, they have a large memory footprint. Therefore the ChromeOS developers do not accept Go programs and continued with ippusbxd for some time and later they came with another from-scratch approach, ippusb_bridge, written in Rust. Due to this there is no known operating system using ippusbxd any more. Therefore development of this project is currently suspended. Linux distributions use ipp-usb and with this driverless printing and scanning on USB-connected devices generally works. Only problem is that this connection type has many device-specific quirks and Alexander is following the reports and trying to fix as many as possible, producing an everytime longer list of quirk workarounds in ipp-usb's code. Especially there are also devices which support the IPP-over-USB USB protocol but not driverless printing and scanning. To support a local non-driverless printer with a Printer Application or a USB-connected driverless printer via IPP-over-USB, one has a daemon running on the local machine and wants to access the emulated IPP network printer from the same machine. In addition, for improved security and privacy one perhaps does not want to share the device in the local network, or one does not even have a network. Then only listening on \"localhost\" (the \"lo\", loopback interface) is the intuitive way to go. Problem with this was that the DNS-SD implementation on Linux, Avahi, did not support the loopback interface, so the device did not get advertised for auto-discovery and one had to manually set up a CUPS queue in order to print. To fix this I have looked into the source code of Avahi and found out that a tiny patch solves the problem and gives Avahi full support for the loopback device. As Trent Lloyd, upstream maintainer of Avahi, was very busy all the time, it took near 3 years until the patch got finally accepted, 10 days before Feature Freeze for Ubuntu 20.04 LTS. This got triggered by Alexander Pevzner, author of the Go-based ippusbxd alternative ipp-usb and the \"airscan\" eSCL SANE backend, when he reached out to Trent Lloyd in an e-mail thread about Debian packaging of his work and Trent answered that he will sort it and do a new release of Avahi before Feature Freeze of Ubuntu 20.04. He released version 0.8.0 with the localhost support included and my name is listed in the \"Thank you\" section of the release notes. Most modern printers do driverless IPP and many of them are multi-function devices with built-in scanner, and these ones do not only driverless printing but also driverless scanning! Driverless scanning means, as also for driverless printing, not needing a driver, where a driver is any type of device-model-specific software or data. And this means that the device has to use standard protocols, for which client software can easily be made part of the operating system. The standard here is AirScan, Apple's extension of AirPrint so that the complete multi-function device can be used with an iPhone or iPad. The underlying communication protocols are eSCL (an HTTP-based protocol, the more common one) and WSD (Web Services for Devices, from Microsoft), one of the two the device has to support in order to fulfill the standard. Back in 2019 the situation was really inSANE, there was no SANE backend supporting eSCL or WSD, but \"between the years\" 2019 and 2020, between Christmas and New Year I was reading great news on the SANE mailing list: Two independently developed backends for eSCL support got announced! These are “escl” (small, light, basic, already included in SANE 1.0.29) and “airscan” (complete functionality). And there is also an AirScan server, AirSane, which is a SANE frontend which emulates an AirScan (eSCL) scanner scanning on any physical scanner supported by SANE, so it is nothing more than an early Scanner Application. After that I worked a lot together with the authors to make it all working on my HP multi-function device and all this even made Alexander Pevzner, author of the “airscan” backend, replace the \"ippusbxd\" IPP-over-USB daemon with the completely new \"ipp-usb\" and made IPP-over-USB finally working reliably (see above). Both \"escl\" (as part of sane-backends) and \"airsane\" (separate package) made it into all major Linux distributions and so the scanners in thousands of multi-function printers are working under Linux now. And the specs of eSCL got finally published by Mopria in May 2021! From the March 2022 New The part of the web site for looking up (legacy, non-driverless) printers and drivers (the OpenPrinting database web app has moved to a new server at Oregon State University Open Source Lab (OSUOSL). As the old server did not receive a system upgrade for many years there were a lot of problems with the compatibility of the code (SQL and PHP) with the new, modern server. Fortunately, the people there, especially Violet Kurtz and Lance Albertson, both from the OSUOSL, helped a lot on doing this migration by doing the needed code changes. Thanks a lot to them. The UI of the web app did not change, but there are changes in the internal functionality. Instead of feeding the complete Foomatic XML data into the MySQL database and from this generate the PPD files which are identical with the ones we find in Linux distributions (they usually create them with the foomatic-compiledb script which comes with the foomatic-db-engine package directly from the XML data) we do the same as the distributions do also on the server now. We pre-build the PPD files with foomatic-compiledb and serve only the content of the web pages from a (reduced) MySQL database. This saves us from too many SQL fixes to do and server responses, especially when downloading PPD files should be faster. Also the query.php script for machine queries got fixed and is fully working again. This is especially important as we want to add a query service for printer setup tools to find the correct Printer Application(s) for a printer based on its device ID. This is currently in the works."
+ },
+ {
+ "id": "page:codeofconduct",
+ "source": "static",
+ "type": "page",
+ "title": "Code of Conduct",
+ "url": "/codeofconduct",
+ "headings": [
+ "Our Pledge",
+ "Our Standards",
+ "Our Responsibilities",
+ "Scope",
+ "Enforcement",
+ "Attribution"
+ ],
+ "tags": [],
+ "snippet": "Code of Conduct",
+ "content": "In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to make participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. Examples of behavior that contributes to creating a positive environment include: Using welcoming and inclusive language Being respectful of differing viewpoints and experiences Gracefully accepting constructive criticism Focusing on what is best for the community Showing empathy towards other community members Examples of unacceptable behavior by participants include: The use of sexualized language or imagery and unwelcome sexual attention or advances Trolling, insulting/derogatory comments, and personal or political attacks Public or private harassment Publishing others' private information, such as a physical or electronic address, without explicit permission Other conduct which could reasonably be considered inappropriate in a professional setting Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. This Code of Conduct applies within all project spaces, and it also applies when an individual is representing the project or its community in public spaces. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the Open Printing Code of Conduct Team at contact.openprinting@gmail.com. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. We will respect confidentiality requests for the purpose of protecting victims of unacceptable behavior. At our discretion, we may publicly name a person about whom we’ve received unacceptable behavior complaints, or privately warn third parties about them, if we believe that doing so will increase the safety of OpenPrinting members or the general public. We will not name victims without their affirmative consent. This Code of Conduct is adapted from the Contributor Covenant, version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html For answers to common questions about this code of conduct, see https://www.contributor-covenant.org/faq"
+ },
+ {
+ "id": "page:contact",
+ "source": "static",
+ "type": "page",
+ "title": "Contact Us",
+ "url": "/contact",
+ "headings": [],
+ "tags": [],
+ "snippet": "Feel Free To Contact Us!",
+ "content": ""
+ },
+ {
+ "id": "page:contribute-website",
+ "source": "static",
+ "type": "page",
+ "title": "Contribute to OpenPrinting Website",
+ "url": "/contribute-website",
+ "headings": [
+ "Contributing",
+ "Bugs ",
+ "Content Migration ",
+ "Solving Issues ",
+ "New Ideas "
+ ],
+ "tags": [],
+ "snippet": "Help us Make this Website Better.",
+ "content": "Please go through contributing.md before raising any issue or generating a Pull Request .You can contribute to this project in one of the following ways: Report Bugs Content Migration Solving Issues New Ideas If you find any bugs or issues in the website, please feel free to raise the issue on our github repository. Different browsers render CSS differently. If you find any inconsistency in CSS rendering, please report it. We need to move content from our old website to this website. If you want to move some page or some database, first create Issue for the same and then work on it. You can also help us solve Issues. If you have new ideas, please feel free to share them with the community. Raise a issue regarding your idea."
+ },
+ {
+ "id": "page:contribute",
+ "source": "static",
+ "type": "page",
+ "title": "Contribute",
+ "url": "/contribute",
+ "headings": [
+ "HELP!",
+ "DATA "
+ ],
+ "tags": [],
+ "snippet": "Helping the Advance of Linux Printing",
+ "content": "You can contribute to Openprinting by plenty of ways, so programming knowledge is not required. You can help with any of the following: Data Bug Reports User Support Programming Money, Hardware, Events,... As a user of a certain printer model, please post your experience in the “User Notes” section of your printers' page. Please tell with which driver and which option settings your printer works best, what is supported and what not, whether you use Foomatic or another setup infrastructure. Tell also whether the information in the printer's entry is correct (recommended driver, drivers which support the printer, comments, etc). Please report bugs in the entries also on our forums. If your printer is not listed yet, simply add it by clicking the appropriate links on the printer listings pages or the “Add similar printer” link on a printer entry page of a similar printer. The latter way saves you from a lot of typing as most fields get pre-filled. But be careful to change everything what is different on the new printer. Especially the auto-detection data you should obtain from the actual printer (see instructions on the printer input page). Or go directly to the add printer form. Also reporting that a printer does not work at all is important for us, users should be warned before they buy a “Paperweight”. Please try to make a complete and correct report; entering wrong or unreproducible data will more confuse than help. Developers might even attempt provide complete XML files. Downloading and installing the Foomatic packages gives an environment for testing. Refer to the format description in the end of the README of the foomatic-db-engine package. Do also the needed changes in driver and option XML files and generate a patch to our Bazaar repositories. See the instructions for contributors. If you're really ambitious, you could go through a printer manufacturer's web site and tabulate data in XML for all current models. If you have discovered a free software driver which is not listed, please tell us (in the driver comment field and also on the forums) the driver's home page. If the driver is not available for download any more, please send us the newest source package of it which you can get, so that we can re-host this driver. Please also tell us all your experiences, special tricks, which printers does it support, and how to use the driver. Also here providing XML data as described in the README of the foomatic-db-engine package is welcome. If you generate the XML files with scripts, please send us the scripts, too. You have developed or plan to develop a driver? Then please put it under a free software license and make it available for download (we can host it for you, if needed). Consider also using the OpenPrinting Vector, CUPS Raster, and IJS interfaces to connect your driver to GhostScript and under no circumstances patch it into GhostScript. This way users can easily add the driver to their systems. Include also a generator for PPDs and/or Foomatic data into your driver's source package, so that users can easily set up printer queues with your driver. This also makes it easier for us to list your driver on our site and for distributions to support your driver. Consult the README of the foomatic-db-engine package to obtain the necessary Foomatic background knowledge. If you are a printer manufacturer, test your printers to find which ones work with free software, or provide free software drivers. Ideally, provide Foomatic data and/or PPDs for your printers and drivers. This will lead to useful listings of your printers in the support database and good reports on the Vendor Info and Suggested Printers pages."
+ },
+ {
+ "id": "page:current",
+ "source": "static",
+ "type": "page",
+ "title": "OpenPrinting - What are we doing currently?",
+ "url": "/current",
+ "headings": [
+ "The New Architecture for printing and scanning",
+ "CUPS",
+ "CUPS 2.5.x",
+ "CUPS 3.x",
+ "cups-filters 2.x",
+ "Printer Applications",
+ "PAPPL",
+ "pappl-retrofit",
+ "Native Gutenprint Printer Application",
+ "Native HPLIP Printer Application",
+ "Braille Printer Application",
+ "Reviving legacy printers under Windows",
+ "Scanner Applications",
+ "GNOME Control Center - \"Printers\" module",
+ "The print dialogs",
+ "Optimizing DNS-SD browsing",
+ "Distribution-independent packaging",
+ "Printer Application look-up via the OpenPrinting web site"
+ ],
+ "tags": [],
+ "snippet": "Our current activity",
+ "content": "This page represents the state of August 2022 Even after having achieved many nice things in the last 21 years there is always a lot to do, especially currently, on the way to the New Architecture for printing and scanning, to make everything completely standards-conforming and get rid of obsolete methods and technologies. Also there has been a lot of development of the systems and environments for which we provide the print functionality. Our work will continue to improve software integration. For example, there will be continued work on the printer setup tools and print dialogs of different desktop environments and applications, packaging methods like Snap, Flatpak, Docker, ..., new forms of OS distributions (immutable core, all-Snap, ...), ... In addition we need to improve on things like CI and automated testing of our code. There will also be some work on documentation needed, especially for the APIs of our libraries. For all this we are always in search for contributors of the community. Therefore we are once reaching out by presenting on several conferences, like the OpenPrinting micro-conferences on the Linux Plumbers Conference (2019, 2020, 2021, 2022), Linux App Summit, GUADEC, ..., and also internet platforms, like Ubuntu on Air (YouTube channel). And second, we are participating in the Google Summer of Code (GSoC) every year, having 5-8 3-month projects each year and some of the contributors continue to work with us voluntarily. I am leading OpenPrinting as my day job, thanks to my full-time employment at Canonical, the company behind Ubuntu, right for doing that. Thanks a lot to Canonical for supporting printing on Linux and other POSIX-style operating systems this way. Of additional help for us is also general funding, for conference travel, printers and supplies for our contributors, or even our own internships, at any time in the year. For this we accept donations/funding via the Linux Foundation's LFX Croudfunding. Ubuntu Office Hours with Till Kamppeter, Aveek Basu, Divyasheel Kumar, and Pranshu Kharkwal, hosted by Monica Ayhens-Madon YouTube Video of the Ubuntu Office Hours with Till Kamppeter, Aveek Basu, Divyasheel Kumar, and Pranshu Kharkwal, hosted by Monica Ayhens-Madon Emphasis of our work at OpenPrinting is the New Architecture. 6 of our 7 GSoC contributors this year are working on it and also Michael Sweet's and my work are focused on it. Subject of the New Architecture is getting a streamlined, standards-conforming printing and scanning workflow without obsolete methods and technologies and integrating well into modern operating system and network environments. Ubuntu Desktop Team Indaba with Till Kamppeter and Michael Sweet, hosted by Heather Ellsworth and Monica Ayhens-Madon YouTube Video of the Ubuntu Desktop Team Indaba with Till Kamppeter and Michael Sweet, hosted by Heather Ellsworth and Monica Ayhens-Madon For 22 years now, since its 1.0 launch, CUPS uses principally the same architecture: PostScript was the standard job format as printers usually used with UNIX were PostScript devices. Capabilities of a printer are described by a PPD (PostScript Printer Description) file. The PPD file describes all user-settable options, resources (trays, paper sizes, resolution, quality, color, ...) in a static text file. To cover non-PostScript printers the PPD file format got extended (by Michael Sweet) to specify a filter to generate the printer’s native format. Filters use Ghostscript (or Poppler) to convert PostScript input. Print queues were manually created, with drivers (= PPDs + filters) assigned to them. We especially want to get rid of the PPD files, because ... In 1984 Adobe stopped development on PPDs (and also PostScript), so we started with an obsolete (but useful) format right away. In 2006 we abolished PostScript as print job format and replaced it by PDF. PPD files can represent user-settable options only as enumerated choice or boolean. Ugly workarounds for things like passwords or color adjustment are needed, implemented in CUPS and Foomatic. As CUPS was always following the standards of the Printer Working Group (PWG), a consortium of printer, OS, general IT, ... industry with which OpenPrinting works closely together and with Michael Sweet (author of CUPS) actively developing on the Internet Printing Protocol (IPP) for decades, we follow them even more to create an all-IPP CUPS without the legacy of PPD files and driver filters. These are exactly the established standards of driverless IPP (IPP Everywhere, AirPrint, Mopria) with print destinations advertising themselves via DNS-SD (also known as mDNS, ZeroConf, BonJour), communicating via pure IPP and using common data formats for print jobs (PDF, PWG Raster, Apple Raster, PCLm). CUPS 3.x will not support PPD files from the ground up. The CUPS Snap does not allow adding PPDs and filters as it consists of an immutable file system image in a security sandbox. Now only driverless IPP printers are supported. No manually created CUPS queues: IPP printer discovered, temporary queue automatically created (exception, CUPS sharing daemon). Filtering only for driverless standard formats: PDF, PWG Raster, Apple Raster, PCLm output, no need to add filters Current CUPS architecture Current CUPS architecture New CUPS architecture New CUPS architecture This will not only eliminate any obsolete technologies and methods, but it will also integrate much better in modern system environments, operating systems with with immutable core file system or distribution-independent, sandboxed packaging, like Snap, Flatpak, or Docker. This is due to the fact that components only interact via IP-based protocols like IPP and DNS-SD and no files or one component have to be installed in the file system of another, especially no binary executable files. So every component can be in its own sandbox and have its own immutable file system. Most modern printers, even the cheapest ones as manufacturers want to allow printing from smartphones, do driverless IPP printing, most commonly AirPrint but currently also Mopria. So they work perfectly under Linux and alike operating systems, currently and also after the transition to the New Architecture. But we will not drop or exclude legacy and specialty printers which do not do driverless IPP and therefore need a driver. There will be no printer drivers based on PPD files, and filter executables any more, but a completely new format, the Printer Applications. These are emulations of driverless IPP printers which internally convert the job data to the printer's native format and pass it on to the physical printer. This way CUPS only needs to deal with driverless IPP printers and manual creation of print queues (with drivers) is not needed any more. As modern multi-function devices do not only provide driverless IPP printing but also driverless eSCL (or WSD) network scanning. We go a similar way for scanning, creating Scanner Applications and so eliminate the need of SANE drivers which are libraries, dynamically linked by the application which scans, which is even worse for distribution-independent, sandboxed packaging. This way we can also create distribution-indpendent sandboxed packages for scanner and multi-function device drivers. This way the New Architecture also helps printer/scanner manufacturers who for some reason cannot or do not want to go driverless, can easily create and distribute drivers for their devices. CUPS is the standard print environment in Linux and other POSIX-style oprating systems for more than 20 years now.It is the daemon managing print queues with appropriate printer drivers, receiving, queueing, spooling, and printing print jobs from applications, sharing print queues on the netwok, ... With CUPS having moved from Apple to OpenPrinting, developemnt, especially of new fetures, has resumed. We do annual feature releases again and bug fix releases as needed inbetween. Michael Sweet has presented a roadmap for the further development o CUPS on the Linux Plumbers Conference 2021 (slides) and on the OpenPrinting Summit/PWG meeting 2022 (slides). Its development is supposed to start soon and it is scheduled to be released towards the end of 2022. This is the last series in the 2.x generation, still supporting the current architecture based on print queues with PPD files and printer-model-specific filters (aka drivers). The main new feature here is full support for OAuth authotization and OpenID authorization servers. There are IPP attributes to support OAuth (from slide 28 on). Especially also an interface (most probably D-Bus) bewtween cups and the a GUI tool for the user authentication is planned to be created. OAuth authentication should replace the more awkward Kerberos which requires root access. Also there are several free software implementations of OAuth support, especially also Michael Sweet's own mOAuth. The next generation of CUPS implements the New Architecture: Classic printer drivers based on PPDs and printer-model-specific filters are not supported any more. In adition, the CUPS project gets split into various smaller modules: libcups, commands, local server, sharing server. Release is scheduled for the end of 2023, meaning that until then all related software, like cups-filters, all printer drivers, print dialogs, printer setup tools, ... needs to be prepared for the New Architecture, which is subject of most of our work currently. Michael Sweet has already started the development on the new libcups3. Planned splitting of the project is as follows: libcups CUPS library Commands Command line interface: lp, lpstat, cancel, lpinfo, lpadmin, ... Local Server In case one only needs print functionality on the local machine and does not want to share out print queue to other machines, a simple user daemon (not running as root), the local server is used. Queues are automatically set up temporarily on discovered IPP printers, as current CUPS daemons already do. Manual queue creation is not supported, also no PPDs and no adding of filters. There is no web interface. The daemon is accessed through the usual domain socket and will get a new D-Bus API for GUIs connecting printing, authentication, and notifications. The daemon does listen on port 631. Profiles can be created to acces printers and servers outside the DNS-SD-discoverable local network. Sharing Server If print queues are supposed to get shared out to the network, the sharing server is used. It listens on port 631 for remote clients inquiries, and behaves as a standard IPP printer on the network. It has a web interface and can be configured similar to current (2.x) CUPS daemons. cups-filters provides filters (to convert data formats for printing) and backends (to communicate with printer hardware) for use with CUPS under non-Mac operating systems. The project originates in Apple (owner of CUPS that time) outsourcing the filters which were not used by Mac OS to OpenPrinting back in 2011. With the replacement of classic printer drivers consisting of PPD files and filter executables by Printer Applications we are also changing the architecture of cups-filters, in the new 2.x generation. The first time when I mentioned that the architecture of cups-filters needs to get changed and that for this I would start a cups-filters 2.x generation was in March and April 2020. Development started mid-2020 (2 years ago) with creating a libppd containing all PPD support functionality of libcups (in libcups3 it will get removed) for retro-fitting classic drivers and PostScript PPDs in July. The next step was turning all the individual filter executables into library functions, the filter functions, for being easily used by Printer Applications, starting in August and with this separating the cups-filter 1.x development into its own branch. These changes have been all performed already and have been made use of in the printer-driver-retro-fitting Printer Applications. To finalize cups-filters 2.x, the support for PPD files in the filter functions has been completely separated from libcupsfilters and moved into libppd, so that libcupsfilters can be installed without installing libppd and so distributions do not need to keep the PPD-file-retro-fitting library in their standard installation. Currently we are in the phase of final testing, code clean-up and separating the projects: libcupsfilters, libppd, cups-filters-legacy (the filter executabls), and cups-browsed, to allow the release of cups-filters 2.0b1, in the coming weeks. As mentioned earlier Printer Applications are the new format for printer drivers, emulations of IPP printers, to turn the all-IPP New Architecture into reality. They also can be easily put into sandboxed, distribution-independent packages like Snaps, for easy distribution of printer drivers by hardware manufacturers. We already have retro-fitted the drivers for ~10000 printer models, the drivers which are usually available in Linux distributions into 4 Printer Applications and put up those in the Snap Store, to not lose any printer support when switching to the New Architecture, but there are still a lot of things to do. Michael Sweet's PAPPL is the base for all currently available Printer Applications, the 4 retro-fitting ones of OpenPrinting and also Michael Sweet's LPrint and hp-printer-app. It provides everything which every Printer Application needs: A daemon which emulates an IPP printer A web interface to configure the printers (drivers, loaded media, default settings ... Advertising the printers via DNS-SD Receiving Apple/PWG Raster jobs and images and feeding the pixels into the actual driver Handling certificates and encryption ... This makes it much easier to create a Printer Application and one only needs to add the driver itself, what turns the jobs into the printer's native format, and what tells the outside world about the capabilities of the printer. PAPPL is nearly complete and currently Michael Sweet has added support for supply level readout and for localization of option and choice strings. PAPPL is under continuous development. pappl-retrofit is based on PAPPL and provides everything that Printer Applications which retro-fit classic CUPS drivers need: Convert PPD file collections into human-readable lists of supported printers Convert PPD options into printer IPP attributes and web interface options Manage installable accessories (like trays) and reflect the accessory configuration in the option lists Poll accessory configuration and default settings from the printer Manage list of loaded media for media-ready IPP attribute This reduces the effort of programming for creating a Printer Application to a minimum. Only a few lines of C to configure the Printer Application are needed. pappl-retrofit is nearly feature-complete and for the coming-soon 1.x release only support of the most recent PAPPL features, supply level read-out and localization will be added. Gutenprint, high-quality printer driver for many Epson and Canon inkjets, dye-sublimation photo printers, and several other printers, is already available as a retro-fitting Printer Application. As Gutenprint is under active development, we want to have a native Printer Application of it, meaning that we do not simply wrap its classic CUPS driver incarnation into a Printer Application with pappl-retrofit, but instead, make a Printer Application directly linking libgutenprint, getting rid of the restrictions and workarounds of PPD files, allowing full liberty of how to make all the options and adjustments available to the user. One must know that for some Epson inkjets there are more than 100 options in the PPD file, many of them are numeric, like color intensities, light/dark ink transitions, ... It is not urgent as for switching a distribution over into the New Architecture (for example when using the CUPS Snap, or even making the distribution all-Snap) we already have the retro-fitting Gutenprint Printer Application. Options for Epson inkjet printer in the Gutenprint Printer Application Options for Epson inkjet printer in the Gutenprint Printer Application Another printer driver which is under active development and therefore should be available as native Printer Application, maintained by its developers, is HPLIP (HP Linux Imaging and Printing). I am not yet suggesting to the HPLIP developers at HP to create a Printer Application from HPLIP as the thing blocking from creating a Printer Application is the missing scanning support in PAPPL. Many of HP's printers are multi-function devices and the classic HPLIP driver also includes a SANE driver for the scanners. For the printing part of HP's devices we have at least a retro-fitting Printer Application for the time being, even with support for HP's proprietary plugin. Installing HPLIP's proprietary plugin in the HPLIP Printer Applications Installing HPLIP's proprietary plugin in the HPLIP Printer Applications Accessibility is an important part of an operating system for everyone's daily use. This does not only mean an accessible user interface but also support for devices which serve for accessibility, like Braille embossers for written communication with blind people. Therefore we need to support them like we support usual printers, which deposit visible markings on the media surface. Our support for Braille embossers is currently provided in the cups-filters project and, to not lose the support when switching into the New Architecture we currently have Chandresh Soni creating a Braille Printer Application as a Google Summer of Code (GSoC) project, with me and upstream maintainer Samuel Thibault as mentors. I am working at Canonical in the Desktop Team, my job being leading the OpenPrinting project, and in the Desktop Team we also have a sub-team working on WSL (Windows Subsystem for Linux), a facility to run Linux applications under Windows. This brought me to the idea of running Printer Applications under WSL, to revive legacy printers which got abandoned by Microsoft and also by their manufacturers. My first public mention of this idea was during the virtual release party of Ubuntu 22.04 on the LAS 2022, in my second part praising the WSL team. The first working implementation of this idea is available now, the first HOWTO of WSL team member Carlos Nihelton, which he has worked out and written in cooperation with me. Thanks a lot to him! Creating Windows print queue to Printer Application running under WSL Creating Windows print queue pointing to Printer Application running under WSL It works, but it is still somewhat awkward, as it requires to compile the Printer Application and its dependencies (pappl-retrofit and PAPPL) from source. We will update the HOWTO as the development of WSL progresses. With WSL using systemd, supporting DNS-SD via Avahi, using AppArmor, and finally getting snapd working in it things will get easier, finally hopefully just in a Snap! Each step of development will remove steps from the HOWTO. My intention is to present the idea at the Ubuntu Summit in November, and I hope in a much easier implementation than it is currently. Most modern printers do driverless IPP and many of them are multi-function devices with built-in scanner, and these ones do not only driverless printing but also driverless scanning! We have Linux support for the underlying scanning protocols eSCL and WSD and the eSCL communication protocol is also published, but what we still do not have is PAPPL support for scanning, to easily create Scanner Applications for non-driverless scanners as we already have Printer Applications. Currently, we have the SANE backends as scanner drivers, which are dynamically linkable libraries. They must be put into a defined system directory to be found by the applications which scan and they also need to have binary compatibility with the applications. This can usually only be achieved by applications and scanner drivers being built for the host operating system distribution, for security reasons even preferably by the maintainers of the distribution. With scanner drivers packaged as Scanner Applications we have the same advantages as with Printer Applications for printing. We only have IP communication, in our case DNS-SD and the HTML-based eSCL between application and scanner driver and so we can do sandboxed, distribution-independent packaging of the applications and of scanner drivers, allowing the two components being in separate sandboxes. This way scanner manufacturers can distribute their drivers in distribution-independent packages (like Snaps) and they work with all applications, also third-party ones which come as Snaps or Flatpaks. And for multi-function devices the Printer Application can provide both printing and scanning support, which makes setting up the device much easier, just in a (single) Snap! We have already tried to add scanner support to PAPPL but contributors dropped out during the pandemic and so we are only able to complete the support in this year's GSoC. The base for the API got already being done last year by Bhavna Kosta (Slides of Linux Plumbers 2021). Then this year we have 2 contributors: Rishabh Maheshwari does the eSCL parser and Deepak Khatri does the interface to the driver for the actual scanner. Mentoring is done mainly by me but also by Deepak Patankar, who also started as a GSoC contributor for OpenPrinting some years ago and also already mentored for us. Having this working we will do: SANE scanning support in pappl-retrofit Create a Scanner Application from sane-backends and also Scanner Applications from other SANE drivers and snap (= create Snaps of) them. When snapping user applications which scan, only include sane-airscan for scanning support, as this is enough to connect with the snapped scanner drivers. Add scanning support to our retro-fitting HPLIP Printer Application Suggest HP's developers to create a native HPLIP Printer Application, which supports both printing and scanning. Unfortunately, not every printer is immediately ready for printing by just connecting it and turning it on, especially printers which need a driver or printers on a network other than the local network. Therefore we also still need a printer setup tool even in a world of driverless IPP printing. The most used printer setup tool is probably the \"Printers\" module of the GNOME Control Center. Simply because most Linux distributions use GNOME as their default desktop. The functionality of printer setup tools is usually more or less the same: In a main panel all CUPS print queues are listed and one has buttons/menus on each entry to configure the queue, default option settings, driver, ... On the main panel there is also a button to open the panel to add a new printer, which means creating a new CUPS queue. Here one chooses a discovered printer and assigns a (classic) driver to it (which is often done automatically). The New Architecture requires some changes but the UI will still look very similar afterwards. The main panel will show IPP print services instead of CUPS queues, as now all printers are driverless IPP printers for CUPS (3.x), either network printers or Printer Applications, and CUPS queues are created automatically on-demand. So the user now configures the IPP printers, via their web admin interfaces and/or IPP System Service. The IPP service entries in the printer setup tools have therefore buttons/menus to access these configuration facilities there. There will also be the \"Add Printer\" button, but on the panel for adding a printer discovered printers will only be listed if they are not driverless IPP printers and need a Printer Application. Buttons and menus allow operations to find and install the correct Printer Application and make the printer connected with it. After that the printer appears as IPP print service on the main panel. These changes are currently being worked on, in a way that the \"Printers\" module works with both the current CUPS and also in the New Architecture, simply by listing both CUPS queues and IPP services, and so showing all available printers, both with permanent CUPS queue and also those for which CUPS would create a temporary queue on-demand, and in both cases the user is directed to the correct configuration interfaces. The add-printer panel will also support both Printer Applications and classic drivers. After the switchover to the New Architecture the unavailable items will simply not get displayed. The coding is done in a nice sub-team of two GSoC contributors plus their mentors. In addition, code of the last two year's GSoCs get made use of, too. Shivam Mishra does the main panel with all ist functionality and Mohit Verma the add-printer panel. Mentoring is done by me, by Divyasheel Kumar (worked on listing IPP services last year), and upstream maintainer Marek Kasik. Several feature requests are posted on GNOME's and cups-pk-helper'a GitLab repositories and there the coding work gets discussed: GNOME #1877: Improve setting of IPP options GNOME #1878: Allow to add new printers via Printer Applications GNOME #1879: Do not show setting of drivers for IPP printers GNOME #1911: Printers: Make adminurl available for IPP printers cups-pk-helper #7: Added discovery of Printers via lpinfo, PAPPL and Printer Applications Also print dialogs need changes for the New Architecture. They first of all should not try to download the print queue's PPD files via CUPS' HTTP interface or even worse, grab them from the local file system. Second they need to support temporary CUPS queue, those queues for IPP printers which are created on-demand when polling the printer's capabilities or sending a job. The latter print dialogs should have been supported already, but several still are not. The most obvious approach would be that all print dialogs (GTK, Qt, LibreOffice, Firefox, Chromium, ...) get changed appropriately, but this requires the maintainer's, often volunteers, time, is not top-priority in the projects, ... and so takes time if done at all. Therefore we created the concept of the Common Print Dialog Backends (CPDB) to not only let all print dialogs support multiple print technologies (CUPS, print to file, cloud printing services, ...) but also move the responsibility of correct support of each print technology to the maintainers of that print technologies, for example to OpenPrinting for CUPS. This is done by the print technology support being in separate modules (backends) which are available to the print dialogs as D-Bus services. This way the backends can get updated separately and they can also be in separate sandboxed packages, allowing easy Linux support for any cloud/online printing service provider. Currently, GSoC contributor Gaurav Guleria (mentored by me and upstream manintainers Marek Kasik, Matthias Clasen, and Albert Astals Cid) is working on CPDB support for the print dialogs. He already completed the GTK dialog (Merge Request with discussion) and also did a lot of fixes and improvements on CPDB itself. Now he is working on the Qt dialog to add CPDB support also there, to make it finally cute. DNS-SD is an important concept for the printing. By the current standards, network printers, especially IPP printers advertise themselves in the local network via DNS-SD, telling about how they are accessed (IP, port, resource -> makes up URI), model name, and basic capabilities, job data formats, paper size class, duplex, scanner, fax, ... This way clients can find and use printers automatically (which is supported by CUPS). Once the client knows about the presence of an IPP printer it polls its full capabilities by a get-printer-attributes IPP request and is ready to print. Because of this, several components of CUPS and cups-filters call functions of the Avahi library, in order to ask avahi-daemon whether there are any devices in the network which provide IPP print services: The CUPS daemon to be able to create temporary print queues for IPP printers, the dnssd CUPS backend to find all kinds of network printers, cups-browsed to find IPP printers and remote CUPS queues to form clusters, the driverless utility to emulate a driver for driverless printers to set them up with classic printer setup tools, ... As the DNS-SD browsing with Avahi always follow the same scheme, getting a list of all services of a given type (browsing, very fast) and the getting detailed information of a given service (resolving, needs time) we have a lot of code duplication here. Also we have performance problems because in browsing one gets many duplicate listings as the same device can appear under several network interfaces (and one can have many: local, wired, wireless, virtual machines, ...), HTTP/HTTPS, IPv4/Ipv6 and if not identifying these duplicates one can spend a lot of time on unnecessary resolving. Sachin Thakan, mentored by me, is working on optimizing this in this year's GSoC. Linux distributions are usually composed of binary packages (RPM or DEB in most cases), for the kernel, for systemd, for CUPS, for applications, ... so that the user can easily put together their system without needing to compile anything. The problem is here that these packages are made for only one version of a distribution, for example for Ubuntu 22.04. They are also usually made by the maintainers of this distribution, not by the maintainers of the packaged application. Also there are no new versions of an application packaged for an already released distribution version. To overcome this, and get a packaging system which is distribution-independent and also to get enough security to run third-party binary code, sandboxed packaging methods were introduced. Each package comes with all its libraries and other parts it depends on in a security-encapsulated sandbox. Also what comes with the package is an immutable, manipulation-proof file system image. It also can only communicate with the host system and other packages only through well-defined channels. The most sophisticated system in terms of security and flexibility is Snap because it is very similar to smartphone app packaging. See also the Ubuntu Indaba with Mark Shuttleworth. This is also the system I have most experience with. Right when it was launched back in mid-2017 I started snapping (packaging as a Snap) CUPS. I posted several feature requests on Snap and worked together with the Snap developers to integrate the CUPS Snap in the Snap infrastructure, creating an interface for snapped applications being able to safely print without being able to mess up the system. Not only CUPS, but also ipp-usb and the 4 retro-fitting Printer Applications I have snapped and are available in the Snap Store. I am regularly updating all of these for new versions of the contained classic printer drivers and other included software. Having snapped CUPS I wondered why not packaging CUPS also in other formats, as Flatpak or AppImage. I investigated and found out the following: Flatpak is not suitable: It is especially made for desktop/GUI applications. One cannot package daemons. The packaged app cannot be run as root. The channels to communicate with the outside world are not file system mounts or AppArmor allowances as with Snap, but portals, D-Bus interfaces to common GUI dialogs as \"Open\", \"Save as ...\", and \"Print\". AppImage is not suitable, too: AppImage does nothing more than providing an immutable file system image with the packaged application and all its libraries and other dependencies. It is an executable which simply opens the file system and runs the included application. There is no security concept, the application has access to the whole system (or at least to what the invoking user has access to). There is also no support for daemons, like for example auto-starting it. Docker is an alternative: Especially on systems based on a minimal/immutable/atomic/image-based OS designed for applications being installed as Flatpaks or systems not based on systemd, not using AppArmor, Snaps cannot get installed and an alternative method to install distribution-independent packages of CUPS and Printer Applications is needed. Here Docker images (OCI-compatible containers) as official versions from OpenPrinting on DockerHub were suggested. I had some discussion with Robert McQueen and he posted on the Flatpak list and then there were further suggestions. After releasing cups-filters 2.0b1 and pappl-retrofit 1.0b1 I will look into creating the Docker images of CUPS and the Printer Applications. The part of the website for looking up (legacy, non-driverless) printers and drivers (the OpenPrinting database web app has successfully moved to a new server at Oregon State University Open Source Lab (OSUOSL). Violet Kurtz and Lance Albertson, both from OSUOSL have helped a lot on this. This is the base for being able to do further development and updates on our web app, especially the Printer Application look-up service which is needed for the printer setup tools to find the correct Printer Application to install when submitting the printer's device ID as search term. The service is especially needed as the developers of the Snap Store did not show interest on hardware-signature-based search and we also want to provide the Printer Applications in other formats in the future. Violet Kurtz is making good progress on the extension of the web app for this functionality."
+ },
+ {
+ "id": "page:databaseintro",
+ "source": "static",
+ "type": "page",
+ "title": "Printer Compatibilty Database",
+ "url": "/databaseintro",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:documentation",
+ "source": "static",
+ "type": "page",
+ "title": "Documentation",
+ "url": "/documentation",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:donations",
+ "source": "static",
+ "type": "page",
+ "title": "Donations",
+ "url": "/donations",
+ "headings": [],
+ "tags": [],
+ "snippet": "Thanks for showing interest in supporting OpenPrinting. There are many ways in which you can support OpenPrinting: We require hardware for testing and development purpose. If you...",
+ "content": "Thanks for showing interest in supporting OpenPrinting. There are many ways in which you can support OpenPrinting: We require hardware for testing and development purpose. If you have some spare hardware(printers, scanners, network print boxes ), please consider donating them to us. Sponsor events like Printing Summits and LF OpenPrinting meetings(Travel/accommodation for attendees, catering, ...). We are also grateful for invitations to get to free software events, congresses and fairs. If you want to support OpenPrinting in some other way(like Monetary,...), please contact Till Kamppeter. For contacting us, pleace check Contact Us page."
+ },
+ {
+ "id": "page:download",
+ "source": "static",
+ "type": "page",
+ "title": "Downloads",
+ "url": "/download",
+ "headings": [],
+ "tags": [],
+ "snippet": "{% include feature_row id=\"intro\" type=\"center\" %} {% include feature_row %}",
+ "content": "{% include feature_row id=\"intro\" type=\"center\" %} {% include feature_row %}"
+ },
+ {
+ "id": "page:downloads",
+ "source": "static",
+ "type": "page",
+ "title": "Downloads",
+ "url": "/downloads",
+ "headings": [],
+ "tags": [],
+ "snippet": "{% include feature_row id=\"intro\" type=\"center\" %} {% include feature_row %}",
+ "content": "{% include feature_row id=\"intro\" type=\"center\" %} {% include feature_row %}"
+ },
+ {
+ "id": "page:driverless",
+ "source": "static",
+ "type": "page",
+ "title": "Driverless Printing",
+ "url": "/driverless",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:gsod",
+ "source": "static",
+ "type": "page",
+ "title": "GSoD - OpenPrinting",
+ "url": "/gsod",
+ "headings": [
+ "Year-Wise GSoD Project List",
+ "1. GSoD 2020",
+ "Year-Wise GSoD Students",
+ "1. GSoD 2020"
+ ],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:gsod2020",
+ "source": "static",
+ "type": "page",
+ "title": "GSoD 2020 Projects",
+ "url": "/gsod2020",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:history",
+ "source": "static",
+ "type": "page",
+ "title": "OpenPrinting - How did this all begin?",
+ "url": "/history",
+ "headings": [
+ "System Administrator in the Physics Department",
+ "MandrakeSoft in Paris",
+ "The Linux Foundation and Canonical"
+ ],
+ "tags": [],
+ "snippet": "A brief history of OpenPrinting",
+ "content": "This is about how I got into printing with free software, and how I made it to what I am now. If you want to know what we all achieved at OpenPrinting up to now, see what we have done so far. I have studied Physics at the university, not computer science, but always had a computer and liked programming. I had my first (Commodore VC20, 3.5K of RAM) with 16 years of age. In the time from 1996-2000 I did my PhD in Theoretical Physics and from 1997 on I was also system administrator for the department. The machines were all UNIX workstations (SGI and DEC) and to get workplace computers for everyone my first task was to set up Linux PCs (SUSE in that time). This way I got in contact with the wonderful world of free software. Programming work for the system administration (not the Fortran work for the PhD itself) was mainly to make things working in our department, especially also for the less IT-savvy professors. A first task which I contributed upstream were modifications on X-CD-Roast (an early GUI for recording CDs) to make it working in multi-user environments. We had also printers, PostScript lasers with 2 trays and duplex. The LPD printing system did not support passing printer-specific options along with jobs, so the admins before me created a wild hack to control these resources. Then we also got a color laser with many more options and these options were only accessible via proprietary GUIs on the commercial UNIXes (SGI and DEC) in our LPD environment. In spring 2000 I read an article about CUPS in the German \"Linux Magazin\" written by Kurt Pfeifle. CUPS was supporting PostScript printers perfectly with its PPD concept. I tried it and one could print on all our printers with all their bells and whistles, from all machines, also the Linux ones, and on all printers, including the color laser. And clients see the server's print queues automatically. So I adopted it in the department's network. Only disadvantage was that one could control everything only via the command line. GUI print dialogs were available from Michael Sweet, the author of CUPS, but only as proprietary, paid software. So I wrote a print dialog by myself, called it the \"X Printing Panel\", XPP (so I got the father of Linux print dialogs). This way everyone could easily fully control the printers, also the not so IT-savvy people in the department. It took me only around 10 days to get this together, but in the end I wanted to make it available for everyone. So I announced it on Freshmeat, and shortly after I got feedback, an invitation from Kurt Pfeifle, the author of the CUPS article in the \"Linux Magazin\", to the LinuxTag, the biggest Linux show in Europe that time, to present my little project on the booth of his employer, the printer service company Danka (later on overtaken by Ricoh). Most distributions did not show much interest but MandrakeSoft from Paris (later Mandriva) did. They showed me already on the booth how their development workflow works, and on the social event the told me everything of the daily life in their office. And some days after the show I got an e-mail with the invitation to work for them. By the way, on that LinuxTag I also met Richard Stallman, who invented the free software concept, and he also suffered a printing problem, and that led him to that step, as I also had a problem with printing, and got what I am today. So in the beginning of July 2000 I was on the LinuxTag and on August 1 2000 I lived in Paris, not knowing any word of French. Inside MandrakeSoft we were speaking English as they hired many people from other countries and they sent us all to French classes. My first task was to switch Mandrake Linux to the CUPS printing system and I succeeded already with the first release after my employment, which came out in fall 2000. To get PPD files for all, especially non-Postscript, printers I used linuxprinting.org (the site which provided Foomatic in that time) and asked its author, Grant Taylor, for a lot of improvements on it. In 2001 I had overtaken maintainership of the project, as Grant did not have time for it any more. The server was running in his house though, till 2006. In 2001 I got invited to the HP- and IBM-hosted OSDN Printing Summit in San Jose (Report from Grant Taylor), where I met several people of the printer manufacturers and of the PWG (Printer Working Group) and with them (Tom Hastings, Michael Sweet, Ira McDonald, Claudia Alimpich, Glen Petrie and, Norm Jacobs) I founded OpenPrinting as part of the Free Standards Group (FSG). In the following years I did not only do coding and packaging to improve printing, but also a lot of community work, CUPS evangelism, especially I organized a community booth about printing on the LinuxTag every year from 2001 to 2006, gave talks and tutorials on several conferences, mainly in Germany and Brazil, ran developer meetings on conferences in France, and participated in the work of creating printing APIs via phone meetings of the OpenPrinting people. Also all distributions switched to CUPS (with Foomatic) as their standard printing environment. The other printing systems disappeared and did not get maintained any more, probably due to lack of user interest. From 2001 on MandrakeSoft was not going well, was a sinking ship which (fortunately) actually sunk only in 2015. In Fall 2005 I was running a community booth on the Linux Expo in San Francisco and there I discussed with the folks that we need a meeting to plan how to improve printing and develop it further and we concluded to organize a Printing Summit in 2006, which I started to organize. End of 2005 I was invited on a Desktop Architects Meeting of the OSDL where I also advertised my plans of a Printing Summit and also got inspired to post on the GNOME mailing list that they should improve their print dialog to properly support CUPS as this was the standard. The first answer then came from Linus Torvalds, calling the GNOME guys \"interface nazis\" and that triggered a sh*tstorm, which was also mentioned in the end-of-year news reviews of 2005. But the GNOMies created the better dialog actually some time in 2006! The Printing Summit in 2006 was a great success. It was hosted by Lanier in Atlanta and I succeeded to get nearly everyone important for printing with free software to there, people of several manufacturers, distributions, drivers, Ghostscript, GUI environments, user interface experts, Mike Sweet (author of CUPS), ... There was also IAN Murdock, one of the founders of DebIAN. He was working for the FSG and I asked him whether the FSG could host linuxprinting.org (Foomatic) as manufacturers have already uploaded PPDs there but it was still running in Grant's house and an official download place deserves the security and reliability of a data center. But shortly after the Summit it came even better: The FSG did not only want to host Foomatic but also me. They invited me to work full-time on OpenPrinting and expand OpenPrinting to cover everything about printing with free software, especially also merge in linuxprinting.org. In 2006 I also had my last booth on the LinuxTag and there I met Mark Shuttleworth, founder of Canonical and Ubuntu. He also invited me for working as printing guru of Ubuntu. So from mid-2006 on I worked mainly for OpenPrinting but also for packaging the printing stack in Ubuntu. This is my work still today, but currently fully paid by Canonical. In 2007 the FSG and the OSDL joined to be the Linux Foundation and so I was their employee. I also got fellow member of the Linux Foundation which I am till today. From then on I did everything to make printing \"just work\" in non-Mac Unix/Posix-style operating systems. I held OpenPrinting Summits every year, later in collaboration with the Printer Working Group (PWG), work with manufacturers on doing printer drivers correctly, implement PWG standards in free software, ... From 2008 on I started organizing the participation of the Linux Foundation in the Google Summer of Code and got accepted for all but one year until now. Many students worked this way for OpenPrinting and recently we got together a student community to work on development tasks, like our new web site and also on mentoring further GSoC contributors. And here is what we have all done so far."
+ },
+ {
+ "id": "page:lfmp",
+ "source": "static",
+ "type": "page",
+ "title": "LFMP - OpenPrinting",
+ "url": "/lfmp",
+ "headings": [
+ "Year-Wise LFMP Project List",
+ "1. LFMP 2020",
+ "Year-Wise LFMP Students",
+ "1. LFMP 2020"
+ ],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:lfmp2020",
+ "source": "static",
+ "type": "page",
+ "title": "LFMP 2020 Projects",
+ "url": "/lfmp2020",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:projects",
+ "source": "static",
+ "type": "page",
+ "title": "Projects",
+ "url": "/projects",
+ "headings": [],
+ "tags": [],
+ "snippet": "OpenPrinting is reponsible for development of many opensource printing projects.",
+ "content": "OpenPrinting is reponsible for development of many opensource printing projects."
+ },
+ {
+ "id": "page:upcoming-technologies",
+ "source": "static",
+ "type": "page",
+ "title": "Upcoming Technologies in Printing from Linux",
+ "url": "/upcoming-technologies",
+ "headings": [],
+ "tags": [],
+ "snippet": "",
+ "content": ""
+ },
+ {
+ "id": "page:wsl-printer-app-compile",
+ "source": "static",
+ "type": "page",
+ "title": "Reviving an older printer with Ubuntu WSL and Printer Applications",
+ "url": "/wsl-printer-app-compile",
+ "headings": [
+ "Introduction",
+ "How to"
+ ],
+ "tags": [],
+ "snippet": "I have an old HP OfficeJet J4660 series printer for which Windows 11 doesn't offer drivers and I can only use that printer when I’m on Ubuntu. Working in the Ubuntu WSL team means...",
+ "content": "I have an old HP OfficeJet J4660 series printer for which Windows 11 doesn't offer drivers and I can only use that printer when I’m on Ubuntu. Working in the Ubuntu WSL team means I work a lot of time on Windows, thus sometimes it makes sense to be able to print some stuff, like when I need to make my copilot happy painting some complex piece of art. Unfortunately I was not able to do it. Until now. Sad painter Powered by Ubuntu WSL and Printer Applications, we can expose any printer Ubuntu has drivers for as an IPP Everywhere printer and connect it to Windows. The Printer Application emulates a driverless IPP printer, so that the printing system does not need to distinguish, it simply needs to support driverless IPP printers. The following how-to guide lists the steps required to be able to run the HPLIP Printer Application inside Ubuntu WSL and accessing the printer on Windows. That can be considered the dirty way, since WSL cannot yet support snaps. When that day comes, all complex compilation and running steps below will simply be replaced by one snap install command. Notice that WSL 2 is required. We will use Ubuntu 22.04.1 LTS for this guide. (Ubuntu 20.04 and older releases won’t work due certain packages required to be in newer versions than the ones offered by those releases). It’s necessary to point out that the following steps would simply be impossible without the amazing usbipd-win project, which offers a Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2. We use it to make the printer visible inside Ubuntu WSL. Connect the printer to the USB port. Make sure it’s not supported on Windows by checking Settings > Bluetooth & devices > Printers & scanners. Printers & Scanners Install the usbipd-win software. The easiest way is through winget. Open Powershell and issue the following command: winget install --interactive --exact dorssel.usbipd-win An alternative way is downloading the installer from the GitHub repository releases page and executing it. It will display a regular setup wizard. Follow its steps until the end. When prompted, accept the dialog to elevate permissions. In the end restart your computer to let the system changes take effect. Setup USB IPD Reboot Windows Install the Linux counterpart inside Ubuntu WSL. Refer to the project’s wiki for further information. Check your devices. Take note of the printer’s bus ID (in this case 1-3): Attach the printer to Ubuntu WSL. Run that command as administrator, if that’s the first time. For this case is 1-3. Check that the printer is visible from Ubuntu WSL. Install some dependencies in Ubuntu WSL Clone the required repositories. We need to build them from source. Compile the framework dependencies: CUPS Filters PAPPL PAPPL Retrofit Compile the HPLIP printer application. Make sure the compiled binary really works. Optionally, provide a printer test page if you want to test it before using the printer for real. Make sure the printer driver is installed. For our case that’s HPLIP. When prompted to whether existing files should be overwritten, answer ‘N’ (the default, just hit enter). Preserve existing files Start the server. Open any browser (either on Windows or Ubuntu WSL, if you have one installed) and open the address http://localhost:8000 to access the application web interface. Don’t worry too much if your browser complains about the TLS certificate. You’re accessing localhost, after all. Just keep going. TLS Certificate issue Printer application web interface Add a printer through the web interface by clicking on the “Add Printer” button (the device must be powered up, connected to your computer through USB and attached to Ubuntu WSL. Refer to step 6). Take note of the “Name” you assign to the printer. That will be later used to refer to that printer through IPP. Notice that two devices were listed in my case for the same printer. If that happens to you make sure to select the one that refers to the driver (HPLIP in our case). Add printer HP Confirm by clicking on the bottom “Add Printer” button. Printer name You should see a result like the following. Hit the button “Print Test Page” if you want to test the setup until here. Printer added Add the printer to Windows. Go to Settings > Bluetooth & devices > Printers & scanners and hit the “Add device” button. Add printer to Windows Soon it will show another button to “Add a new device manually”. On the “Add Printer” wizard that just appeared, select the third option “Add a printer using an IP address or hostname”. Add device manually Set “Device type” to “IPP Device” and “Hostname or IP address” to the following scheme: ipp://localhost:8000/ipp/print/ where is the name that you took note on step 17, when adding the printer through the web interface. (J4660 for my case). Add IPP printer A quick progress bar should display and then a success page is shown on the wizard. You can print a test page if you want. Printer added on Windows Once complete, make sure the newly added printer is present in the devices list (J4660 in my case). You may still see the unsupported one, just ignore it. Printer is listed Open any document you wish to print and set the “Printer” to the name of the printer we just added (J4660, in my case). Adjust any other pertinent settings, such as colors, paper size etc. as you normally would. Printing the PDF Check that the job appears in the web interface for that printer. Print queue Close the browser tab and quit the server when you’re done (Ctrl-C). Now one can simply print on Windows. Printing started Printing complete As said before, all the complexity of that setup will be handled by snapd once it becomes available in WSL. Happy printing! Happy painter"
+ },
+ {
+ "id": "page:wsl-printer-app-snap",
+ "source": "static",
+ "type": "page",
+ "title": "Reviving an older printer with Ubuntu WSL and Printer Application Snaps",
+ "url": "/wsl-printer-app-snap",
+ "headings": [
+ "Introduction",
+ "How to"
+ ],
+ "tags": [],
+ "snippet": "In the previous HOWTO we've seen how WSL 2 and Printer Applications can revive older printers which Windows doesn't offer drivers for. Although effective, it's quite complicated...",
+ "content": "In the previous HOWTO we've seen how WSL 2 and Printer Applications can revive older printers which Windows doesn't offer drivers for. Although effective, it's quite complicated to build the necessary components from source. That complexity is really not necessary anymore. If you've seen the latest news, Microsoft recently announced support for systemd inside WSL 2, which, among other features, allows us running Snaps. To know more of what can be done with systemd in Ubuntu WSL and how to enable it, check out the post in Ubuntu's blog. The following steps will leverage that power to install a Printer Application as a Snap, which encapsulates all dependencies and small details required to run it, and make the printer discoverable for Windows by using Avahi. Since both Avahi and the Printer Application will run as daemons, and since systemd is a new feature for WSL, I recommend following this guide on a dedicated Ubuntu WSL instance instead of doing it on the main instance you use for other purposes. Its also worth mentioning that the current state of systemd on WSL2 won't allow background services to keep your distro instance alive, so the services will run as long as the distro itself is running. As before, it’s necessary to point out that the following steps would simply be impossible without the amazing usbipd-win project, which offers a Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2. We use it to make the printer visible inside Ubuntu WSL. Editor's Note: USB IPD only needs to get installed if the printer gets actually connected by USB. For network-connected (Ethernet/Wi-Fi) printers it is not needed. Depending on your printer model you will perhaps need a different Printer Application (OpenPrinting, LPrint, or if you are in doubt, use our look-up service). Connect the printer to the USB port. Make sure it’s not supported on Windows by checking Settings > Bluetooth & devices > Printers & scanners. Printers & Scanners Install the usbipd-win software. The easiest way is through winget. Open Powershell and issue the following command: winget install --interactive --exact dorssel.usbipd-win An alternative way is downloading the installer from the GitHub repository releases page and executing it. It will display a regular setup wizard. Follow its steps until the end. When prompted, accept the dialog to elevate permissions. In the end restart your computer to let the system changes take effect. Setup USB IPD Reboot Windows Make sure you have the Ubuntu-Preview application. It can be installed from Microsoft Store. It contains the latest (usually unstable) development snapshot of Ubuntu WSL. It enables systemd by default. If you want to use an existing instance of Ubuntu WSL, refer to the Ubuntu blog post on how to enable systemd. If you're not using Ubuntu-Preview make sure to adjust the distro name in the relevant commands listed throughout the guide. Ubuntu Preview on MS Store Install the Avahi daemon and the Linux counterpart of USB IPD inside Ubuntu WSL. Refer to the project’s wiki for further information. Check your USB devices on Windows Powershell. Take note of the printer’s bus ID (in this case 1-3): Attach the printer to Ubuntu WSL. Run that command as administrator, if that’s the first time. For this case is 1-3. Check that the printer is visible from Ubuntu WSL. Install the Printer Application Snap. Assert that both hplip-printer-app and avahi-daemon are running. Running the command above should provide a list of processes running with those names on them. Having only grep or having one but not the other would mean a failure. A successful run looks like the image below. Running processes Open any browser (either on Windows or Ubuntu WSL, if you have one installed) and open the address http://localhost:8000 to access the application web interface. Don’t worry too much if your browser complains about the TLS certificate. You’re accessing localhost, after all. Just keep going. TLS Certificate issue Printer Application web interface Add a printer through the web interface by clicking on the “Add Printer” button (the device must be powered up, connected to your computer through USB and attached to Ubuntu WSL. Refer to step 6). Take note of the “Name” you assign to the printer. That will be later used to refer to that printer on Windows. Notice that two devices were listed in my case for the same printer. If that happens to you make sure to select the one that refers to the driver (HPLIP in our case). Add printer HP Confirm by clicking on the bottom “Add Printer” button. Printer name You should see a result like the following. Hit the button “Print Test Page” if you want to test the setup until here. Printer added Add the printer to Windows. Go to Settings > Bluetooth & devices > Printers & scanners and hit the “Add device” button. Thanks to Avahi the auto discover will just work and Windows will show the printer we just added through the web interface. The name listed here is the same we used in the step 12. Add printer to Windows Click on the \"Add device\" button for printer you want to add (J4660 in our case). It may take some seconds to connect and install the printer to the Windows environment. Once done it will show the label \"Ready\" below the printer name as well as list it downwards as the known device at this point. Printer added We're done. From then on everything should just work as you'd expect. Open any document you wish to print and set the “Printer” to the name of the printer we just added (J4660, in my case). Adjust any other pertinent settings, such as colors, paper size etc. as you normally would. Printing the PDF Check that the job appears in the web interface for that printer. Print queue Close the browser tab when you're bored of looking into the print queue details. Now one can simply print on Windows. Printing started Printing complete Exit the Ubuntu-Preview instance when you're done printing. As said before, systemd and background services won't prevent the distro instance from shutting down as usual. As said before, all the complexity is gone since now we can run snapd and Avahi on WSL 2, thanks to systemd. Happy printing!"
+ },
+ {
+ "id": "page:01-printer-application",
+ "source": "static",
+ "type": "page",
+ "title": "Printer Applications - A new way to print in Linux",
+ "url": "/01-printer-application",
+ "headings": [],
+ "tags": [],
+ "snippet": "Most modern general-purpose printers are IPP printers that allow driverless printing. They advertise themselves via DNS-SD, clients can poll the capability information of them via...",
+ "content": "Most modern general-purpose printers are IPP printers that allow driverless printing. They advertise themselves via DNS-SD, clients can poll the capability information of them via IPP requests, and they use standard data formats for print jobs. Printers not providing this functionality, usually legacy or specialty printers need a printer driver. A Printer Application is a daemon that detects the supported printers and advertises those printers on the localhost as an IPP Everywhere printer. Printer Applications are the recommended architecture for printer drivers. The Printer Application emulates a driverless IPP printer, so that the printing system does not need to distinguish, it simply needs to support driverless IPP printers. This way we add support for non-driverless printers and avoid deprecated and inconvenient methods, like using PPD (Postscript Printer Description) files on non-PostScript printers but also allow sandboxed packaging which allows providing OS-distribution-independent driver packages and improves security. In a sandboxed package, we cannot modify directory contents once it is built. Our system is no more modular. We cannot choose which printer driver package to install. Printer Applications address this problem of modularity and give us the same freedom as in the case of printer drivers. A Printer Application's web Interface provides configurability and makes it more accessible to the user. Instead of the web interface, one can also use the standard interface IPP System Service. This allows to define configurable parameters which a device-independent client can poll from the IPP server and display in a GUI so that the user can change them appropriate to his needs. It allows creation and deletion of printers, viewing active and completed jobs, cancellation of job/jobs, configuring the loaded media and network settings, requesting software updates, etc. The underlying mechanism involves adding custom pages and contents using callbacks, static resources, or external files and directories. Problems: Some old drivers are now unmaintained. So PPD files might be needed to support those. Therefore we need retro-fitting Printer Applications here, which wrap the driver's PPD files and filters. The CUPS API, frequently used in Printer Applications, is currently not actively developed by Apple, so Feature requests bug reports do not get answered. This often requires to work around bugs and shortcomings. Feel free to discuss in the comments."
+ },
+ {
+ "id": "page:02-ipp-scan",
+ "source": "static",
+ "type": "page",
+ "title": "IPP scan (or virtual MF device) server (Scanner Application)",
+ "url": "/02-ipp-scan",
+ "headings": [],
+ "tags": [],
+ "snippet": "The Printer Working Group (PWG) has also taken multi-function devices into account, devices which offer printer and scanner in one unit. For that they have added IPP Scan, an...",
+ "content": "The Printer Working Group (PWG) has also taken multi-function devices into account, devices which offer printer and scanner in one unit. For that they have added IPP Scan, an extension of the existing IPP protocol to facilitate driverless scanning. As IPP is already in use by the operating systems for many years via CUPS, using it as a scanning standard in the operating system makes it easy to integrate network multi-function devices. Currently, to scan in linux, a user has to procure the device specific SANE driver and then use a command line or a GUI based application that communicates with that scanner using this driver. Using IPP-Scan, a client would be able to communicate and receive files from an IPP-Scan enabled scanner using a universal IPP-Scan SANE backend or more directly via an IPP implementation, like for example libcups, thus eliminating the need of maintaining scanner specific drivers. However, currently there are no IPP-Scan scanners on the market. Scanner Applications attempt to remedy this situation by connecting to ordinary scanners and then emulating the IPP-Scan scanner for them. The clients can now communicate with the Scanner Application as if they were communicating with an IPP-Scan scanner. This provides us with two major benefits, firstly we move all the drivers to the central scan service rather than keeping a copy of each driver on each client and secondly, developers can now distribute sandboxed packages of the scanner drivers. Feel free to discuss in the comments."
+ },
+ {
+ "id": "page:03-3d-printing",
+ "source": "static",
+ "type": "page",
+ "title": "3D Printing",
+ "url": "/03-3d-printing",
+ "headings": [],
+ "tags": [],
+ "snippet": "3D Printing is also supposed to benefit from the new printing architecture, as Michael Sweet is also planning to support it in the PAPPL Printer Application library. Here we will...",
+ "content": "3D Printing is also supposed to benefit from the new printing architecture, as Michael Sweet is also planning to support it in the PAPPL Printer Application library. Here we will discuss the implementation and further development of 3D Printing integration to make it as easy as conventional 2D printing."
+ },
+ {
+ "id": "page:04-ipp-fax",
+ "source": "static",
+ "type": "page",
+ "title": "IPP Fax Out - A new reality",
+ "url": "/04-ipp-fax",
+ "headings": [],
+ "tags": [],
+ "snippet": "To complete the driverless support for IPP network multi-function devices there is also IPP Fax Out, the standard for sending faxes, as print jobs, through the fax functionality...",
+ "content": "To complete the driverless support for IPP network multi-function devices there is also IPP Fax Out, the standard for sending faxes, as print jobs, through the fax functionality of the device. The fax support is provided by an additional printing channel with its own URI (ending with \"/ipp/faxout\" instead of \"/ipp/print\") and printing to this channel makes the document being faxed. It naturally requires supplying the phone number as an IPP attribute, but otherwise it is exactly like printing, if polling this URI for capabilities you get the fax-specific \"printer\" capabilities and options, to be used for fax jobs. Current devices have this functionality ready available and we will show how we make it available for desktop applications and discuss possible alternatives."
+ },
+ {
+ "id": "page:05-designing-packaging-drivers",
+ "source": "static",
+ "type": "page",
+ "title": "Designing and Packaging Printer and Scanner Drivers",
+ "url": "/05-designing-packaging-drivers",
+ "headings": [],
+ "tags": [],
+ "snippet": "At the time of the Linux Plumbers 2020 taking place we have all the tools to create printer and scanner drivers in the new architecture: PAPPL, the Printer Application library...",
+ "content": "At the time of the Linux Plumbers 2020 taking place we have all the tools to create printer and scanner drivers in the new architecture: PAPPL, the Printer Application library gives us most of the always needed code for a standard-conforming IPP-printer-emulating Printer Application, cups-filters provides additional data format conversion code, and snapcraft creates the sandboxed Snap packages. Here we will present and discuss the workflow of designing and creating the drivers in the form of a Printer (and Scanner) Application and making a Snap (\"snapping\") it. The outcome of this session will also used in our Google Season of Docs project of creating a Printer/Scanner driver design and packaging tutorial."
+ }
+ ],
+ "metadata": {
+ "documentCount": 247,
+ "contentTypes": [
+ "post",
+ "documentation",
+ "project",
+ "page"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/public/vercel.svg b/public/vercel.svg
new file mode 100644
index 00000000..77053960
--- /dev/null
+++ b/public/vercel.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/window.svg b/public/window.svg
new file mode 100644
index 00000000..b2b2a44f
--- /dev/null
+++ b/public/window.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/public/wsl-printing-icon.png b/public/wsl-printing-icon.png
new file mode 100644
index 00000000..fa0f4e9a
Binary files /dev/null and b/public/wsl-printing-icon.png differ
diff --git a/scripts/foomatic/combine-data.ts b/scripts/foomatic/combine-data.ts
new file mode 100644
index 00000000..8a13343c
--- /dev/null
+++ b/scripts/foomatic/combine-data.ts
@@ -0,0 +1,502 @@
+// @ts-nocheck
+import fs from "fs";
+import path from "path";
+import { fileURLToPath } from "url";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const ROOT_DIR = path.join(__dirname, "..", "..");
+
+const PRINTERS_DIR = path.join(ROOT_DIR, "public", "foomatic-db", "printer");
+const DRIVERS_DIR = path.join(ROOT_DIR, "public", "foomatic-db", "driver");
+const OUTPUT_FILE = path.join(ROOT_DIR, "public", "foomatic-db", "printers.json");
+const PPD_OUTPUT_DIR = path.join(ROOT_DIR, "public", "ppds");
+
+function toArray(value) {
+ if (value === undefined || value === null) {
+ return [];
+ }
+
+ return Array.isArray(value) ? value : [value];
+}
+
+function getText(value) {
+ if (value === undefined || value === null) {
+ return undefined;
+ }
+
+ if (typeof value === "string") {
+ return value.trim() || undefined;
+ }
+
+ if (typeof value === "number" || typeof value === "boolean") {
+ return String(value);
+ }
+
+ if (Array.isArray(value)) {
+ const text = value.map(getText).filter(Boolean).join(", ").trim();
+ return text || undefined;
+ }
+
+ if (typeof value === "object") {
+ if (typeof value.en === "string") {
+ return value.en.trim() || undefined;
+ }
+
+ if (typeof value["#text"] === "string") {
+ return value["#text"].trim() || undefined;
+ }
+
+ for (const key of Object.keys(value)) {
+ const nested = getText(value[key]);
+ if (nested) {
+ return nested;
+ }
+ }
+ }
+
+ return undefined;
+}
+
+function getFunctionalityStatus(func) {
+ if (!func || func === "?") {
+ return "Unknown";
+ }
+
+ switch (func) {
+ case "A":
+ return "Perfect";
+ case "B":
+ case "C":
+ return "Mostly";
+ default:
+ return "Unsupported";
+ }
+}
+
+function getPrinterType(printer) {
+ if (!printer.mechanism) {
+ return "unknown";
+ }
+
+ const mechanism = printer.mechanism;
+
+ if (mechanism.inkjet !== undefined) {
+ return "inkjet";
+ }
+
+ if (mechanism.laser !== undefined) {
+ return "laser";
+ }
+
+ if (mechanism.dotmatrix !== undefined) {
+ return "dot-matrix";
+ }
+
+ if (mechanism.transfer === "i") {
+ return "inkjet";
+ }
+
+ if (mechanism.transfer === "t") {
+ return "laser";
+ }
+
+ return "unknown";
+}
+
+function parseConnectivity(printer) {
+ const connectivity = [];
+ if (!printer.autodetect) {
+ return connectivity;
+ }
+
+ if (printer.autodetect.usb) {
+ connectivity.push("USB");
+ }
+
+ if (printer.autodetect.parallel) {
+ connectivity.push("Parallel");
+ }
+
+ if (printer.autodetect.serial) {
+ connectivity.push("Serial");
+ }
+
+ if (printer.autodetect.network) {
+ connectivity.push("Network");
+ }
+
+ return connectivity;
+}
+
+function normalizePrinterId(printerId) {
+ return printerId.replace(/^printer\//, "");
+}
+
+function getDriverId(driverRef) {
+ if (typeof driverRef === "string") {
+ return driverRef.startsWith("driver/") ? driverRef : `driver/${driverRef}`;
+ }
+
+ if (driverRef && typeof driverRef === "object") {
+ const id = driverRef.id || driverRef["@id"] || driverRef["#text"];
+ if (id) {
+ return String(id).startsWith("driver/") ? String(id) : `driver/${id}`;
+ }
+ }
+
+ return null;
+}
+
+function getPrinterRefId(printerRef) {
+ if (typeof printerRef === "string") {
+ return printerRef.startsWith("printer/") ? printerRef : `printer/${printerRef}`;
+ }
+
+ if (printerRef && typeof printerRef === "object") {
+ const id = printerRef.id || printerRef["@id"] || printerRef["#text"];
+ if (id) {
+ return String(id).startsWith("printer/") ? String(id) : `printer/${id}`;
+ }
+ }
+
+ return null;
+}
+
+function getCommandsets(printer) {
+ const commandsetNode = printer.commandsets || printer.commandset;
+ const commandsetValues =
+ commandsetNode?.commandset ??
+ commandsetNode?.command ??
+ commandsetNode ??
+ [];
+
+ return toArray(commandsetValues)
+ .map(getText)
+ .filter(Boolean);
+}
+
+function getPpdOptions(printer) {
+ const ppdNode =
+ printer.ppdOptions ||
+ printer.ppdoptions ||
+ printer.ppdentrys ||
+ printer.ppdentries ||
+ printer.ppdentry ||
+ [];
+
+ const optionValues =
+ ppdNode.option ||
+ ppdNode.ppdoption ||
+ ppdNode.ppdentry ||
+ ppdNode.entry ||
+ ppdNode;
+
+ return toArray(optionValues)
+ .map((option) => {
+ if (typeof option === "string") {
+ return { text: option };
+ }
+
+ if (!option || typeof option !== "object") {
+ return null;
+ }
+
+ return {
+ name: getText(option.name || option["@name"]),
+ text: getText(option.text || option.description || option),
+ value: getText(option.value || option["@value"]),
+ };
+ })
+ .filter(Boolean);
+}
+
+function getSupportContacts(printer) {
+ const supportNode =
+ printer.supportContacts ||
+ printer.supportcontacts ||
+ printer.contacts ||
+ printer.contact;
+
+ const contacts =
+ supportNode?.contact ||
+ supportNode?.supportcontact ||
+ supportNode;
+
+ return toArray(contacts)
+ .map((contact) => {
+ if (typeof contact === "string") {
+ return { text: contact };
+ }
+
+ if (!contact || typeof contact !== "object") {
+ return null;
+ }
+
+ return {
+ name: getText(contact.name),
+ url: getText(contact.url || contact.web || contact.homepage),
+ email: getText(contact.email),
+ phone: getText(contact.phone),
+ text: getText(contact.description || contact.comments || contact),
+ };
+ })
+ .filter(Boolean);
+}
+
+function getBooleanCapability(value) {
+ if (value === undefined || value === null) {
+ return "unknown";
+ }
+
+ if (typeof value === "boolean") {
+ return value;
+ }
+
+ const text = getText(value)?.toLowerCase();
+ if (!text) {
+ return "unknown";
+ }
+
+ if (["1", "true", "yes", "y", "color", "duplex"].includes(text)) {
+ return true;
+ }
+
+ if (["0", "false", "no", "n", "mono", "monochrome", "simplex"].includes(text)) {
+ return false;
+ }
+
+ return "unknown";
+}
+
+function getColorCapability(printer) {
+ return getBooleanCapability(
+ printer.color ??
+ printer.colors ??
+ printer.colorDevice ??
+ printer.capabilities?.color
+ );
+}
+
+function getDuplexCapability(printer) {
+ return getBooleanCapability(
+ printer.duplex ??
+ printer.duplexer ??
+ printer.capabilities?.duplex
+ );
+}
+
+function buildPpdFileName(printerId, driverId) {
+ return `${normalizePrinterId(printerId)}-${driverId.replace(/^driver\//, "")}.ppd`;
+}
+
+function getGeneratedPpdPaths() {
+ const ppdPaths = new Set();
+
+ if (!fs.existsSync(PPD_OUTPUT_DIR)) {
+ return ppdPaths;
+ }
+
+ for (const fileName of fs.readdirSync(PPD_OUTPUT_DIR)) {
+ if (fileName.endsWith(".ppd")) {
+ ppdPaths.add(`/ppds/${fileName}`);
+ }
+ }
+
+ return ppdPaths;
+}
+
+function loadPrinterData() {
+ const printers = new Map();
+ const printerToDrivers = new Map();
+
+ const printerFiles = fs.readdirSync(PRINTERS_DIR);
+ for (const file of printerFiles) {
+ if (!file.endsWith(".json")) {
+ continue;
+ }
+
+ try {
+ const printerData = JSON.parse(fs.readFileSync(path.join(PRINTERS_DIR, file), "utf-8"));
+ const printer = printerData.printer;
+
+ if (!printer || !printer["@id"]) {
+ continue;
+ }
+
+ const printerId = printer["@id"];
+ printers.set(printerId, printer);
+ printerToDrivers.set(printerId, new Set());
+
+ const driverRefs = toArray(printer.drivers?.driver);
+ for (const driverRef of driverRefs) {
+ const driverId = getDriverId(driverRef);
+ if (driverId) {
+ printerToDrivers.get(printerId).add(driverId);
+ }
+ }
+ } catch (error) {
+ console.error(`Error loading printer file ${file}:`, error.message);
+ }
+ }
+
+ return { printers, printerToDrivers };
+}
+
+function loadDriverData(printers, printerToDrivers) {
+ const drivers = new Map();
+ const driverFiles = fs.readdirSync(DRIVERS_DIR);
+
+ for (const file of driverFiles) {
+ if (!file.endsWith(".json")) {
+ continue;
+ }
+
+ try {
+ const driverData = JSON.parse(fs.readFileSync(path.join(DRIVERS_DIR, file), "utf-8"));
+ const driver = driverData.driver;
+ if (!driver || !driver["@id"]) {
+ continue;
+ }
+
+ drivers.set(driver["@id"], driver);
+
+ const printerRefs = toArray(driver.printers?.printer);
+ for (const printerRef of printerRefs) {
+ const printerId = getPrinterRefId(printerRef);
+ if (!printerId) {
+ continue;
+ }
+
+ if (!printerToDrivers.has(printerId)) {
+ printerToDrivers.set(printerId, new Set());
+ }
+
+ printerToDrivers.get(printerId).add(driver["@id"]);
+
+ if (!printers.has(printerId)) {
+ const parts = normalizePrinterId(printerId).split("-");
+ printers.set(printerId, {
+ "@id": printerId,
+ make: parts[0]?.replace(/_/g, " ") || "Unknown",
+ model: parts.slice(1).join("-").replace(/_/g, " ") || "Unknown",
+ mechanism: {},
+ functionality: "?",
+ comments: printerRef?.comments,
+ });
+ }
+ }
+ } catch (error) {
+ console.error(`Error loading driver file ${file}:`, error.message);
+ }
+ }
+
+ return drivers;
+}
+
+function buildDriverDetails(printerId, driverIds, drivers, generatedPpdPaths) {
+ return driverIds
+ .map((driverId) => drivers.get(driverId))
+ .filter(Boolean)
+ .map((driver) => {
+ const ppdPath = `/ppds/${buildPpdFileName(printerId, driver["@id"])}`;
+ const execution = driver.execution
+ ? {
+ ...driver.execution,
+ prototype:
+ driver.execution.prototype ??
+ driver.execution.driverPrototype ??
+ null,
+ }
+ : null;
+
+ return {
+ id: driver["@id"],
+ name: driver.name,
+ url: driver.url || null,
+ comments: driver.comments ? getText(driver.comments) || "" : "",
+ hasPpd: generatedPpdPaths.has(ppdPath),
+ ...(generatedPpdPaths.has(ppdPath) ? { ppdPath } : {}),
+ execution,
+ };
+ });
+}
+
+async function combineData() {
+ const { printers, printerToDrivers } = loadPrinterData();
+ const drivers = loadDriverData(printers, printerToDrivers);
+ const generatedPpdPaths = getGeneratedPpdPaths();
+
+ console.log(`Loaded ${printers.size} printers and ${drivers.size} drivers`);
+ console.log(`Detected ${generatedPpdPaths.size} generated PPD files in ${PPD_OUTPUT_DIR}`);
+
+ const combinedPrinters = [];
+
+ for (const [printerId, printer] of printers.entries()) {
+ const driverIdSet = printerToDrivers.get(printerId) || new Set();
+ const driverIds = Array.from(driverIdSet);
+
+ let recommendedDriverId = null;
+ if (printer.driver) {
+ recommendedDriverId = `driver/${printer.driver}`;
+ if (!driverIdSet.has(recommendedDriverId)) {
+ driverIdSet.add(recommendedDriverId);
+ driverIds.push(recommendedDriverId);
+ }
+ } else if (driverIds.length > 0) {
+ recommendedDriverId = driverIds[0];
+ }
+
+ const manufacturer = getText(printer.make) || "Unknown";
+ const model = getText(printer.model) || "Unknown";
+ const functionality = getText(printer.functionality) || "?";
+ const driverDetails = buildDriverDetails(printerId, driverIds, drivers, generatedPpdPaths);
+ const status = getFunctionalityStatus(functionality);
+ const finalStatus = driverDetails.length === 0 && status === "Unknown" ? "Unsupported" : status;
+ const recommendedDriverWithPpd =
+ driverDetails.find((driver) => driver.id === recommendedDriverId && driver.hasPpd) ||
+ driverDetails.find((driver) => driver.hasPpd);
+
+ combinedPrinters.push({
+ id: normalizePrinterId(printerId),
+ manufacturer,
+ model,
+ series: getText(printer.series) || "",
+ connectivity: parseConnectivity(printer),
+ recommended_driver: recommendedDriverId,
+ drivers: driverDetails,
+ type: getPrinterType(printer),
+ status: finalStatus,
+ functionality,
+ notes: getText(printer.comments) || "",
+ hasPpd: Boolean(recommendedDriverWithPpd),
+ ...(recommendedDriverWithPpd?.ppdPath ? { ppdPath: recommendedDriverWithPpd.ppdPath } : {}),
+ supportContacts: getSupportContacts(printer),
+ commandsets: getCommandsets(printer),
+ ppdOptions: getPpdOptions(printer),
+ color: getColorCapability(printer),
+ duplex: getDuplexCapability(printer),
+ recommended: Boolean(printer.driver || recommendedDriverId),
+ });
+ }
+
+ combinedPrinters.sort((left, right) => {
+ const manufacturerComparison = String(left.manufacturer || "").localeCompare(String(right.manufacturer || ""));
+ if (manufacturerComparison !== 0) {
+ return manufacturerComparison;
+ }
+
+ return String(left.model || "").localeCompare(String(right.model || ""));
+ });
+
+ fs.mkdirSync(path.dirname(OUTPUT_FILE), { recursive: true });
+ fs.writeFileSync(OUTPUT_FILE, JSON.stringify({ printers: combinedPrinters }, null, 2));
+
+ console.log(`Combined data written to ${OUTPUT_FILE}`);
+ console.log(`Total printers: ${combinedPrinters.length}`);
+}
+
+combineData().catch((error) => {
+ console.error("Failed to combine printer data:", error);
+ process.exit(1);
+});
diff --git a/scripts/foomatic/data-generate.ts b/scripts/foomatic/data-generate.ts
new file mode 100644
index 00000000..5d8f4861
--- /dev/null
+++ b/scripts/foomatic/data-generate.ts
@@ -0,0 +1,24 @@
+import { spawnSync } from "child_process";
+
+const forwardedArgs = process.argv.slice(2);
+const skipPpd = forwardedArgs.includes("--skip-ppd");
+const steps: Array<[string, string[]]> = [
+ ["scripts/foomatic/generate-from-xml.ts", []],
+ ["scripts/foomatic/generate-ppds.sh", skipPpd ? ["--skip-ppd"] : []],
+ ["scripts/foomatic/combine-data.ts", forwardedArgs],
+ ["scripts/foomatic/split-printers.ts", []],
+];
+
+for (const [scriptPath, args] of steps) {
+ const command = scriptPath.endsWith(".sh") ? "/bin/bash" : "tsx";
+ const commandArgs = scriptPath.endsWith(".sh")
+ ? [scriptPath, ...args]
+ : [scriptPath, ...args];
+ const result = spawnSync(command, commandArgs, {
+ stdio: "inherit",
+ });
+
+ if (result.status !== 0) {
+ process.exit(result.status ?? 1);
+ }
+}
diff --git a/scripts/foomatic/generate-from-xml.ts b/scripts/foomatic/generate-from-xml.ts
new file mode 100644
index 00000000..2a634bc2
--- /dev/null
+++ b/scripts/foomatic/generate-from-xml.ts
@@ -0,0 +1,119 @@
+// @ts-nocheck
+import fs from "fs";
+import path from "path";
+import { fileURLToPath } from "url";
+import { XMLParser } from "fast-xml-parser";
+import { execSync } from "child_process";
+
+const __filename = fileURLToPath(import.meta.url);
+const __dirname = path.dirname(__filename);
+const ROOT_DIR = path.join(__dirname, "..", "..");
+
+const FDB_REPO = "https://github.com/OpenPrinting/foomatic-db.git";
+const FDB_DIR = path.join(ROOT_DIR, "cache", "foomatic-db");
+const FDB_PATH = path.join(FDB_DIR, "db", "source");
+const PRINTER_XML_DIR = path.join(FDB_PATH, "printer");
+const DRIVER_XML_DIR = path.join(FDB_PATH, "driver");
+const PRINTER_JSON_DIR = path.join(ROOT_DIR, "public", "foomatic-db", "printer");
+const DRIVER_JSON_DIR = path.join(ROOT_DIR, "public", "foomatic-db", "driver");
+const parserOptions = {
+ ignoreAttributes: false,
+ attributeNamePrefix: "@",
+ textNodeName: "#text",
+ allowBooleanAttributes: true,
+ transformTagName: (tagName) =>
+ tagName === "prototype" ? "driverPrototype" : tagName,
+};
+const parser = new XMLParser(parserOptions);
+
+function getErrorMessage(error: unknown): string {
+ return error instanceof Error ? error.message : String(error);
+}
+
+function setupFoomaticDb() {
+ console.log(`Checking for foomatic-db at ${FDB_DIR}...`);
+ if (fs.existsSync(FDB_DIR)) {
+ console.log("Found existing repository. Pulling latest changes...");
+ try {
+ execSync(`git -C "${FDB_DIR}" pull`, { stdio: "inherit" });
+ console.log("foomatic-db is up to date.");
+ } catch (error) {
+ console.warn(
+ `Could not refresh cached foomatic-db, continuing with existing data: ${getErrorMessage(error)}`
+ );
+ }
+ } else {
+ console.log("Repository not found. Cloning from GitHub...");
+ try {
+ fs.mkdirSync(path.dirname(FDB_DIR), { recursive: true });
+ execSync(`git clone ${FDB_REPO} "${FDB_DIR}"`, { stdio: "inherit" });
+ console.log("foomatic-db cloned successfully.");
+ } catch (error) {
+ console.error("Error cloning foomatic-db:", getErrorMessage(error));
+ process.exit(1);
+ }
+ }
+}
+
+function processDirectory(sourceDir: string, outputDir: string) {
+ let fileCount = 0;
+ console.log(`Processing XML from: ${sourceDir}`);
+ fs.mkdirSync(outputDir, { recursive: true });
+ const files = fs.readdirSync(sourceDir);
+
+ for (const file of files) {
+ if (file.endsWith(".xml")) {
+ const xmlPath = path.join(sourceDir, file);
+ const jsonPath = path.join(outputDir, file.replace(".xml", ".json"));
+
+ try {
+ const xmlContent = fs.readFileSync(xmlPath, "utf-8");
+ let parsedData = parser.parse(xmlContent);
+ if (sourceDir === DRIVER_XML_DIR && parsedData.driver?.printers?.printer) {
+ let printerRefs = parsedData.driver.printers.printer;
+ if (!Array.isArray(printerRefs)) {
+ printerRefs = [printerRefs];
+ }
+
+ const transformedPrinterRefs = printerRefs.map((printerRef: unknown) => {
+ let newRef: Record = {};
+ let printerId: string | null = null;
+
+ if (typeof printerRef === "string") {
+ printerId = printerRef;
+ newRef.id = printerId;
+
+ } else if (typeof printerRef === "object" && printerRef !== null) {
+ newRef = { ...printerRef };
+ const printerRefRecord = printerRef as Record;
+
+ if (typeof printerRefRecord.id === "string") printerId = printerRefRecord.id;
+ else if (typeof printerRefRecord["@id"] === "string") printerId = printerRefRecord["@id"];
+ else if (typeof printerRefRecord["#text"] === "string") printerId = printerRefRecord["#text"];
+
+ if (printerId) {
+ newRef.id = printerId;
+ }
+ }
+ return newRef;
+ });
+
+ parsedData.driver.printers.printer = transformedPrinterRefs;
+ }
+ fs.writeFileSync(jsonPath, JSON.stringify(parsedData, null, 2));
+ fileCount++;
+
+ } catch (error) {
+ console.error(`Failed to process ${file}:`, error);
+ }
+ }
+ }
+ console.log(`Successfully converted ${fileCount} files in ${outputDir}`);
+}
+
+console.log("Starting data generation pipeline...");
+setupFoomaticDb();
+console.log("Starting XML to JSON data generation...");
+processDirectory(PRINTER_XML_DIR, PRINTER_JSON_DIR);
+processDirectory(DRIVER_XML_DIR, DRIVER_JSON_DIR);
+console.log("Data generation complete.");
diff --git a/scripts/foomatic/generate-ppds.sh b/scripts/foomatic/generate-ppds.sh
new file mode 100755
index 00000000..234f13db
--- /dev/null
+++ b/scripts/foomatic/generate-ppds.sh
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+ROOT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
+CACHE_LIB_DIR="$ROOT_DIR/cache/foomatic-db"
+CACHE_DB_DIR="$CACHE_LIB_DIR/db"
+SYSTEM_LIB_DIR="/usr/share/foomatic"
+SYSTEM_DB_DIR="$SYSTEM_LIB_DIR/db"
+OUTPUT_DIR="$ROOT_DIR/public/ppds"
+REVISION_FILE="$OUTPUT_DIR/.foomatic-db-revision"
+
+mkdir -p "$OUTPUT_DIR"
+
+if [[ "${1:-}" == "--skip-ppd" || "${SKIP_PPD_GEN:-false}" == "true" ]]; then
+ echo "Skipping PPD generation"
+ exit 0
+fi
+
+if [[ "${1:-}" == "--force" || "${FORCE_PPD_GEN:-false}" == "true" ]]; then
+ FORCE_PPD_GEN="true"
+else
+ FORCE_PPD_GEN="false"
+fi
+
+if ! command -v foomatic-compiledb >/dev/null 2>&1; then
+ echo "foomatic-compiledb not found; skipping PPD generation"
+ exit 0
+fi
+
+if [[ -d "$CACHE_DB_DIR" ]]; then
+ export FOOMATICDB="$CACHE_LIB_DIR"
+ echo "Using workspace Foomatic DB at $CACHE_DB_DIR"
+elif [[ -d "$SYSTEM_DB_DIR" ]]; then
+ export FOOMATICDB="$SYSTEM_LIB_DIR"
+ echo "Using system Foomatic DB at $SYSTEM_DB_DIR"
+else
+ echo "Foomatic DB not found in $CACHE_DB_DIR or $SYSTEM_DB_DIR; skipping PPD generation"
+ exit 0
+fi
+
+CURRENT_DB_REVISION=""
+if [[ -d "$CACHE_LIB_DIR/.git" ]]; then
+ CURRENT_DB_REVISION="$(git -C "$CACHE_LIB_DIR" rev-parse HEAD 2>/dev/null || true)"
+fi
+
+EXISTING_PPD_COUNT="$(find "$OUTPUT_DIR" -type f -name '*.ppd' | wc -l | tr -d ' ')"
+if [[ "$FORCE_PPD_GEN" != "true" && -n "$CURRENT_DB_REVISION" && -f "$REVISION_FILE" && "$EXISTING_PPD_COUNT" -gt 0 ]]; then
+ SAVED_DB_REVISION="$(tr -d '\n' < "$REVISION_FILE")"
+ if [[ "$SAVED_DB_REVISION" == "$CURRENT_DB_REVISION" ]]; then
+ echo "PPD files already match foomatic-db revision $CURRENT_DB_REVISION; skipping generation"
+ exit 0
+ fi
+fi
+
+echo "FOOMATICDB=$FOOMATICDB"
+echo "Generating PPD files into $OUTPUT_DIR"
+foomatic-compiledb -t ppd -j 4 -d "$OUTPUT_DIR" -f
+
+if [[ -n "$CURRENT_DB_REVISION" ]]; then
+ printf '%s\n' "$CURRENT_DB_REVISION" > "$REVISION_FILE"
+fi
+
+FILE_COUNT="$(find "$OUTPUT_DIR" -type f -name '*.ppd' | wc -l | tr -d ' ')"
+echo "Generated $FILE_COUNT PPD files"
diff --git a/scripts/foomatic/split-printers.ts b/scripts/foomatic/split-printers.ts
new file mode 100644
index 00000000..e8f8f382
--- /dev/null
+++ b/scripts/foomatic/split-printers.ts
@@ -0,0 +1,83 @@
+import fs from 'fs/promises'
+import path from 'path'
+import { fileURLToPath } from 'url'
+
+const __filename = fileURLToPath(import.meta.url)
+const __dirname = path.dirname(__filename)
+const ROOT_DIR = path.join(__dirname, "..", "..")
+
+type PrinterRecord = {
+ id: string
+ manufacturer?: string
+ model?: string
+ type?: string
+ status?: string
+ functionality?: string
+ drivers?: unknown[]
+}
+
+type PrintersPayload = {
+ printers: PrinterRecord[]
+}
+
+async function splitPrintersData() {
+ try {
+ console.log('Starting printer data splitting process...')
+
+ const printersPath = path.join(ROOT_DIR, 'public', 'foomatic-db', 'printers.json')
+ const data = JSON.parse(await fs.readFile(printersPath, 'utf-8')) as PrintersPayload
+
+ console.log(`Found ${data.printers.length} printers to process`)
+
+ const printersDir = path.join(ROOT_DIR, 'public', 'foomatic-db', 'printers')
+ await fs.mkdir(printersDir, { recursive: true })
+
+ const printersMap = {
+ printers: data.printers.map(printer => ({
+ id: printer.id,
+ manufacturer: printer.manufacturer,
+ model: printer.model,
+ type: printer.type || 'unknown',
+ status: printer.status || 'Unknown',
+ functionality: printer.functionality || '?',
+ driverCount: printer.drivers ? printer.drivers.length : 0
+ }))
+ }
+ const mapPath = path.join(ROOT_DIR, 'public', 'foomatic-db', 'printersMap.json')
+ await fs.writeFile(mapPath, JSON.stringify(printersMap, null, 2))
+ console.log(`Created lightweight index: ${mapPath}`)
+ let processed = 0
+ const batchSize = 100
+
+ for (let i = 0; i < data.printers.length; i += batchSize) {
+ const batch = data.printers.slice(i, i + batchSize)
+
+ await Promise.all(batch.map(async (printer: PrinterRecord) => {
+ const printerPath = path.join(printersDir, `${printer.id}.json`)
+ await fs.writeFile(printerPath, JSON.stringify(printer, null, 2))
+ processed++
+ }))
+
+ if (processed % 500 === 0) {
+ console.log(`Processed ${processed}/${data.printers.length} printers...`)
+ }
+ }
+
+ console.log(`Successfully split ${data.printers.length} printers into individual files`)
+ console.log(`Individual files saved to: ${printersDir}`)
+ const originalSize = (await fs.stat(printersPath)).size
+ const mapSize = (await fs.stat(mapPath)).size
+ const savings = ((originalSize - mapSize) / originalSize * 100).toFixed(1)
+
+ console.log(`Size comparison:`)
+ console.log(` Original printers.json: ${(originalSize / 1024 / 1024).toFixed(2)} MB`)
+ console.log(` Lightweight printersMap.json: ${(mapSize / 1024).toFixed(2)} KB`)
+ console.log(` Initial load size reduction: ${savings}%`)
+
+ } catch (error) {
+ console.error(' Error splitting printer data:', error)
+ process.exit(1)
+ }
+}
+
+splitPrintersData()
diff --git a/scripts/generate-rss.ts b/scripts/generate-rss.ts
new file mode 100644
index 00000000..7d0f8c79
--- /dev/null
+++ b/scripts/generate-rss.ts
@@ -0,0 +1,108 @@
+import fs from "fs/promises";
+import path from "path";
+import matter from "gray-matter";
+import { siteConfig } from "../config/site.config.ts";
+
+const POSTS_DIR = path.join(process.cwd(), "contents", "post");
+const OUTPUT_DIR = path.join(process.cwd(), "public");
+const OUTPUT_FILE = path.join(OUTPUT_DIR, "feed.xml");
+
+const SITE_URL = siteConfig.urls.canonicalOrigin;
+const SITE_TITLE = `${siteConfig.brand.name} News`;
+const SITE_DESCRIPTION =
+ "Latest news and updates from the OpenPrinting project";
+const MAX_ITEMS = 20;
+
+function escapeXml(str: string): string {
+ return str
+ .replace(/&/g, "&")
+ .replace(//g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+}
+
+function toRfc822(dateStr: string): string {
+ return new Date(dateStr).toUTCString();
+}
+
+interface PostMeta {
+ slug: string;
+ title: string;
+ date: string;
+ excerpt: string;
+ author: string;
+}
+
+async function generateRss() {
+ console.log("Generating RSS feed...");
+
+ const files = await fs.readdir(POSTS_DIR);
+ const posts: PostMeta[] = [];
+
+ for (const file of files.filter((f) => f.endsWith(".md"))) {
+ const slug = file.replace(/\.md$/, "");
+ const raw = await fs.readFile(path.join(POSTS_DIR, file), "utf8");
+ const { data } = matter(raw);
+
+ posts.push({
+ slug,
+ title:
+ typeof data.title === "string"
+ ? data.title.trim().replace(/\\/g, "")
+ : slug,
+ date: typeof data.date === "string" ? data.date : "",
+ excerpt: typeof data.excerpt === "string" ? data.excerpt.trim() : "",
+ author: typeof data.author === "string" ? data.author.trim() : "",
+ });
+ }
+
+ posts.sort(
+ (a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()
+ );
+
+ const items = posts
+ .slice(0, MAX_ITEMS)
+ .map((post) => {
+ const url = `${SITE_URL}/${post.slug}/`;
+ const lines = [
+ ` - `,
+ `
${escapeXml(post.title)} `,
+ ` ${url}`,
+ ` ${url} `,
+ ];
+ if (post.date) lines.push(` ${toRfc822(post.date)} `);
+ if (post.author) lines.push(` ${escapeXml(post.author)} `);
+ if (post.excerpt)
+ lines.push(` ${escapeXml(post.excerpt)} `);
+ lines.push(` `);
+ return lines.join("\n");
+ })
+ .join("\n");
+
+ const xml = `
+
+
+ ${escapeXml(SITE_TITLE)}
+ ${SITE_URL}/
+ ${escapeXml(SITE_DESCRIPTION)}
+ en-us
+ ${new Date().toUTCString()}
+
+${items}
+
+
+`;
+
+ await fs.mkdir(OUTPUT_DIR, { recursive: true });
+ await fs.writeFile(OUTPUT_FILE, xml, "utf8");
+
+ console.log(
+ `RSS feed generated with ${Math.min(posts.length, MAX_ITEMS)} items → ${OUTPUT_FILE}`
+ );
+}
+
+generateRss().catch((err) => {
+ console.error("Failed to generate RSS feed:", err);
+ process.exit(1);
+});
diff --git a/scripts/search/build-foomatic-index.ts b/scripts/search/build-foomatic-index.ts
new file mode 100644
index 00000000..2907429e
--- /dev/null
+++ b/scripts/search/build-foomatic-index.ts
@@ -0,0 +1,115 @@
+import fs from "fs/promises";
+import path from "path";
+import {
+ type FoomaticSearchDocument,
+ type SearchIndex,
+} from "../../lib/search/types.ts";
+
+const INPUT_FILE = path.join(
+ process.cwd(),
+ "public",
+ "foomatic-db",
+ "printersMap.json",
+);
+const OUTPUT_DIR = path.join(process.cwd(), "public", "search");
+const OUTPUT_FILE = path.join(OUTPUT_DIR, "foomatic-index.json");
+
+interface PrinterMapEntry {
+ id: string;
+ manufacturer: string;
+ model: string;
+ type?: string;
+ status?: string;
+ functionality?: string;
+ driverCount?: number;
+}
+
+interface PrinterMapFile {
+ printers: PrinterMapEntry[];
+}
+
+function safeString(value: unknown): string {
+ return typeof value === "string" ? value.trim() : "";
+}
+
+function toPrinterUrl(id: string): string {
+ const normalizedId = id.replace(/^printer\//, "");
+ return `/foomatic/printer/${normalizedId}`;
+}
+
+function createSnippet(printer: PrinterMapEntry): string {
+ const parts: string[] = [];
+ const status = safeString(printer.status);
+ const type = safeString(printer.type);
+ const driverCount = Number.isFinite(printer.driverCount)
+ ? Number(printer.driverCount)
+ : 0;
+
+ if (status && status.toLowerCase() !== "unknown") {
+ parts.push(`${status} support`);
+ }
+
+ if (type && type.toLowerCase() !== "unknown") {
+ parts.push(type);
+ }
+
+ parts.push(
+ `${driverCount} driver${driverCount === 1 ? "" : "s"} listed`,
+ );
+
+ return parts.join(" • ");
+}
+
+async function buildFoomaticIndex() {
+ console.log("Building Foomatic search index...");
+
+ const raw = await fs.readFile(INPUT_FILE, "utf8");
+ const printerMap = JSON.parse(raw) as PrinterMapFile;
+
+ const documents: FoomaticSearchDocument[] = printerMap.printers.map(
+ (printer) => ({
+ id: `foomatic:${printer.id}`,
+ source: "foomatic",
+ type: "printer",
+ title: `${safeString(printer.manufacturer)} ${safeString(printer.model)}`.trim(),
+ url: toPrinterUrl(printer.id),
+ headings: [],
+ tags: [],
+ snippet: createSnippet(printer),
+ content: [
+ safeString(printer.manufacturer),
+ safeString(printer.model),
+ safeString(printer.type),
+ safeString(printer.status),
+ safeString(printer.functionality),
+ ]
+ .filter(Boolean)
+ .join(" "),
+ manufacturer: safeString(printer.manufacturer),
+ model: safeString(printer.model),
+ status: safeString(printer.status) || undefined,
+ driverCount: Number.isFinite(printer.driverCount)
+ ? Number(printer.driverCount)
+ : 0,
+ }),
+ );
+
+ const index: SearchIndex = {
+ version: "1.0",
+ documents,
+ metadata: {
+ documentCount: documents.length,
+ contentTypes: ["printer"],
+ },
+ };
+
+ await fs.mkdir(OUTPUT_DIR, { recursive: true });
+ await fs.writeFile(OUTPUT_FILE, JSON.stringify(index, null, 2), "utf8");
+
+ console.log(`Foomatic search index generated with ${documents.length} documents`);
+}
+
+buildFoomaticIndex().catch((error) => {
+ console.error("Failed to build Foomatic search index:", error);
+ process.exit(1);
+});
diff --git a/scripts/search/build-index.ts b/scripts/search/build-index.ts
new file mode 100644
index 00000000..e2763608
--- /dev/null
+++ b/scripts/search/build-index.ts
@@ -0,0 +1,117 @@
+import fs from "fs/promises";
+import path from "path";
+import { siteConfig } from "../../config/site.config.ts";
+import { extractPosts } from "./extract-posts.ts";
+import { extractContent, type RawStaticContent } from "./extract-content.ts";
+import { normalizeMarkdown } from "./normalize-markdown.ts";
+import { type SearchDocument, type StaticSearchIndex } from "../../lib/search/types.ts";
+
+const OUTPUT_DIR = path.join(process.cwd(), "public", "search");
+const OUTPUT_FILE = path.join(OUTPUT_DIR, "static-index.json");
+
+function safeString(value: unknown): string {
+ return typeof value === "string" ? value.trim().replace(/\\/g, "") : "";
+}
+
+function getImageSrc(src: string): string {
+ if (/^(https?:)?\/\//.test(src)) {
+ return src;
+ }
+
+ const normalizedSrc = src.startsWith("../")
+ ? src.replace(/^\.\.\//, "/")
+ : src;
+
+ return `${siteConfig.urls.basePath}${
+ normalizedSrc.startsWith("/") ? normalizedSrc : `/${normalizedSrc}`
+ }`;
+}
+
+async function buildIndex() {
+ console.log("Building static search index...");
+
+ const rawPosts = await extractPosts();
+ const rawContent: RawStaticContent[] = await extractContent();
+
+ const postDocuments: SearchDocument[] = rawPosts.map((post) => {
+ const title =
+ safeString(post.frontmatter.title) || "Untitled Article";
+
+ const excerpt = safeString(post.frontmatter.excerpt);
+
+ const { headings, text, snippet } = normalizeMarkdown(post.content);
+
+ return {
+ id: `post:${post.slug}`,
+ source: "static",
+ type: "post",
+
+ title,
+ url: `/${post.slug}`,
+
+ headings,
+ tags: [],
+ teaserImage: post.teaserImage
+ ? getImageSrc(post.teaserImage)
+ : undefined,
+ snippet: excerpt || snippet,
+ content: text,
+ };
+ });
+
+ const contentDocuments: SearchDocument[] = rawContent.map((post) => {
+ const title = safeString(post.frontmatter.title) || "Untitled Article";
+ const excerpt = safeString(post.frontmatter.excerpt);
+
+ const { headings, text, snippet } = normalizeMarkdown(post.content);
+
+ let url: string;
+ if (post.type === "documentation" || post.type === "project") {
+ url = `/${post.type}/${post.slug}`;
+ } else if (post.type === "page") {
+ url = `/${post.slug}`;
+ } else {
+ url = `/${post.slug}`;
+ }
+
+ return {
+ id: `${post.type}:${post.slug}`,
+ source: "static",
+ type: post.type,
+
+ title,
+ url,
+
+ headings,
+ tags: [],
+
+ snippet: excerpt || snippet,
+ content: text,
+ };
+ });
+
+ const documents: SearchDocument[] = [...postDocuments, ...contentDocuments];
+
+ const index: StaticSearchIndex = {
+ version: "1.0",
+ documents,
+ metadata: {
+ documentCount: documents.length,
+ contentTypes: ["post", "documentation", "project", "page"],
+ },
+ };
+
+ await fs.mkdir(OUTPUT_DIR, { recursive: true });
+ await fs.writeFile(
+ OUTPUT_FILE,
+ JSON.stringify(index, null, 2),
+ "utf8"
+ );
+
+ console.log(`Search index generated with ${documents.length} documents`);
+}
+
+buildIndex().catch((err) => {
+ console.error("Failed to build search index:", err);
+ process.exit(1);
+});
diff --git a/scripts/search/extract-content.ts b/scripts/search/extract-content.ts
new file mode 100644
index 00000000..3c8bdcc0
--- /dev/null
+++ b/scripts/search/extract-content.ts
@@ -0,0 +1,42 @@
+import fs from "fs/promises";
+import path from "path";
+import matter from "gray-matter";
+
+import type { RawPost } from "./extract-posts.ts";
+import type { StaticContentType } from "../../lib/search/types.ts";
+
+const CONTENT_DIRS: Record = {
+ documentation: "documentation",
+ projects: "project",
+ pages: "page",
+ "upcoming-technologies": "page",
+};
+
+export type RawStaticContent = RawPost & { type: StaticContentType };
+
+export async function extractContent(): Promise {
+ const items: RawStaticContent[] = [];
+
+ for (const [dir, type] of Object.entries(CONTENT_DIRS)) {
+ const fullDirPath = path.join(process.cwd(), "contents", dir);
+ const files = await fs.readdir(fullDirPath);
+ const markdownFiles = files.filter((file) => file.endsWith(".md"));
+
+ for (const file of markdownFiles) {
+ const slug = file.replace(/\.md$/, "");
+ const fullPath = path.join(fullDirPath, file);
+
+ const raw = await fs.readFile(fullPath, "utf8");
+ const { data, content } = matter(raw);
+
+ items.push({
+ slug,
+ frontmatter: data as Record,
+ content: content ?? "",
+ type,
+ });
+ }
+ }
+
+ return items;
+}
diff --git a/scripts/search/extract-posts.ts b/scripts/search/extract-posts.ts
new file mode 100644
index 00000000..42900975
--- /dev/null
+++ b/scripts/search/extract-posts.ts
@@ -0,0 +1,56 @@
+import fs from "fs/promises";
+import path from "path";
+import matter from "gray-matter";
+
+export interface RawPost {
+ slug: string;
+ frontmatter: Record;
+ teaserImage?: string,
+ content: string;
+}
+
+const POSTS_DIR = path.join(process.cwd(), "contents", "post");
+
+function getTeaserImage(
+ meta: Record & { teaser_image?: string },
+ content: string
+): string | undefined {
+ if (meta.teaser_image) return meta.teaser_image;
+
+ const marked = content.match(/!\[.*?\]\((.*?)\).*?\{.*?teaser.*?\}/);
+ if (marked) return marked[1];
+
+ const firstImage = content.match(/!\[.*?\]\((.*?)\)/);
+ if (firstImage) return firstImage[1];
+
+ const yt = content.match(/youtube\.com\/watch\?v=([A-Za-z0-9_-]+)/);
+ if (yt) return `https://img.youtube.com/vi/${yt[1]}/hqdefault.jpg`;
+
+ return undefined;
+}
+
+export async function extractPosts(): Promise {
+ const files = await fs.readdir(POSTS_DIR);
+
+ const markdownFiles = files.filter((file) => file.endsWith(".md"));
+
+ const posts: RawPost[] = [];
+
+ for (const file of markdownFiles) {
+ const slug = file.replace(/\.md$/, "");
+ const fullPath = path.join(POSTS_DIR, file);
+
+ const raw = await fs.readFile(fullPath, "utf8");
+ const { data, content } = matter(raw);
+ const teaserImage = getTeaserImage(data, content);
+
+ posts.push({
+ slug,
+ frontmatter: data as Record,
+ teaserImage,
+ content: content ?? "",
+ });
+ }
+
+ return posts;
+}
diff --git a/scripts/search/normalize-markdown.ts b/scripts/search/normalize-markdown.ts
new file mode 100644
index 00000000..288dea21
--- /dev/null
+++ b/scripts/search/normalize-markdown.ts
@@ -0,0 +1,61 @@
+import { unified } from "unified";
+import remarkParse from "remark-parse";
+import { visit } from "unist-util-visit";
+import { toString } from "mdast-util-to-string";
+import type { Node } from "unist";
+export interface NormalizedMarkdown {
+ headings: string[];
+ text: string;
+ snippet: string;
+}
+
+function generateSnippet(text: string, maxLength = 180): string {
+ if (!text) return "";
+
+ if (text.length <= maxLength) return text;
+
+ const trimmed = text.slice(0, maxLength);
+ const lastSpace = trimmed.lastIndexOf(" ");
+
+ return trimmed.slice(0, lastSpace > 0 ? lastSpace : maxLength) + "...";
+}
+
+export function normalizeMarkdown(markdown: string): NormalizedMarkdown {
+ const tree = unified().use(remarkParse).parse(markdown);
+
+ const headings: string[] = [];
+ const textParts: string[] = [];
+
+ visit(tree, (node: Node) => {
+ if (node.type === "heading" && "depth" in node && (node.depth as number) <= 3) {
+ const headingText = toString(node).trim();
+ if (headingText) {
+ headings.push(headingText);
+ }
+ }
+
+ if (node.type === "code" || node.type === "inlineCode") {
+ return;
+ }
+
+ if (node.type === "paragraph") {
+ const paragraphText = toString(node).trim();
+ if (paragraphText) {
+ textParts.push(paragraphText);
+ }
+ }
+ });
+
+ const normalizedText = textParts
+ .join(" ")
+ .replace(/\s+/g, " ")
+ .trim();
+
+ const snippet = generateSnippet(normalizedText);
+
+ return {
+ headings,
+ text: normalizedText,
+ snippet,
+ };
+}
\ No newline at end of file
diff --git a/tailwind.config.ts b/tailwind.config.ts
new file mode 100644
index 00000000..5befa626
--- /dev/null
+++ b/tailwind.config.ts
@@ -0,0 +1,134 @@
+import { Config } from "tailwindcss";
+import { fontFamily } from "tailwindcss/defaultTheme";
+import tailwindAnimation from "tailwindcss-animate";
+import tailwindTypography from "@tailwindcss/typography";
+
+const config: Config = {
+ // Use class-based dark mode so the site defaults to light unless the
+ // user explicitly chooses dark (stored in localStorage).
+ darkMode: ["class"],
+ content: ["app/**/*.{ts,tsx}", "components/**/*.{ts,tsx}"],
+ theme: {
+ container: {
+ center: true,
+ padding: "2rem",
+ screens: {
+ "2xl": "1400px",
+ },
+ },
+ extend: {
+ colors: {
+ border: "hsl(var(--border))",
+ input: "hsl(var(--input))",
+ ring: "hsl(var(--ring))",
+ background: "hsl(var(--background))",
+ foreground: "hsl(var(--foreground))",
+ brand: {
+ cyan: "#0092ca",
+ blue: "#3b82f6",
+ lightBlue: "#60a5fa",
+ darkBlue: "#1e3a5f",
+ legacyDark: "#222831",
+ },
+ primary: {
+ DEFAULT: "hsl(var(--primary))",
+ foreground: "hsl(var(--primary-foreground))",
+ },
+ secondary: {
+ DEFAULT: "hsl(var(--secondary))",
+ foreground: "hsl(var(--secondary-foreground))",
+ },
+ destructive: {
+ DEFAULT: "hsl(var(--destructive))",
+ foreground: "hsl(var(--destructive-foreground))",
+ },
+ muted: {
+ DEFAULT: "hsl(var(--muted))",
+ foreground: "hsl(var(--muted-foreground))",
+ },
+ accent: {
+ DEFAULT: "hsl(var(--accent))",
+ foreground: "hsl(var(--accent-foreground))",
+ },
+ popover: {
+ DEFAULT: "hsl(var(--popover))",
+ foreground: "hsl(var(--popover-foreground))",
+ },
+ card: {
+ DEFAULT: "hsl(var(--card))",
+ foreground: "hsl(var(--card-foreground))",
+ },
+ },
+ borderRadius: {
+ lg: "var(--radius)",
+ md: "calc(var(--radius) - 2px)",
+ sm: "calc(var(--radius) - 4px)",
+ },
+ fontFamily: {
+ sans: ["var(--font-sans)", ...fontFamily.sans],
+ },
+ keyframes: {
+ "accordion-down": {
+ from: { height: "0" },
+ to: { height: "var(--radix-accordion-content-height)" },
+ },
+ "accordion-up": {
+ from: { height: "var(--radix-accordion-content-height)" },
+ to: { height: "0" },
+ },
+ "glow-pulse": {
+ "0%, 100%": { opacity: "0.4" },
+ "50%": { opacity: "0.8" },
+ },
+ },
+ animation: {
+ "accordion-down": "accordion-down 0.2s ease-out",
+ "accordion-up": "accordion-up 0.2s ease-out",
+ "glow-pulse": "glow-pulse 3s ease-in-out infinite",
+ },
+ typography: (theme: (arg0: string) => unknown) => ({
+ invert: {
+ css: {
+ "--tw-prose-body": theme("colors.gray.300"),
+ "--tw-prose-headings": theme("colors.white"),
+ "--tw-prose-links": theme("colors.blue.400"),
+ "--tw-prose-links-hover": theme("colors.blue.300"),
+ "--tw-prose-underline": theme("colors.blue.400"),
+ "--tw-prose-underline-hover": theme("colors.blue.300"),
+ "--tw-prose-bold": theme("colors.white"),
+ "--tw-prose-counters": theme("colors.gray.400"),
+ "--tw-prose-bullets": theme("colors.gray.400"),
+ "--tw-prose-hr": theme("colors.gray.700"),
+ "--tw-prose-quote-borders": theme("colors.gray.700"),
+ "--tw-prose-captions": theme("colors.gray.400"),
+ "--tw-prose-code": theme("colors.white"),
+ "--tw-prose-pre-code": theme("colors.gray.300"),
+ "--tw-prose-pre-bg": "rgb(0 0 0 / 50%)",
+ "--tw-prose-pre-border": theme("colors.gray.700"),
+ "--tw-prose-th-borders": theme("colors.gray.600"),
+ "--tw-prose-td-borders": theme("colors.gray.700"),
+ },
+ },
+ DEFAULT: {
+ css: {
+ a: {
+ color: "var(--tw-prose-links)",
+ "&:hover": {
+ color: "var(--tw-prose-links-hover)",
+ },
+ },
+ "code::before": {
+ content: '""',
+ },
+ "code::after": {
+ content: '""',
+ },
+ },
+ },
+ }),
+ },
+ },
+ plugins: [tailwindAnimation, tailwindTypography],
+};
+
+export default config;
diff --git a/test/_config.yml b/test/_config.yml
deleted file mode 100644
index d5a3ff0a..00000000
--- a/test/_config.yml
+++ /dev/null
@@ -1,323 +0,0 @@
-# Copyright 2019 OpenPrinting
-
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# Welcome to Jekyll!
-#
-# This config file is meant for settings that affect your entire site, values
-# which you are expected to set up once and rarely need to edit after that.
-# For technical reasons, this file is *NOT* reloaded automatically when you use
-# `jekyll serve`. If you change this file, please restart the server process.
-
-theme : "minimal-mistakes-jekyll"
-minimal_mistakes_skin : "mint" # "air", "aqua", "contrast", "dark", "dirt", "neon", "mint", "plum", "sunrise"
-
-# Site Settings
-locale : "en-US"
-title : "Open "
-title_separator : "-"
-name : "Your Name"
-description : "Minimal Mistakes theme test."
-url : # the base hostname & protocol for your site e.g. "https://mmistakes.github.io"
-baseurl : "/test"
-repository : # GitHub username/repo-name e.g. "mmistakes/minimal-mistakes"
-teaser : # path of fallback teaser image, e.g. "/assets/images/500x300.png"
-# breadcrumbs : false # true, false (default)
-words_per_minute : 200
-comments:
- provider : # false (default), "disqus", "discourse", "facebook", "google-plus", "staticman", "utterances", "custom"
- disqus:
- shortname : # https://help.disqus.com/customer/portal/articles/466208-what-s-a-shortname-
- discourse:
- server : # https://meta.discourse.org/t/embedding-discourse-comments-via-javascript/31963 , e.g.: meta.discourse.org
- facebook:
- # https://developers.facebook.com/docs/plugins/comments
- appid :
- num_posts : # 5 (default)
- colorscheme : # "light" (default), "dark"
- utterances:
- theme : # "github-light" (default), "github-dark"
-staticman:
- allowedFields : ['name', 'email', 'url', 'message']
- branch : # "master", "gh-pages"
- commitMessage : "New comment by {fields.name}"
- filename : comment-{@timestamp}
- format : "yml"
- moderation : true
- path : "_data/comments/{options.slug}"
- requiredFields : ['name', 'email', 'message']
- transforms:
- email : "md5"
- generatedFields:
- date:
- type : "date"
- options:
- format : "iso8601" # "iso8601" (default), "timestamp-seconds", "timestamp-milliseconds"
- endpoint : # URL of your own deployment with trailing slash, will fallback to the public instance
-atom_feed:
- path : # blank (default) uses feed.xml
-search : true # true, false (default)
-search_full_content : true # true, false (default)
-search_provider : "algolia"
-algolia:
- application_id : "QB6HVGBSBA"
- index_name : "dev_minimal-mistakes"
- search_only_api_key : "9d5014e5bbc77372547bce778dfa5663"
- powered_by : true
-
-# SEO Related
-google_site_verification :
-bing_site_verification :
-yandex_site_verification :
-
-# Social Sharing
-twitter:
- username : "mmistakes"
-facebook:
- username :
- app_id :
- publisher :
-og_image : "/assets/images/bio-photo.jpg"
-# For specifying social profiles
-# - https://developers.google.com/structured-data/customize/social-profiles
-social:
- type : # Person or Organization (defaults to Person)
- name : # If the user or organization name differs from the site's name
- links: # An array of links to social media profiles
-
-# Analytics
-analytics:
- provider : false # false (default), "google", "google-universal", "custom"
- google:
- tracking_id :
-
-
-# Site Author
-author:
- name : "Your Name"
- avatar : "/assets/images/bio-photo.jpg"
- bio : "I am an amazing person."
- location : "Somewhere"
- links:
- - label: "Your Website"
- icon: "fas fa-fw fa-link"
- url: "https://your-site.com"
- - label: "Twitter"
- icon: "fab fa-fw fa-twitter-square"
- url: "https://twitter.com/"
- - label: "GitHub"
- icon: "fab fa-fw fa-github"
- url: "https://github.com/"
- - label: "Instagram"
- icon: "fab fa-fw fa-instagram"
- url: "https://instagram.com/"
-
-
-# Site Footer
-footer:
- links:
- - label: "Twitter"
- icon: "fab fa-fw fa-twitter-square"
- url: "https://twitter.com/"
- - label: "GitHub"
- icon: "fab fa-fw fa-github"
- url: "https://github.com/"
- - label: "Instagram"
- icon: "fab fa-fw fa-instagram"
- url: "https://instagram.com/"
-
-
-# Reading Files
-include:
- - .htaccess
- - _pages
-exclude:
- - "*.sublime-project"
- - "*.sublime-workspace"
- - vendor
- - .asset-cache
- - .bundle
- - .jekyll-assets-cache
- - .sass-cache
- - assets/js/plugins
- - assets/js/_main.js
- - assets/js/vendor
- - Capfile
- - CHANGELOG
- - config
- - Gemfile
- - Gruntfile.js
- - gulpfile.js
- - LICENSE
- - log
- - node_modules
- - package.json
- - Rakefile
- - README
- - tmp
-keep_files:
- - .git
- - .svn
-encoding: "utf-8"
-markdown_ext: "markdown,mkdown,mkdn,mkd,md"
-
-# Liquid
-strict_front_matter: true
-liquid:
- error_mode: strict
-
-# Conversion
-markdown: kramdown
-highlighter: rouge
-lsi: false
-excerpt_separator: "\n\n"
-incremental: false
-
-
-# Markdown Processing
-kramdown:
- input: GFM
- hard_wrap: false
- auto_ids: true
- footnote_nr: 1
- entity_output: as_char
- toc_levels: 1..6
- smart_quotes: lsquo,rsquo,ldquo,rdquo
- enable_coderay: false
-
-
-# Sass/SCSS
-sass:
- sass_dir: _sass
- style: compressed # http://sass-lang.com/documentation/file.SASS_REFERENCE.html#output_style
-
-
-# Outputting
-permalink: /:categories/:title/
-paginate: 5 # amount of posts to show
-paginate_path: /page:num/
-timezone: # http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
-
-
-# Plugins (previously gems:)
-plugins:
- - jekyll-paginate
- - jekyll-sitemap
- - jekyll-gist
- - jekyll-feed
- - jemoji
- - jekyll-include-cache
-
-# mimic GitHub Pages with --safe
-whitelist:
- - jekyll-paginate
- - jekyll-sitemap
- - jekyll-gist
- - jekyll-feed
- - jemoji
- - jekyll-include-cache
-
-
-# Archives
-# Type
-# - GitHub Pages compatible archive pages built with Liquid ~> type: liquid (default)
-# - Jekyll Archives plugin archive pages ~> type: jekyll-archives
-# Path (examples)
-# - Archive page should exist at path when using Liquid method or you can
-# expect broken links (especially with breadcrumbs enabled)
-# - /tags/my-awesome-tag/index.html ~> path: /tags/
-# - path: /categories/
-# - path: /
-category_archive:
- type: liquid
- path: /categories/
-tag_archive:
- type: liquid
- path: /tags/
-# https://github.com/jekyll/jekyll-archives
-# jekyll-archives:
-# enabled:
-# - categories
-# - tags
-# layouts:
-# category: archive-taxonomy
-# tag: archive-taxonomy
-# permalinks:
-# category: /categories/:name/
-# tag: /tags/:name/
-
-
-# HTML Compression
-# - http://jch.penibelst.de/
-compress_html:
- clippings: all
- ignore:
- envs: development
-
-
-# Collections
-collections:
- recipes:
- output: true
- permalink: /:collection/:path/
- pets:
- output: true
- permalink: /:collection/:path/
- portfolio:
- output: true
- permalink: /:collection/:path/
-
-
-# Defaults
-defaults:
- # _posts
- - scope:
- path: ""
- type: posts
- values:
- layout: single
- author_profile: true
- read_time: true
- share: true
- related: true
- # _pages
- - scope:
- path: "_pages"
- type: pages
- values:
- layout: single
- author_profile: true
- # _recipes
- - scope:
- path: ""
- type: recipes
- values:
- layout: single
- author_profile: true
- share: true
- # _pets
- - scope:
- path: ""
- type: pets
- values:
- layout: single
- author_profile: true
- share: true
- # _portfolio
- - scope:
- path: ""
- type: portfolio
- values:
- layout: single
- author_profile: false
- share: true
diff --git a/test/_data/navigation.yml b/test/_data/navigation.yml
deleted file mode 100644
index 8bfccd10..00000000
--- a/test/_data/navigation.yml
+++ /dev/null
@@ -1,69 +0,0 @@
-# Copyright 2019 OpenPrinting
-
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-# main links links
-main:
- - title: "About"
- url: https://mmistakes.github.io/minimal-mistakes/about/
- - title: "Posts"
- url: /year-archive/
- - title: "Collections"
- url: /collection-archive/
- - title: "Sitemap"
- url: /sitemap/
-
-# sidebar navigation list sample
-sidebar-sample:
- - title: "Parent Page A"
- children:
- - title: "Child Page A1"
- url: /child-page-a1/
- - title: "Child Page A2"
- url: /child-page-a2/
- - title: "Child Page A3"
- url: /child-page-a3/
- - title: "Child Page A4"
- url: /child-page-a4/
- - title: "Parent Page B"
- children:
- - title: "Child Page B1"
- url: /child-page-b1/
- - title: "Child Page B2"
- url: /child-page-b2/
- - title: "Child Page B3"
- url: /child-page-b3/
- - title: "Child Page B4"
- url: /child-page-b4/
- - title: "Child Page B5"
- url: /child-page-b5/
- - title: "Parent Page C"
- children:
- - title: "Child Page C1"
- url: /child-page-c1/
- - title: "Child Page C2"
- url: /child-page-c2/
- - title: "Child Page C3"
- url: /child-page-c3/
- - title: "Child Page C4"
- url: /child-page-c4/
- - title: "Child Page C5"
- url: /child-page-c5/
- - title: "Parent Page D"
- children:
- - title: "Child Page D1"
- url: /child-page-d1/
- - title: "Child Page D2"
- url: /child-page-d2/
- - title: "Child Page D3 (External)"
- url: https://your-domain.com
\ No newline at end of file
diff --git a/test/_pages/splash-page.md b/test/_pages/splash-page.md
deleted file mode 100644
index ed027c2d..00000000
--- a/test/_pages/splash-page.md
+++ /dev/null
@@ -1,80 +0,0 @@
----
-# Copyright 2019 OpenPrinting
-
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-
-# http://www.apache.org/licenses/LICENSE-2.0
-
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-title: "Open Printing"
-layout: splash
-permalink: /splash-page/
-date: 2016-03-23T11:48:41-04:00
-header:
- overlay_color: "#000"
- overlay_filter: "0.5"
- overlay_image: /assets/images/OP/rotation_pantone.jpg
- actions:
- - label: "Learn More"
- url: "/terms/"
-excerpt: "Make printing just work!"
-intro:
- - excerpt: 'We have resources to help with printing under free operating systems like GNU/Linux and the BSDs or under commercial UNIX-like systems such as Solaris and Mac OS X.'
-feature_row:
- - image_path: assets/images/unsplash-gallery-image-1-th.jpg
- image_caption: "Image courtesy of [Unsplash](https://unsplash.com/)"
- alt: "placeholder image 1"
- title: "Placeholder 1"
- excerpt: "This is some sample content that goes here with **Markdown** formatting."
- - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
- alt: "placeholder image 2"
- title: "Placeholder 2"
- excerpt: "This is some sample content that goes here with **Markdown** formatting."
- url: "#test-link"
- btn_label: "Read More"
- btn_class: "btn--primary"
- - image_path: /assets/images/unsplash-gallery-image-3-th.jpg
- title: "Placeholder 3"
- excerpt: "This is some sample content that goes here with **Markdown** formatting."
-feature_row2:
- - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
- alt: "placeholder image 2"
- title: "Placeholder Image Left Aligned"
- excerpt: 'This is some sample content that goes here with **Markdown** formatting. Left aligned with `type="left"`'
- url: "#test-link"
- btn_label: "Read More"
- btn_class: "btn--primary"
-feature_row3:
- - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
- alt: "placeholder image 2"
- title: "Placeholder Image Right Aligned"
- excerpt: 'This is some sample content that goes here with **Markdown** formatting. Right aligned with `type="right"`'
- url: "#test-link"
- btn_label: "Read More"
- btn_class: "btn--primary"
-feature_row4:
- - image_path: /assets/images/unsplash-gallery-image-2-th.jpg
- alt: "placeholder image 2"
- title: "Placeholder Image Center Aligned"
- excerpt: 'This is some sample content that goes here with **Markdown** formatting. Centered with `type="center"`'
- url: "#test-link"
- btn_label: "Read More"
- btn_class: "btn--primary"
----
-
-{% include feature_row id="intro" type="center" %}
-
-{% include feature_row %}
-
-{% include feature_row id="feature_row2" type="left" %}
-
-{% include feature_row id="feature_row3" type="right" %}
-
-{% include feature_row id="feature_row4" type="center" %}
\ No newline at end of file
diff --git a/test/assets/images/OP/HP-Linux-Foundation.jpg b/test/assets/images/OP/HP-Linux-Foundation.jpg
deleted file mode 100644
index bd972465..00000000
Binary files a/test/assets/images/OP/HP-Linux-Foundation.jpg and /dev/null differ
diff --git a/test/assets/images/OP/group.jpg b/test/assets/images/OP/group.jpg
deleted file mode 100644
index 6768bc21..00000000
Binary files a/test/assets/images/OP/group.jpg and /dev/null differ
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 00000000..7a452cc2
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,42 @@
+{
+ "compilerOptions": {
+ "target": "ES2017",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "skipLibCheck": true,
+ "strict": true,
+ "noEmit": true,
+ "allowImportingTsExtensions": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ],
+ "paths": {
+ "@/*": [
+ "./*"
+ ]
+ },
+ "allowJs": true
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts"
+ ],
+ "exclude": [
+ "node_modules",
+ "out"
+ ]
+}
diff --git a/update-printer-list.sh b/update-printer-list.sh
deleted file mode 100755
index 6ca05e59..00000000
--- a/update-printer-list.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/sh
-#
-# Script to update the list of "driverless" printers...
-#
-# Copyright © 2022 by Michael R Sweet
-#
-# Needs curl and xargs...
-#
-
-# The "driverless.json" file is an array of JSON objects of the form:
-#
-# { "model":"Model Name", "airprt":"0/1", "ippeve":"0/1" }
-#
-# We use curl to get the current IPP Everywhere and AirPrint models, and
-# generate a composite list of driverless printers.
-#
-# Should Mopria start publishing an updated printer list, we can include
-# them, too...
-AIRPRT="/tmp/airprint.json"
-DRIVERLESS="assets/json/driverless.json"
-IPPEVE="/tmp/ipp-everywhere.json"
-
-if test $# = 0; then
- # Generate the driverless.json file...
- # IPP Everywhere list
- echo "Getting IPP Everywhere printer list..."
- curl -s https://www.pwg.org/printers/printers.json >$IPPEVE
-
- # AirPrint list (should be a superset of all)
- echo "Getting AirPrint printer list..."
- curl -s https://support.apple.com/en-ca/HT201311 | grep '^' | grep -v ' <' | sed -e '1,$s/ /"/g' -e '1,$s/<\/li>/"/g' >$AIRPRT
-
- # Loop through the AirPrint printers...
- echo "Generating driverless.json\c"
- echo "[{\"model\":\"_dummy_\"}\c" >$DRIVERLESS
-
- xargs -n 1 ./update-printer-list.sh <$AIRPRT
-
- # End of array...
- echo "" >>$DRIVERLESS
- echo "]" >>$DRIVERLESS
-
- echo "done."
-
- # Clean up...
- rm $AIRPRT
- rm $IPPEVE
-else
- # Write a single printer entry using the model name on the command-line...
- echo ".\c"
- printer="$*"
-
- # See if the printer is in the IPP Everywhere list
- if grep -q "$printer" $IPPEVE; then
- ippeve="1"
- else
- ippeve="0"
- fi
-
- # Write the entry...
- echo "," >>$DRIVERLESS
- echo "{\"model\":\"$printer\",\"airprt\":\"1\",\"ippeve\":\"$ippeve\"}\c" >>$DRIVERLESS
-fi
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 00000000..765c8428
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,6646 @@
+# This file is generated by running "yarn install" inside your project.
+# Manual changes might be lost - proceed with caution!
+
+__metadata:
+ version: 8
+ cacheKey: 10c0
+
+"@alloc/quick-lru@npm:^5.2.0":
+ version: 5.2.0
+ resolution: "@alloc/quick-lru@npm:5.2.0"
+ checksum: 10c0/7b878c48b9d25277d0e1a9b8b2f2312a314af806b4129dc902f2bc29ab09b58236e53964689feec187b28c80d2203aff03829754773a707a8a5987f1b7682d92
+ languageName: node
+ linkType: hard
+
+"@emnapi/core@npm:^1.4.3":
+ version: 1.8.1
+ resolution: "@emnapi/core@npm:1.8.1"
+ dependencies:
+ "@emnapi/wasi-threads": "npm:1.1.0"
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/2c242f4b49779bac403e1cbcc98edacdb1c8ad36562408ba9a20663824669e930bc8493be46a2522d9dc946b8d96cd7073970bae914928c7671b5221c85b432e
+ languageName: node
+ linkType: hard
+
+"@emnapi/runtime@npm:^1.2.0, @emnapi/runtime@npm:^1.4.3":
+ version: 1.8.1
+ resolution: "@emnapi/runtime@npm:1.8.1"
+ dependencies:
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/f4929d75e37aafb24da77d2f58816761fe3f826aad2e37fa6d4421dac9060cbd5098eea1ac3c9ecc4526b89deb58153852fa432f87021dc57863f2ff726d713f
+ languageName: node
+ linkType: hard
+
+"@emnapi/wasi-threads@npm:1.1.0":
+ version: 1.1.0
+ resolution: "@emnapi/wasi-threads@npm:1.1.0"
+ dependencies:
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/e6d54bf2b1e64cdd83d2916411e44e579b6ae35d5def0dea61a3c452d9921373044dff32a8b8473ae60c80692bdc39323e98b96a3f3d87ba6886b24dd0ef7ca1
+ languageName: node
+ linkType: hard
+
+"@esbuild/aix-ppc64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/aix-ppc64@npm:0.27.3"
+ conditions: os=aix & cpu=ppc64
+ languageName: node
+ linkType: hard
+
+"@esbuild/android-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/android-arm64@npm:0.27.3"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/android-arm@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/android-arm@npm:0.27.3"
+ conditions: os=android & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@esbuild/android-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/android-x64@npm:0.27.3"
+ conditions: os=android & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/darwin-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/darwin-arm64@npm:0.27.3"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/darwin-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/darwin-x64@npm:0.27.3"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/freebsd-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/freebsd-arm64@npm:0.27.3"
+ conditions: os=freebsd & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/freebsd-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/freebsd-x64@npm:0.27.3"
+ conditions: os=freebsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-arm64@npm:0.27.3"
+ conditions: os=linux & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-arm@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-arm@npm:0.27.3"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-ia32@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-ia32@npm:0.27.3"
+ conditions: os=linux & cpu=ia32
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-loong64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-loong64@npm:0.27.3"
+ conditions: os=linux & cpu=loong64
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-mips64el@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-mips64el@npm:0.27.3"
+ conditions: os=linux & cpu=mips64el
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-ppc64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-ppc64@npm:0.27.3"
+ conditions: os=linux & cpu=ppc64
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-riscv64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-riscv64@npm:0.27.3"
+ conditions: os=linux & cpu=riscv64
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-s390x@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-s390x@npm:0.27.3"
+ conditions: os=linux & cpu=s390x
+ languageName: node
+ linkType: hard
+
+"@esbuild/linux-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/linux-x64@npm:0.27.3"
+ conditions: os=linux & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/netbsd-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/netbsd-arm64@npm:0.27.3"
+ conditions: os=netbsd & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/netbsd-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/netbsd-x64@npm:0.27.3"
+ conditions: os=netbsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/openbsd-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/openbsd-arm64@npm:0.27.3"
+ conditions: os=openbsd & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/openbsd-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/openbsd-x64@npm:0.27.3"
+ conditions: os=openbsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/openharmony-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/openharmony-arm64@npm:0.27.3"
+ conditions: os=openharmony & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/sunos-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/sunos-x64@npm:0.27.3"
+ conditions: os=sunos & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@esbuild/win32-arm64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/win32-arm64@npm:0.27.3"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@esbuild/win32-ia32@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/win32-ia32@npm:0.27.3"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
+"@esbuild/win32-x64@npm:0.27.3":
+ version: 0.27.3
+ resolution: "@esbuild/win32-x64@npm:0.27.3"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@eslint-community/eslint-utils@npm:^4.8.0, @eslint-community/eslint-utils@npm:^4.9.1":
+ version: 4.9.1
+ resolution: "@eslint-community/eslint-utils@npm:4.9.1"
+ dependencies:
+ eslint-visitor-keys: "npm:^3.4.3"
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+ checksum: 10c0/dc4ab5e3e364ef27e33666b11f4b86e1a6c1d7cbf16f0c6ff87b1619b3562335e9201a3d6ce806221887ff780ec9d828962a290bb910759fd40a674686503f02
+ languageName: node
+ linkType: hard
+
+"@eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.12.2":
+ version: 4.12.2
+ resolution: "@eslint-community/regexpp@npm:4.12.2"
+ checksum: 10c0/fddcbc66851b308478d04e302a4d771d6917a0b3740dc351513c0da9ca2eab8a1adf99f5e0aa7ab8b13fa0df005c81adeee7e63a92f3effd7d367a163b721c2d
+ languageName: node
+ linkType: hard
+
+"@eslint/config-array@npm:^0.21.1":
+ version: 0.21.1
+ resolution: "@eslint/config-array@npm:0.21.1"
+ dependencies:
+ "@eslint/object-schema": "npm:^2.1.7"
+ debug: "npm:^4.3.1"
+ minimatch: "npm:^3.1.2"
+ checksum: 10c0/2f657d4edd6ddcb920579b72e7a5b127865d4c3fb4dda24f11d5c4f445a93ca481aebdbd6bf3291c536f5d034458dbcbb298ee3b698bc6c9dd02900fe87eec3c
+ languageName: node
+ linkType: hard
+
+"@eslint/config-helpers@npm:^0.4.2":
+ version: 0.4.2
+ resolution: "@eslint/config-helpers@npm:0.4.2"
+ dependencies:
+ "@eslint/core": "npm:^0.17.0"
+ checksum: 10c0/92efd7a527b2d17eb1a148409d71d80f9ac160b565ac73ee092252e8bf08ecd08670699f46b306b94f13d22e88ac88a612120e7847570dd7cdc72f234d50dcb4
+ languageName: node
+ linkType: hard
+
+"@eslint/core@npm:^0.17.0":
+ version: 0.17.0
+ resolution: "@eslint/core@npm:0.17.0"
+ dependencies:
+ "@types/json-schema": "npm:^7.0.15"
+ checksum: 10c0/9a580f2246633bc752298e7440dd942ec421860d1946d0801f0423830e67887e4aeba10ab9a23d281727a978eb93d053d1922a587d502942a713607f40ed704e
+ languageName: node
+ linkType: hard
+
+"@eslint/eslintrc@npm:^3, @eslint/eslintrc@npm:^3.3.1":
+ version: 3.3.4
+ resolution: "@eslint/eslintrc@npm:3.3.4"
+ dependencies:
+ ajv: "npm:^6.14.0"
+ debug: "npm:^4.3.2"
+ espree: "npm:^10.0.1"
+ globals: "npm:^14.0.0"
+ ignore: "npm:^5.2.0"
+ import-fresh: "npm:^3.2.1"
+ js-yaml: "npm:^4.1.1"
+ minimatch: "npm:^3.1.3"
+ strip-json-comments: "npm:^3.1.1"
+ checksum: 10c0/1fe481a6af03c09be8d92d67e2bbf693b7522b0591934bfb44bd13e297649b13e4ec5e3fc70b02e4497a17c1afbfa22f5bf5efa4fc06a24abace8e5d097fec8c
+ languageName: node
+ linkType: hard
+
+"@eslint/js@npm:9.39.3":
+ version: 9.39.3
+ resolution: "@eslint/js@npm:9.39.3"
+ checksum: 10c0/df1c70d6681c8daf4a3c86dfac159fcd98a73c4620c4fbe2be6caab1f30a34c7de0ad88ab0e81162376d2cde1a2eed1c32eff5f917ca369870930a51f8e818f1
+ languageName: node
+ linkType: hard
+
+"@eslint/object-schema@npm:^2.1.7":
+ version: 2.1.7
+ resolution: "@eslint/object-schema@npm:2.1.7"
+ checksum: 10c0/936b6e499853d1335803f556d526c86f5fe2259ed241bc665000e1d6353828edd913feed43120d150adb75570cae162cf000b5b0dfc9596726761c36b82f4e87
+ languageName: node
+ linkType: hard
+
+"@eslint/plugin-kit@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "@eslint/plugin-kit@npm:0.4.1"
+ dependencies:
+ "@eslint/core": "npm:^0.17.0"
+ levn: "npm:^0.4.1"
+ checksum: 10c0/51600f78b798f172a9915dffb295e2ffb44840d583427bc732baf12ecb963eb841b253300e657da91d890f4b323d10a1bd12934bf293e3018d8bb66fdce5217b
+ languageName: node
+ linkType: hard
+
+"@giscus/react@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "@giscus/react@npm:3.1.0"
+ dependencies:
+ giscus: "npm:^1.6.0"
+ peerDependencies:
+ react: ^16 || ^17 || ^18 || ^19
+ react-dom: ^16 || ^17 || ^18 || ^19
+ checksum: 10c0/1347b3a729917a7c134dbf38ff4e15189d37447db3453dfbcb0a76b58f6044a32040d197a0744a093682bcefea14e27b8167dfe30f55d79f3f415054092104c9
+ languageName: node
+ linkType: hard
+
+"@humanfs/core@npm:^0.19.1":
+ version: 0.19.1
+ resolution: "@humanfs/core@npm:0.19.1"
+ checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67
+ languageName: node
+ linkType: hard
+
+"@humanfs/node@npm:^0.16.6":
+ version: 0.16.7
+ resolution: "@humanfs/node@npm:0.16.7"
+ dependencies:
+ "@humanfs/core": "npm:^0.19.1"
+ "@humanwhocodes/retry": "npm:^0.4.0"
+ checksum: 10c0/9f83d3cf2cfa37383e01e3cdaead11cd426208e04c44adcdd291aa983aaf72d7d3598844d2fe9ce54896bb1bf8bd4b56883376611c8905a19c44684642823f30
+ languageName: node
+ linkType: hard
+
+"@humanwhocodes/module-importer@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "@humanwhocodes/module-importer@npm:1.0.1"
+ checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529
+ languageName: node
+ linkType: hard
+
+"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2":
+ version: 0.4.3
+ resolution: "@humanwhocodes/retry@npm:0.4.3"
+ checksum: 10c0/3775bb30087d4440b3f7406d5a057777d90e4b9f435af488a4923ef249e93615fb78565a85f173a186a076c7706a81d0d57d563a2624e4de2c5c9c66c486ce42
+ languageName: node
+ linkType: hard
+
+"@img/sharp-darwin-arm64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-darwin-arm64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-darwin-arm64": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-darwin-arm64":
+ optional: true
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-darwin-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-darwin-x64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-darwin-x64": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-darwin-x64":
+ optional: true
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-darwin-arm64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-darwin-arm64@npm:1.0.4"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-darwin-x64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-darwin-x64@npm:1.0.4"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-arm64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linux-arm64@npm:1.0.4"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-arm@npm:1.0.5":
+ version: 1.0.5
+ resolution: "@img/sharp-libvips-linux-arm@npm:1.0.5"
+ conditions: os=linux & cpu=arm & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-s390x@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linux-s390x@npm:1.0.4"
+ conditions: os=linux & cpu=s390x & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linux-x64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linux-x64@npm:1.0.4"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linuxmusl-arm64@npm:1.0.4"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-libvips-linuxmusl-x64@npm:1.0.4":
+ version: 1.0.4
+ resolution: "@img/sharp-libvips-linuxmusl-x64@npm:1.0.4"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-arm64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-arm64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-arm64": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-arm64":
+ optional: true
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-arm@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-arm@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-arm": "npm:1.0.5"
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-arm":
+ optional: true
+ conditions: os=linux & cpu=arm & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-s390x@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-s390x@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-s390x": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-s390x":
+ optional: true
+ conditions: os=linux & cpu=s390x & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linux-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linux-x64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linux-x64": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-linux-x64":
+ optional: true
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linuxmusl-arm64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linuxmusl-arm64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-linuxmusl-arm64":
+ optional: true
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-linuxmusl-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-linuxmusl-x64@npm:0.33.5"
+ dependencies:
+ "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4"
+ dependenciesMeta:
+ "@img/sharp-libvips-linuxmusl-x64":
+ optional: true
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@img/sharp-wasm32@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-wasm32@npm:0.33.5"
+ dependencies:
+ "@emnapi/runtime": "npm:^1.2.0"
+ conditions: cpu=wasm32
+ languageName: node
+ linkType: hard
+
+"@img/sharp-win32-ia32@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-win32-ia32@npm:0.33.5"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
+"@img/sharp-win32-x64@npm:0.33.5":
+ version: 0.33.5
+ resolution: "@img/sharp-win32-x64@npm:0.33.5"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@isaacs/fs-minipass@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "@isaacs/fs-minipass@npm:4.0.1"
+ dependencies:
+ minipass: "npm:^7.0.4"
+ checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2
+ languageName: node
+ linkType: hard
+
+"@jridgewell/gen-mapping@npm:^0.3.2":
+ version: 0.3.13
+ resolution: "@jridgewell/gen-mapping@npm:0.3.13"
+ dependencies:
+ "@jridgewell/sourcemap-codec": "npm:^1.5.0"
+ "@jridgewell/trace-mapping": "npm:^0.3.24"
+ checksum: 10c0/9a7d65fb13bd9aec1fbab74cda08496839b7e2ceb31f5ab922b323e94d7c481ce0fc4fd7e12e2610915ed8af51178bdc61e168e92a8c8b8303b030b03489b13b
+ languageName: node
+ linkType: hard
+
+"@jridgewell/resolve-uri@npm:^3.1.0":
+ version: 3.1.2
+ resolution: "@jridgewell/resolve-uri@npm:3.1.2"
+ checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e
+ languageName: node
+ linkType: hard
+
+"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0":
+ version: 1.5.5
+ resolution: "@jridgewell/sourcemap-codec@npm:1.5.5"
+ checksum: 10c0/f9e538f302b63c0ebc06eecb1dd9918dd4289ed36147a0ddce35d6ea4d7ebbda243cda7b2213b6a5e1d8087a298d5cf630fb2bd39329cdecb82017023f6081a0
+ languageName: node
+ linkType: hard
+
+"@jridgewell/trace-mapping@npm:^0.3.24":
+ version: 0.3.31
+ resolution: "@jridgewell/trace-mapping@npm:0.3.31"
+ dependencies:
+ "@jridgewell/resolve-uri": "npm:^3.1.0"
+ "@jridgewell/sourcemap-codec": "npm:^1.4.14"
+ checksum: 10c0/4b30ec8cd56c5fd9a661f088230af01e0c1a3888d11ffb6b47639700f71225be21d1f7e168048d6d4f9449207b978a235c07c8f15c07705685d16dc06280e9d9
+ languageName: node
+ linkType: hard
+
+"@lit-labs/ssr-dom-shim@npm:^1.5.0":
+ version: 1.5.1
+ resolution: "@lit-labs/ssr-dom-shim@npm:1.5.1"
+ checksum: 10c0/2b10a42db0af33a4db32b3aa34db0f546aaa6794acdfc173499e999b4423102a1c9d15687679c674f07fa799cf740b5f5641c2ca6eee5d4af30c762a1e3b8c4f
+ languageName: node
+ linkType: hard
+
+"@lit/reactive-element@npm:^2.1.0":
+ version: 2.1.2
+ resolution: "@lit/reactive-element@npm:2.1.2"
+ dependencies:
+ "@lit-labs/ssr-dom-shim": "npm:^1.5.0"
+ checksum: 10c0/557069ce6ebbbafb1140e1e0a25ce73d3501bf455cda231d42bb131baa9065c54b6b7ca1655507eede397decd7ddde16c84192cb72a07d4edf41d54e07725933
+ languageName: node
+ linkType: hard
+
+"@napi-rs/wasm-runtime@npm:^0.2.11":
+ version: 0.2.12
+ resolution: "@napi-rs/wasm-runtime@npm:0.2.12"
+ dependencies:
+ "@emnapi/core": "npm:^1.4.3"
+ "@emnapi/runtime": "npm:^1.4.3"
+ "@tybys/wasm-util": "npm:^0.10.0"
+ checksum: 10c0/6d07922c0613aab30c6a497f4df297ca7c54e5b480e00035e0209b872d5c6aab7162fc49477267556109c2c7ed1eb9c65a174e27e9b87568106a87b0a6e3ca7d
+ languageName: node
+ linkType: hard
+
+"@next/env@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/env@npm:15.1.6"
+ checksum: 10c0/b68d541abe0cf5f8bab83633680c193ff1756e73b024ffb18c146502a588e038ee705c6064d9c39609a9c0097c563162a296ae43041b34e06831f5b72a215121
+ languageName: node
+ linkType: hard
+
+"@next/eslint-plugin-next@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/eslint-plugin-next@npm:15.1.6"
+ dependencies:
+ fast-glob: "npm:3.3.1"
+ checksum: 10c0/753babd13e197304eb7a224c08a9a286aee10e316dcf86c49fe655fe9ea16659969bdbe4502429723cdf318e47fba4188ca101a5fc0d91dcad13404e773013a9
+ languageName: node
+ linkType: hard
+
+"@next/swc-darwin-arm64@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-darwin-arm64@npm:15.1.6"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-darwin-x64@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-darwin-x64@npm:15.1.6"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm64-gnu@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-linux-arm64-gnu@npm:15.1.6"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-arm64-musl@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-linux-arm64-musl@npm:15.1.6"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-x64-gnu@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-linux-x64-gnu@npm:15.1.6"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@next/swc-linux-x64-musl@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-linux-x64-musl@npm:15.1.6"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-arm64-msvc@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-win32-arm64-msvc@npm:15.1.6"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@next/swc-win32-x64-msvc@npm:15.1.6":
+ version: 15.1.6
+ resolution: "@next/swc-win32-x64-msvc@npm:15.1.6"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.scandir@npm:2.1.5":
+ version: 2.1.5
+ resolution: "@nodelib/fs.scandir@npm:2.1.5"
+ dependencies:
+ "@nodelib/fs.stat": "npm:2.0.5"
+ run-parallel: "npm:^1.1.9"
+ checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2":
+ version: 2.0.5
+ resolution: "@nodelib/fs.stat@npm:2.0.5"
+ checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d
+ languageName: node
+ linkType: hard
+
+"@nodelib/fs.walk@npm:^1.2.3":
+ version: 1.2.8
+ resolution: "@nodelib/fs.walk@npm:1.2.8"
+ dependencies:
+ "@nodelib/fs.scandir": "npm:2.1.5"
+ fastq: "npm:^1.6.0"
+ checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1
+ languageName: node
+ linkType: hard
+
+"@nolyfill/is-core-module@npm:1.0.39":
+ version: 1.0.39
+ resolution: "@nolyfill/is-core-module@npm:1.0.39"
+ checksum: 10c0/34ab85fdc2e0250879518841f74a30c276bca4f6c3e13526d2d1fe515e1adf6d46c25fcd5989d22ea056d76f7c39210945180b4859fc83b050e2da411aa86289
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-compose-refs@npm:1.1.2":
+ version: 1.1.2
+ resolution: "@radix-ui/react-compose-refs@npm:1.1.2"
+ peerDependencies:
+ "@types/react": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10c0/d36a9c589eb75d634b9b139c80f916aadaf8a68a7c1c4b8c6c6b88755af1a92f2e343457042089f04cc3f23073619d08bb65419ced1402e9d4e299576d970771
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-slot@npm:^1.1.1":
+ version: 1.2.4
+ resolution: "@radix-ui/react-slot@npm:1.2.4"
+ dependencies:
+ "@radix-ui/react-compose-refs": "npm:1.1.2"
+ peerDependencies:
+ "@types/react": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10c0/8b719bb934f1ae5ac0e37214783085c17c2f1080217caf514c1c6cc3d9ca56c7e19d25470b26da79aa6e605ab36589edaade149b76f5fc0666f1063e2fc0a0dc
+ languageName: node
+ linkType: hard
+
+"@rtsao/scc@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "@rtsao/scc@npm:1.1.0"
+ checksum: 10c0/b5bcfb0d87f7d1c1c7c0f7693f53b07866ed9fec4c34a97a8c948fb9a7c0082e416ce4d3b60beb4f5e167cbe04cdeefbf6771320f3ede059b9ce91188c409a5b
+ languageName: node
+ linkType: hard
+
+"@rushstack/eslint-patch@npm:^1.10.3":
+ version: 1.16.1
+ resolution: "@rushstack/eslint-patch@npm:1.16.1"
+ checksum: 10c0/4928bac90e52ed15e3a9a2a5bcd89e69b24141773fc3689aa6f1ee8c4d2576c4f0fe0fb1be080b7989cc44dfef7c52cf0a1940f8ded9e78a464cf4bc76e8cab3
+ languageName: node
+ linkType: hard
+
+"@swc/counter@npm:0.1.3":
+ version: 0.1.3
+ resolution: "@swc/counter@npm:0.1.3"
+ checksum: 10c0/8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356
+ languageName: node
+ linkType: hard
+
+"@swc/helpers@npm:0.5.15":
+ version: 0.5.15
+ resolution: "@swc/helpers@npm:0.5.15"
+ dependencies:
+ tslib: "npm:^2.8.0"
+ checksum: 10c0/33002f74f6f885f04c132960835fdfc474186983ea567606db62e86acd0680ca82f34647e8e610f4e1e422d1c16fce729dde22cd3b797ab1fd9061a825dabca4
+ languageName: node
+ linkType: hard
+
+"@tailwindcss/typography@npm:^0.5.16":
+ version: 0.5.19
+ resolution: "@tailwindcss/typography@npm:0.5.19"
+ dependencies:
+ postcss-selector-parser: "npm:6.0.10"
+ peerDependencies:
+ tailwindcss: "*"
+ checksum: 10c0/b9eb38e9c7adca59b55d7321275f59ea62c7d65a0c3d324c18c1c5864c69ec6e15b838e7df61e531cda62cfea08627b4343bc419bb0996182321891e5171e4d6
+ languageName: node
+ linkType: hard
+
+"@tybys/wasm-util@npm:^0.10.0":
+ version: 0.10.1
+ resolution: "@tybys/wasm-util@npm:0.10.1"
+ dependencies:
+ tslib: "npm:^2.4.0"
+ checksum: 10c0/b255094f293794c6d2289300c5fbcafbb5532a3aed3a5ffd2f8dc1828e639b88d75f6a376dd8f94347a44813fd7a7149d8463477a9a49525c8b2dcaa38c2d1e8
+ languageName: node
+ linkType: hard
+
+"@types/debug@npm:^4.0.0":
+ version: 4.1.12
+ resolution: "@types/debug@npm:4.1.12"
+ dependencies:
+ "@types/ms": "npm:*"
+ checksum: 10c0/5dcd465edbb5a7f226e9a5efd1f399c6172407ef5840686b73e3608ce135eeca54ae8037dcd9f16bdb2768ac74925b820a8b9ecc588a58ca09eca6acabe33e2f
+ languageName: node
+ linkType: hard
+
+"@types/estree-jsx@npm:^1.0.0":
+ version: 1.0.5
+ resolution: "@types/estree-jsx@npm:1.0.5"
+ dependencies:
+ "@types/estree": "npm:*"
+ checksum: 10c0/07b354331516428b27a3ab99ee397547d47eb223c34053b48f84872fafb841770834b90cc1a0068398e7c7ccb15ec51ab00ec64b31dc5e3dbefd624638a35c6d
+ languageName: node
+ linkType: hard
+
+"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6":
+ version: 1.0.8
+ resolution: "@types/estree@npm:1.0.8"
+ checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5
+ languageName: node
+ linkType: hard
+
+"@types/hast@npm:^3.0.0":
+ version: 3.0.4
+ resolution: "@types/hast@npm:3.0.4"
+ dependencies:
+ "@types/unist": "npm:*"
+ checksum: 10c0/3249781a511b38f1d330fd1e3344eed3c4e7ea8eff82e835d35da78e637480d36fad37a78be5a7aed8465d237ad0446abc1150859d0fde395354ea634decf9f7
+ languageName: node
+ linkType: hard
+
+"@types/json-schema@npm:^7.0.15":
+ version: 7.0.15
+ resolution: "@types/json-schema@npm:7.0.15"
+ checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db
+ languageName: node
+ linkType: hard
+
+"@types/json5@npm:^0.0.29":
+ version: 0.0.29
+ resolution: "@types/json5@npm:0.0.29"
+ checksum: 10c0/6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac
+ languageName: node
+ linkType: hard
+
+"@types/mdast@npm:^3.0.0":
+ version: 3.0.15
+ resolution: "@types/mdast@npm:3.0.15"
+ dependencies:
+ "@types/unist": "npm:^2"
+ checksum: 10c0/fcbf716c03d1ed5465deca60862e9691414f9c43597c288c7d2aefbe274552e1bbd7aeee91b88a02597e88a28c139c57863d0126fcf8416a95fdc681d054ee3d
+ languageName: node
+ linkType: hard
+
+"@types/mdast@npm:^4.0.0":
+ version: 4.0.4
+ resolution: "@types/mdast@npm:4.0.4"
+ dependencies:
+ "@types/unist": "npm:*"
+ checksum: 10c0/84f403dbe582ee508fd9c7643ac781ad8597fcbfc9ccb8d4715a2c92e4545e5772cbd0dbdf18eda65789386d81b009967fdef01b24faf6640f817287f54d9c82
+ languageName: node
+ linkType: hard
+
+"@types/ms@npm:*":
+ version: 2.1.0
+ resolution: "@types/ms@npm:2.1.0"
+ checksum: 10c0/5ce692ffe1549e1b827d99ef8ff71187457e0eb44adbae38fdf7b9a74bae8d20642ee963c14516db1d35fa2652e65f47680fdf679dcbde52bbfadd021f497225
+ languageName: node
+ linkType: hard
+
+"@types/node@npm:^20":
+ version: 20.19.35
+ resolution: "@types/node@npm:20.19.35"
+ dependencies:
+ undici-types: "npm:~6.21.0"
+ checksum: 10c0/e27d3e1eac4105b627fdba2d86577e603c66fc7b4ad61418d41f3898d84b2f5ff3e0c6b6d3948b34976ea91056e6359740b387edcc65ca516c3f2b5a0c0f9c6a
+ languageName: node
+ linkType: hard
+
+"@types/react-dom@npm:^19":
+ version: 19.2.3
+ resolution: "@types/react-dom@npm:19.2.3"
+ peerDependencies:
+ "@types/react": ^19.2.0
+ checksum: 10c0/b486ebe0f4e2fb35e2e108df1d8fc0927ca5d6002d5771e8a739de11239fe62d0e207c50886185253c99eb9dedfeeb956ea7429e5ba17f6693c7acb4c02f8cd1
+ languageName: node
+ linkType: hard
+
+"@types/react@npm:^19":
+ version: 19.2.14
+ resolution: "@types/react@npm:19.2.14"
+ dependencies:
+ csstype: "npm:^3.2.2"
+ checksum: 10c0/7d25bf41b57719452d86d2ac0570b659210402707313a36ee612666bf11275a1c69824f8c3ee1fdca077ccfe15452f6da8f1224529b917050eb2d861e52b59b7
+ languageName: node
+ linkType: hard
+
+"@types/trusted-types@npm:^2.0.2":
+ version: 2.0.7
+ resolution: "@types/trusted-types@npm:2.0.7"
+ checksum: 10c0/4c4855f10de7c6c135e0d32ce462419d8abbbc33713b31d294596c0cc34ae1fa6112a2f9da729c8f7a20707782b0d69da3b1f8df6645b0366d08825ca1522e0c
+ languageName: node
+ linkType: hard
+
+"@types/unist@npm:*, @types/unist@npm:^2, @types/unist@npm:^2.0.0":
+ version: 2.0.11
+ resolution: "@types/unist@npm:2.0.11"
+ checksum: 10c0/24dcdf25a168f453bb70298145eb043cfdbb82472db0bc0b56d6d51cd2e484b9ed8271d4ac93000a80da568f2402e9339723db262d0869e2bf13bc58e081768d
+ languageName: node
+ linkType: hard
+
+"@types/unist@npm:^3.0.0":
+ version: 3.0.3
+ resolution: "@types/unist@npm:3.0.3"
+ checksum: 10c0/2b1e4adcab78388e088fcc3c0ae8700f76619dbcb4741d7d201f87e2cb346bfc29a89003cfea2d76c996e1061452e14fcd737e8b25aacf949c1f2d6b2bc3dd60
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/eslint-plugin@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
+ version: 8.56.1
+ resolution: "@typescript-eslint/eslint-plugin@npm:8.56.1"
+ dependencies:
+ "@eslint-community/regexpp": "npm:^4.12.2"
+ "@typescript-eslint/scope-manager": "npm:8.56.1"
+ "@typescript-eslint/type-utils": "npm:8.56.1"
+ "@typescript-eslint/utils": "npm:8.56.1"
+ "@typescript-eslint/visitor-keys": "npm:8.56.1"
+ ignore: "npm:^7.0.5"
+ natural-compare: "npm:^1.4.0"
+ ts-api-utils: "npm:^2.4.0"
+ peerDependencies:
+ "@typescript-eslint/parser": ^8.56.1
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/8a97e777792ee3e25078884ba0a04f6732367779c9487abcdc5a2d65b224515fa6a0cf1fac1aafc52fb30f3af97f2e1c9949aadbd6ca74a0165691f95494a721
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/parser@npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0":
+ version: 8.56.1
+ resolution: "@typescript-eslint/parser@npm:8.56.1"
+ dependencies:
+ "@typescript-eslint/scope-manager": "npm:8.56.1"
+ "@typescript-eslint/types": "npm:8.56.1"
+ "@typescript-eslint/typescript-estree": "npm:8.56.1"
+ "@typescript-eslint/visitor-keys": "npm:8.56.1"
+ debug: "npm:^4.4.3"
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/61c9dab481e795b01835c00c9c7c845f1d7ea7faf3b8657fccee0f8658a65390cb5fe2b5230ae8c4241bd6e0c32aa9455a91989a492bd3bd6fec7c7d9339377a
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/project-service@npm:8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/project-service@npm:8.56.1"
+ dependencies:
+ "@typescript-eslint/tsconfig-utils": "npm:^8.56.1"
+ "@typescript-eslint/types": "npm:^8.56.1"
+ debug: "npm:^4.4.3"
+ peerDependencies:
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/ca61cde575233bc79046d73ddd330d183fb3cbb941fddc31919336317cda39885c59296e2e5401b03d9325a64a629e842fd66865705ff0d85d83ee3ee40871e8
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/scope-manager@npm:8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/scope-manager@npm:8.56.1"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.56.1"
+ "@typescript-eslint/visitor-keys": "npm:8.56.1"
+ checksum: 10c0/89cc1af2635eee23f2aa2ff87c08f88f3ad972ebf67eaacdc604a4ef4178535682bad73fd086e6f3c542e4e5d874253349af10d58291d079cc29c6c7e9831de4
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/tsconfig-utils@npm:8.56.1, @typescript-eslint/tsconfig-utils@npm:^8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/tsconfig-utils@npm:8.56.1"
+ peerDependencies:
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/d03b64d7ff19020beeefa493ae667c2e67a4547d25a3ecb9210a3a52afe980c093d772a91014bae699ee148bfb60cc659479e02bfc2946ea06954a8478ef1fe1
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/type-utils@npm:8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/type-utils@npm:8.56.1"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.56.1"
+ "@typescript-eslint/typescript-estree": "npm:8.56.1"
+ "@typescript-eslint/utils": "npm:8.56.1"
+ debug: "npm:^4.4.3"
+ ts-api-utils: "npm:^2.4.0"
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/66517aed5059ef4a29605d06a510582f934d5789ae40ad673f1f0421f8aa13ec9ba7b8caab57ae9f270afacbf13ec5359cedfe74f21ae77e9a2364929f7e7cee
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/types@npm:8.56.1, @typescript-eslint/types@npm:^8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/types@npm:8.56.1"
+ checksum: 10c0/e5a0318abddf0c4f98da3039cb10b3c0601c8601f7a9f7043630f0d622dabfe83a4cd833545ad3531fc846e46ca2874377277b392c2490dffec279d9242d827b
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/typescript-estree@npm:8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/typescript-estree@npm:8.56.1"
+ dependencies:
+ "@typescript-eslint/project-service": "npm:8.56.1"
+ "@typescript-eslint/tsconfig-utils": "npm:8.56.1"
+ "@typescript-eslint/types": "npm:8.56.1"
+ "@typescript-eslint/visitor-keys": "npm:8.56.1"
+ debug: "npm:^4.4.3"
+ minimatch: "npm:^10.2.2"
+ semver: "npm:^7.7.3"
+ tinyglobby: "npm:^0.2.15"
+ ts-api-utils: "npm:^2.4.0"
+ peerDependencies:
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/92f4421dac41be289761200dc2ed85974fa451deacb09490ae1870a25b71b97218e609a90d4addba9ded5b2abdebc265c9db7f6e9ce6d29ed20e89b8487e9618
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/utils@npm:8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/utils@npm:8.56.1"
+ dependencies:
+ "@eslint-community/eslint-utils": "npm:^4.9.1"
+ "@typescript-eslint/scope-manager": "npm:8.56.1"
+ "@typescript-eslint/types": "npm:8.56.1"
+ "@typescript-eslint/typescript-estree": "npm:8.56.1"
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
+ typescript: ">=4.8.4 <6.0.0"
+ checksum: 10c0/d9ffd9b2944a2c425e0532f71dc61e61d0a923d1a17733cf2777c2a4ae638307d12d44f63b33b6b3dc62f02f47db93ec49344ecefe17b76ee3e4fb0833325be3
+ languageName: node
+ linkType: hard
+
+"@typescript-eslint/visitor-keys@npm:8.56.1":
+ version: 8.56.1
+ resolution: "@typescript-eslint/visitor-keys@npm:8.56.1"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.56.1"
+ eslint-visitor-keys: "npm:^5.0.0"
+ checksum: 10c0/86d97905dec1af964cc177c185933d040449acf6006096497f2e0093c6a53eb92b3ac1db9eb40a5a2e8d91160f558c9734331a9280797f09f284c38978b22190
+ languageName: node
+ linkType: hard
+
+"@ungap/structured-clone@npm:^1.0.0":
+ version: 1.3.0
+ resolution: "@ungap/structured-clone@npm:1.3.0"
+ checksum: 10c0/0fc3097c2540ada1fc340ee56d58d96b5b536a2a0dab6e3ec17d4bfc8c4c86db345f61a375a8185f9da96f01c69678f836a2b57eeaa9e4b8eeafd26428e57b0a
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-android-arm-eabi@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.11.1"
+ conditions: os=android & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-android-arm64@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-android-arm64@npm:1.11.1"
+ conditions: os=android & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-darwin-arm64@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.11.1"
+ conditions: os=darwin & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-darwin-x64@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-darwin-x64@npm:1.11.1"
+ conditions: os=darwin & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-freebsd-x64@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.11.1"
+ conditions: os=freebsd & cpu=x64
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1"
+ conditions: os=linux & cpu=arm
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1"
+ conditions: os=linux & cpu=arm64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1"
+ conditions: os=linux & cpu=arm64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1"
+ conditions: os=linux & cpu=ppc64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1"
+ conditions: os=linux & cpu=riscv64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1"
+ conditions: os=linux & cpu=riscv64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1"
+ conditions: os=linux & cpu=s390x & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1"
+ conditions: os=linux & cpu=x64 & libc=glibc
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-linux-x64-musl@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.11.1"
+ conditions: os=linux & cpu=x64 & libc=musl
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-wasm32-wasi@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.11.1"
+ dependencies:
+ "@napi-rs/wasm-runtime": "npm:^0.2.11"
+ conditions: cpu=wasm32
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1"
+ conditions: os=win32 & cpu=arm64
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1"
+ conditions: os=win32 & cpu=ia32
+ languageName: node
+ linkType: hard
+
+"@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1":
+ version: 1.11.1
+ resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1"
+ conditions: os=win32 & cpu=x64
+ languageName: node
+ linkType: hard
+
+"abbrev@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "abbrev@npm:4.0.0"
+ checksum: 10c0/b4cc16935235e80702fc90192e349e32f8ef0ed151ef506aa78c81a7c455ec18375c4125414b99f84b2e055199d66383e787675f0bcd87da7a4dbd59f9eac1d5
+ languageName: node
+ linkType: hard
+
+"acorn-jsx@npm:^5.3.2":
+ version: 5.3.2
+ resolution: "acorn-jsx@npm:5.3.2"
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1
+ languageName: node
+ linkType: hard
+
+"acorn@npm:^8.15.0":
+ version: 8.16.0
+ resolution: "acorn@npm:8.16.0"
+ bin:
+ acorn: bin/acorn
+ checksum: 10c0/c9c52697227661b68d0debaf972222d4f622aa06b185824164e153438afa7b08273432ca43ea792cadb24dada1d46f6f6bb1ef8de9956979288cc1b96bf9914e
+ languageName: node
+ linkType: hard
+
+"ajv@npm:^6.12.4, ajv@npm:^6.14.0":
+ version: 6.14.0
+ resolution: "ajv@npm:6.14.0"
+ dependencies:
+ fast-deep-equal: "npm:^3.1.1"
+ fast-json-stable-stringify: "npm:^2.0.0"
+ json-schema-traverse: "npm:^0.4.1"
+ uri-js: "npm:^4.2.2"
+ checksum: 10c0/a2bc39b0555dc9802c899f86990eb8eed6e366cddbf65be43d5aa7e4f3c4e1a199d5460fd7ca4fb3d864000dbbc049253b72faa83b3b30e641ca52cb29a68c22
+ languageName: node
+ linkType: hard
+
+"ansi-styles@npm:^4.1.0":
+ version: 4.3.0
+ resolution: "ansi-styles@npm:4.3.0"
+ dependencies:
+ color-convert: "npm:^2.0.1"
+ checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041
+ languageName: node
+ linkType: hard
+
+"any-promise@npm:^1.0.0":
+ version: 1.3.0
+ resolution: "any-promise@npm:1.3.0"
+ checksum: 10c0/60f0298ed34c74fef50daab88e8dab786036ed5a7fad02e012ab57e376e0a0b4b29e83b95ea9b5e7d89df762f5f25119b83e00706ecaccb22cfbacee98d74889
+ languageName: node
+ linkType: hard
+
+"anymatch@npm:~3.1.2":
+ version: 3.1.3
+ resolution: "anymatch@npm:3.1.3"
+ dependencies:
+ normalize-path: "npm:^3.0.0"
+ picomatch: "npm:^2.0.4"
+ checksum: 10c0/57b06ae984bc32a0d22592c87384cd88fe4511b1dd7581497831c56d41939c8a001b28e7b853e1450f2bf61992dfcaa8ae2d0d161a0a90c4fb631ef07098fbac
+ languageName: node
+ linkType: hard
+
+"arg@npm:^5.0.2":
+ version: 5.0.2
+ resolution: "arg@npm:5.0.2"
+ checksum: 10c0/ccaf86f4e05d342af6666c569f844bec426595c567d32a8289715087825c2ca7edd8a3d204e4d2fb2aa4602e09a57d0c13ea8c9eea75aac3dbb4af5514e6800e
+ languageName: node
+ linkType: hard
+
+"argparse@npm:^1.0.7":
+ version: 1.0.10
+ resolution: "argparse@npm:1.0.10"
+ dependencies:
+ sprintf-js: "npm:~1.0.2"
+ checksum: 10c0/b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de
+ languageName: node
+ linkType: hard
+
+"argparse@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "argparse@npm:2.0.1"
+ checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e
+ languageName: node
+ linkType: hard
+
+"aria-query@npm:^5.3.2":
+ version: 5.3.2
+ resolution: "aria-query@npm:5.3.2"
+ checksum: 10c0/003c7e3e2cff5540bf7a7893775fc614de82b0c5dde8ae823d47b7a28a9d4da1f7ed85f340bdb93d5649caa927755f0e31ecc7ab63edfdfc00c8ef07e505e03e
+ languageName: node
+ linkType: hard
+
+"array-buffer-byte-length@npm:^1.0.1, array-buffer-byte-length@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "array-buffer-byte-length@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ is-array-buffer: "npm:^3.0.5"
+ checksum: 10c0/74e1d2d996941c7a1badda9cabb7caab8c449db9086407cad8a1b71d2604cc8abf105db8ca4e02c04579ec58b7be40279ddb09aea4784832984485499f48432d
+ languageName: node
+ linkType: hard
+
+"array-includes@npm:^3.1.6, array-includes@npm:^3.1.8, array-includes@npm:^3.1.9":
+ version: 3.1.9
+ resolution: "array-includes@npm:3.1.9"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.24.0"
+ es-object-atoms: "npm:^1.1.1"
+ get-intrinsic: "npm:^1.3.0"
+ is-string: "npm:^1.1.1"
+ math-intrinsics: "npm:^1.1.0"
+ checksum: 10c0/0235fa69078abeac05ac4250699c44996bc6f774a9cbe45db48674ce6bd142f09b327d31482ff75cf03344db4ea03eae23edb862d59378b484b47ed842574856
+ languageName: node
+ linkType: hard
+
+"array.prototype.findlast@npm:^1.2.5":
+ version: 1.2.5
+ resolution: "array.prototype.findlast@npm:1.2.5"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.2"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.0.0"
+ es-shim-unscopables: "npm:^1.0.2"
+ checksum: 10c0/ddc952b829145ab45411b9d6adcb51a8c17c76bf89c9dd64b52d5dffa65d033da8c076ed2e17091779e83bc892b9848188d7b4b33453c5565e65a92863cb2775
+ languageName: node
+ linkType: hard
+
+"array.prototype.findlastindex@npm:^1.2.6":
+ version: 1.2.6
+ resolution: "array.prototype.findlastindex@npm:1.2.6"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.9"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ es-shim-unscopables: "npm:^1.1.0"
+ checksum: 10c0/82559310d2e57ec5f8fc53d7df420e3abf0ba497935de0a5570586035478ba7d07618cb18e2d4ada2da514c8fb98a034aaf5c06caa0a57e2f7f4c4adedef5956
+ languageName: node
+ linkType: hard
+
+"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.3":
+ version: 1.3.3
+ resolution: "array.prototype.flat@npm:1.3.3"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.5"
+ es-shim-unscopables: "npm:^1.0.2"
+ checksum: 10c0/d90e04dfbc43bb96b3d2248576753d1fb2298d2d972e29ca7ad5ec621f0d9e16ff8074dae647eac4f31f4fb7d3f561a7ac005fb01a71f51705a13b5af06a7d8a
+ languageName: node
+ linkType: hard
+
+"array.prototype.flatmap@npm:^1.3.2, array.prototype.flatmap@npm:^1.3.3":
+ version: 1.3.3
+ resolution: "array.prototype.flatmap@npm:1.3.3"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.5"
+ es-shim-unscopables: "npm:^1.0.2"
+ checksum: 10c0/ba899ea22b9dc9bf276e773e98ac84638ed5e0236de06f13d63a90b18ca9e0ec7c97d622d899796e3773930b946cd2413d098656c0c5d8cc58c6f25c21e6bd54
+ languageName: node
+ linkType: hard
+
+"array.prototype.tosorted@npm:^1.1.4":
+ version: 1.1.4
+ resolution: "array.prototype.tosorted@npm:1.1.4"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.3"
+ es-errors: "npm:^1.3.0"
+ es-shim-unscopables: "npm:^1.0.2"
+ checksum: 10c0/eb3c4c4fc0381b0bf6dba2ea4d48d367c2827a0d4236a5718d97caaccc6b78f11f4cadf090736e86301d295a6aa4967ed45568f92ced51be8cbbacd9ca410943
+ languageName: node
+ linkType: hard
+
+"arraybuffer.prototype.slice@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "arraybuffer.prototype.slice@npm:1.0.4"
+ dependencies:
+ array-buffer-byte-length: "npm:^1.0.1"
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.5"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.6"
+ is-array-buffer: "npm:^3.0.4"
+ checksum: 10c0/2f2459caa06ae0f7f615003f9104b01f6435cc803e11bd2a655107d52a1781dc040532dc44d93026b694cc18793993246237423e13a5337e86b43ed604932c06
+ languageName: node
+ linkType: hard
+
+"ast-types-flow@npm:^0.0.8":
+ version: 0.0.8
+ resolution: "ast-types-flow@npm:0.0.8"
+ checksum: 10c0/f2a0ba8055353b743c41431974521e5e852a9824870cd6fce2db0e538ac7bf4da406bbd018d109af29ff3f8f0993f6a730c9eddbd0abd031fbcb29ca75c1014e
+ languageName: node
+ linkType: hard
+
+"async-function@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "async-function@npm:1.0.0"
+ checksum: 10c0/669a32c2cb7e45091330c680e92eaeb791bc1d4132d827591e499cd1f776ff5a873e77e5f92d0ce795a8d60f10761dec9ddfe7225a5de680f5d357f67b1aac73
+ languageName: node
+ linkType: hard
+
+"available-typed-arrays@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "available-typed-arrays@npm:1.0.7"
+ dependencies:
+ possible-typed-array-names: "npm:^1.0.0"
+ checksum: 10c0/d07226ef4f87daa01bd0fe80f8f310982e345f372926da2e5296aecc25c41cab440916bbaa4c5e1034b453af3392f67df5961124e4b586df1e99793a1374bdb2
+ languageName: node
+ linkType: hard
+
+"axe-core@npm:^4.10.0":
+ version: 4.11.1
+ resolution: "axe-core@npm:4.11.1"
+ checksum: 10c0/1e6997454b61c7c9a4d740f395952835dcf87f2c04fd81577217d68634d197d602c224f9e8f17b22815db4c117a2519980cfc8911fc0027c54a6d8ebca47c6a7
+ languageName: node
+ linkType: hard
+
+"axobject-query@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "axobject-query@npm:4.1.0"
+ checksum: 10c0/c470e4f95008f232eadd755b018cb55f16c03ccf39c027b941cd8820ac6b68707ce5d7368a46756db4256fbc91bb4ead368f84f7fb034b2b7932f082f6dc0775
+ languageName: node
+ linkType: hard
+
+"bail@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "bail@npm:2.0.2"
+ checksum: 10c0/25cbea309ef6a1f56214187004e8f34014eb015713ea01fa5b9b7e9e776ca88d0fdffd64143ac42dc91966c915a4b7b683411b56e14929fad16153fc026ffb8b
+ languageName: node
+ linkType: hard
+
+"balanced-match@npm:^1.0.0":
+ version: 1.0.2
+ resolution: "balanced-match@npm:1.0.2"
+ checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee
+ languageName: node
+ linkType: hard
+
+"balanced-match@npm:^4.0.2":
+ version: 4.0.4
+ resolution: "balanced-match@npm:4.0.4"
+ checksum: 10c0/07e86102a3eb2ee2a6a1a89164f29d0dbaebd28f2ca3f5ca786f36b8b23d9e417eb3be45a4acf754f837be5ac0a2317de90d3fcb7f4f4dc95720a1f36b26a17b
+ languageName: node
+ linkType: hard
+
+"binary-extensions@npm:^2.0.0":
+ version: 2.3.0
+ resolution: "binary-extensions@npm:2.3.0"
+ checksum: 10c0/75a59cafc10fb12a11d510e77110c6c7ae3f4ca22463d52487709ca7f18f69d886aa387557cc9864fbdb10153d0bdb4caacabf11541f55e89ed6e18d12ece2b5
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^1.1.7":
+ version: 1.1.12
+ resolution: "brace-expansion@npm:1.1.12"
+ dependencies:
+ balanced-match: "npm:^1.0.0"
+ concat-map: "npm:0.0.1"
+ checksum: 10c0/975fecac2bb7758c062c20d0b3b6288c7cc895219ee25f0a64a9de662dbac981ff0b6e89909c3897c1f84fa353113a721923afdec5f8b2350255b097f12b1f73
+ languageName: node
+ linkType: hard
+
+"brace-expansion@npm:^5.0.2":
+ version: 5.0.4
+ resolution: "brace-expansion@npm:5.0.4"
+ dependencies:
+ balanced-match: "npm:^4.0.2"
+ checksum: 10c0/359cbcfa80b2eb914ca1f3440e92313fbfe7919ee6b274c35db55bec555aded69dac5ee78f102cec90c35f98c20fa43d10936d0cd9978158823c249257e1643a
+ languageName: node
+ linkType: hard
+
+"braces@npm:^3.0.3, braces@npm:~3.0.2":
+ version: 3.0.3
+ resolution: "braces@npm:3.0.3"
+ dependencies:
+ fill-range: "npm:^7.1.1"
+ checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04
+ languageName: node
+ linkType: hard
+
+"busboy@npm:1.6.0":
+ version: 1.6.0
+ resolution: "busboy@npm:1.6.0"
+ dependencies:
+ streamsearch: "npm:^1.1.0"
+ checksum: 10c0/fa7e836a2b82699b6e074393428b91ae579d4f9e21f5ac468e1b459a244341d722d2d22d10920cdd849743dbece6dca11d72de939fb75a7448825cf2babfba1f
+ languageName: node
+ linkType: hard
+
+"call-bind-apply-helpers@npm:^1.0.0, call-bind-apply-helpers@npm:^1.0.1, call-bind-apply-helpers@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "call-bind-apply-helpers@npm:1.0.2"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ function-bind: "npm:^1.1.2"
+ checksum: 10c0/47bd9901d57b857590431243fea704ff18078b16890a6b3e021e12d279bbf211d039155e27d7566b374d49ee1f8189344bac9833dec7a20cdec370506361c938
+ languageName: node
+ linkType: hard
+
+"call-bind@npm:^1.0.7, call-bind@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "call-bind@npm:1.0.8"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.0"
+ es-define-property: "npm:^1.0.0"
+ get-intrinsic: "npm:^1.2.4"
+ set-function-length: "npm:^1.2.2"
+ checksum: 10c0/a13819be0681d915144467741b69875ae5f4eba8961eb0bf322aab63ec87f8250eb6d6b0dcbb2e1349876412a56129ca338592b3829ef4343527f5f18a0752d4
+ languageName: node
+ linkType: hard
+
+"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "call-bound@npm:1.0.4"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.3.0"
+ checksum: 10c0/f4796a6a0941e71c766aea672f63b72bc61234c4f4964dc6d7606e3664c307e7d77845328a8f3359ce39ddb377fed67318f9ee203dea1d47e46165dcf2917644
+ languageName: node
+ linkType: hard
+
+"callsites@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "callsites@npm:3.1.0"
+ checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301
+ languageName: node
+ linkType: hard
+
+"camelcase-css@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "camelcase-css@npm:2.0.1"
+ checksum: 10c0/1a1a3137e8a781e6cbeaeab75634c60ffd8e27850de410c162cce222ea331cd1ba5364e8fb21c95e5ca76f52ac34b81a090925ca00a87221355746d049c6e273
+ languageName: node
+ linkType: hard
+
+"caniuse-lite@npm:^1.0.30001579":
+ version: 1.0.30001776
+ resolution: "caniuse-lite@npm:1.0.30001776"
+ checksum: 10c0/d5a7624ea50548c6c4381979a2900ac451caa7ecbeafec209309da25d547ba1406355cf66d6c6d537d8532ab5a56f2bbc0bf62300a4c3f66aa6fca5954264735
+ languageName: node
+ linkType: hard
+
+"ccount@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "ccount@npm:2.0.1"
+ checksum: 10c0/3939b1664390174484322bc3f45b798462e6c07ee6384cb3d645e0aa2f318502d174845198c1561930e1d431087f74cf1fe291ae9a4722821a9f4ba67e574350
+ languageName: node
+ linkType: hard
+
+"chalk@npm:^4.0.0":
+ version: 4.1.2
+ resolution: "chalk@npm:4.1.2"
+ dependencies:
+ ansi-styles: "npm:^4.1.0"
+ supports-color: "npm:^7.1.0"
+ checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880
+ languageName: node
+ linkType: hard
+
+"character-entities-html4@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "character-entities-html4@npm:2.1.0"
+ checksum: 10c0/fe61b553f083400c20c0b0fd65095df30a0b445d960f3bbf271536ae6c3ba676f39cb7af0b4bf2755812f08ab9b88f2feed68f9aebb73bb153f7a115fe5c6e40
+ languageName: node
+ linkType: hard
+
+"character-entities-legacy@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "character-entities-legacy@npm:3.0.0"
+ checksum: 10c0/ec4b430af873661aa754a896a2b55af089b4e938d3d010fad5219299a6b6d32ab175142699ee250640678cd64bdecd6db3c9af0b8759ab7b155d970d84c4c7d1
+ languageName: node
+ linkType: hard
+
+"character-entities@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "character-entities@npm:2.0.2"
+ checksum: 10c0/b0c645a45bcc90ff24f0e0140f4875a8436b8ef13b6bcd31ec02cfb2ca502b680362aa95386f7815bdc04b6464d48cf191210b3840d7c04241a149ede591a308
+ languageName: node
+ linkType: hard
+
+"character-reference-invalid@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "character-reference-invalid@npm:2.0.1"
+ checksum: 10c0/2ae0dec770cd8659d7e8b0ce24392d83b4c2f0eb4a3395c955dce5528edd4cc030a794cfa06600fcdd700b3f2de2f9b8e40e309c0011c4180e3be64a0b42e6a1
+ languageName: node
+ linkType: hard
+
+"chokidar@npm:^3.6.0":
+ version: 3.6.0
+ resolution: "chokidar@npm:3.6.0"
+ dependencies:
+ anymatch: "npm:~3.1.2"
+ braces: "npm:~3.0.2"
+ fsevents: "npm:~2.3.2"
+ glob-parent: "npm:~5.1.2"
+ is-binary-path: "npm:~2.1.0"
+ is-glob: "npm:~4.0.1"
+ normalize-path: "npm:~3.0.0"
+ readdirp: "npm:~3.6.0"
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ checksum: 10c0/8361dcd013f2ddbe260eacb1f3cb2f2c6f2b0ad118708a343a5ed8158941a39cb8fb1d272e0f389712e74ee90ce8ba864eece9e0e62b9705cb468a2f6d917462
+ languageName: node
+ linkType: hard
+
+"chownr@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "chownr@npm:3.0.0"
+ checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10
+ languageName: node
+ linkType: hard
+
+"class-variance-authority@npm:^0.7.1":
+ version: 0.7.1
+ resolution: "class-variance-authority@npm:0.7.1"
+ dependencies:
+ clsx: "npm:^2.1.1"
+ checksum: 10c0/0f438cea22131808b99272de0fa933c2532d5659773bfec0c583de7b3f038378996d3350683426b8e9c74a6286699382106d71fbec52f0dd5fbb191792cccb5b
+ languageName: node
+ linkType: hard
+
+"client-only@npm:0.0.1":
+ version: 0.0.1
+ resolution: "client-only@npm:0.0.1"
+ checksum: 10c0/9d6cfd0c19e1c96a434605added99dff48482152af791ec4172fb912a71cff9027ff174efd8cdb2160cc7f377543e0537ffc462d4f279bc4701de3f2a3c4b358
+ languageName: node
+ linkType: hard
+
+"clsx@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "clsx@npm:2.1.1"
+ checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839
+ languageName: node
+ linkType: hard
+
+"color-convert@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "color-convert@npm:2.0.1"
+ dependencies:
+ color-name: "npm:~1.1.4"
+ checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7
+ languageName: node
+ linkType: hard
+
+"color-name@npm:^1.0.0, color-name@npm:~1.1.4":
+ version: 1.1.4
+ resolution: "color-name@npm:1.1.4"
+ checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95
+ languageName: node
+ linkType: hard
+
+"color-string@npm:^1.9.0":
+ version: 1.9.1
+ resolution: "color-string@npm:1.9.1"
+ dependencies:
+ color-name: "npm:^1.0.0"
+ simple-swizzle: "npm:^0.2.2"
+ checksum: 10c0/b0bfd74c03b1f837f543898b512f5ea353f71630ccdd0d66f83028d1f0924a7d4272deb278b9aef376cacf1289b522ac3fb175e99895283645a2dc3a33af2404
+ languageName: node
+ linkType: hard
+
+"color@npm:^4.2.3":
+ version: 4.2.3
+ resolution: "color@npm:4.2.3"
+ dependencies:
+ color-convert: "npm:^2.0.1"
+ color-string: "npm:^1.9.0"
+ checksum: 10c0/7fbe7cfb811054c808349de19fb380252e5e34e61d7d168ec3353e9e9aacb1802674bddc657682e4e9730c2786592a4de6f8283e7e0d3870b829bb0b7b2f6118
+ languageName: node
+ linkType: hard
+
+"comma-separated-tokens@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "comma-separated-tokens@npm:2.0.3"
+ checksum: 10c0/91f90f1aae320f1755d6957ef0b864fe4f54737f3313bd95e0802686ee2ca38bff1dd381964d00ae5db42912dd1f4ae5c2709644e82706ffc6f6842a813cdd67
+ languageName: node
+ linkType: hard
+
+"commander@npm:^4.0.0":
+ version: 4.1.1
+ resolution: "commander@npm:4.1.1"
+ checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab
+ languageName: node
+ linkType: hard
+
+"concat-map@npm:0.0.1":
+ version: 0.0.1
+ resolution: "concat-map@npm:0.0.1"
+ checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f
+ languageName: node
+ linkType: hard
+
+"cross-spawn@npm:^7.0.6":
+ version: 7.0.6
+ resolution: "cross-spawn@npm:7.0.6"
+ dependencies:
+ path-key: "npm:^3.1.0"
+ shebang-command: "npm:^2.0.0"
+ which: "npm:^2.0.1"
+ checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1
+ languageName: node
+ linkType: hard
+
+"cssesc@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "cssesc@npm:3.0.0"
+ bin:
+ cssesc: bin/cssesc
+ checksum: 10c0/6bcfd898662671be15ae7827120472c5667afb3d7429f1f917737f3bf84c4176003228131b643ae74543f17a394446247df090c597bb9a728cce298606ed0aa7
+ languageName: node
+ linkType: hard
+
+"csstype@npm:^3.2.2":
+ version: 3.2.3
+ resolution: "csstype@npm:3.2.3"
+ checksum: 10c0/cd29c51e70fa822f1cecd8641a1445bed7063697469d35633b516e60fe8c1bde04b08f6c5b6022136bb669b64c63d4173af54864510fbb4ee23281801841a3ce
+ languageName: node
+ linkType: hard
+
+"damerau-levenshtein@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "damerau-levenshtein@npm:1.0.8"
+ checksum: 10c0/4c2647e0f42acaee7d068756c1d396e296c3556f9c8314bac1ac63ffb236217ef0e7e58602b18bb2173deec7ec8e0cac8e27cccf8f5526666b4ff11a13ad54a3
+ languageName: node
+ linkType: hard
+
+"data-view-buffer@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "data-view-buffer@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ is-data-view: "npm:^1.0.2"
+ checksum: 10c0/7986d40fc7979e9e6241f85db8d17060dd9a71bd53c894fa29d126061715e322a4cd47a00b0b8c710394854183d4120462b980b8554012acc1c0fa49df7ad38c
+ languageName: node
+ linkType: hard
+
+"data-view-byte-length@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "data-view-byte-length@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ is-data-view: "npm:^1.0.2"
+ checksum: 10c0/f8a4534b5c69384d95ac18137d381f18a5cfae1f0fc1df0ef6feef51ef0d568606d970b69e02ea186c6c0f0eac77fe4e6ad96fec2569cc86c3afcc7475068c55
+ languageName: node
+ linkType: hard
+
+"data-view-byte-offset@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "data-view-byte-offset@npm:1.0.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ is-data-view: "npm:^1.0.1"
+ checksum: 10c0/fa7aa40078025b7810dcffc16df02c480573b7b53ef1205aa6a61533011005c1890e5ba17018c692ce7c900212b547262d33279fde801ad9843edc0863bf78c4
+ languageName: node
+ linkType: hard
+
+"debug@npm:^3.2.7":
+ version: 3.2.7
+ resolution: "debug@npm:3.2.7"
+ dependencies:
+ ms: "npm:^2.1.1"
+ checksum: 10c0/37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a
+ languageName: node
+ linkType: hard
+
+"debug@npm:^4.0.0, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.4.0, debug@npm:^4.4.3":
+ version: 4.4.3
+ resolution: "debug@npm:4.4.3"
+ dependencies:
+ ms: "npm:^2.1.3"
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ checksum: 10c0/d79136ec6c83ecbefd0f6a5593da6a9c91ec4d7ddc4b54c883d6e71ec9accb5f67a1a5e96d00a328196b5b5c86d365e98d8a3a70856aaf16b4e7b1985e67f5a6
+ languageName: node
+ linkType: hard
+
+"decode-named-character-reference@npm:^1.0.0":
+ version: 1.3.0
+ resolution: "decode-named-character-reference@npm:1.3.0"
+ dependencies:
+ character-entities: "npm:^2.0.0"
+ checksum: 10c0/787f4c87f3b82ea342aa7c2d7b1882b6fb9511bb77f72ae44dcaabea0470bacd1e9c6a0080ab886545019fa0cb3a7109573fad6b61a362844c3a0ac52b36e4bb
+ languageName: node
+ linkType: hard
+
+"deep-is@npm:^0.1.3":
+ version: 0.1.4
+ resolution: "deep-is@npm:0.1.4"
+ checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c
+ languageName: node
+ linkType: hard
+
+"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.4":
+ version: 1.1.4
+ resolution: "define-data-property@npm:1.1.4"
+ dependencies:
+ es-define-property: "npm:^1.0.0"
+ es-errors: "npm:^1.3.0"
+ gopd: "npm:^1.0.1"
+ checksum: 10c0/dea0606d1483eb9db8d930d4eac62ca0fa16738b0b3e07046cddfacf7d8c868bbe13fa0cb263eb91c7d0d527960dc3f2f2471a69ed7816210307f6744fe62e37
+ languageName: node
+ linkType: hard
+
+"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "define-properties@npm:1.2.1"
+ dependencies:
+ define-data-property: "npm:^1.0.1"
+ has-property-descriptors: "npm:^1.0.0"
+ object-keys: "npm:^1.1.1"
+ checksum: 10c0/88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3
+ languageName: node
+ linkType: hard
+
+"dequal@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "dequal@npm:2.0.3"
+ checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888
+ languageName: node
+ linkType: hard
+
+"detect-libc@npm:^2.0.3":
+ version: 2.1.2
+ resolution: "detect-libc@npm:2.1.2"
+ checksum: 10c0/acc675c29a5649fa1fb6e255f993b8ee829e510b6b56b0910666949c80c364738833417d0edb5f90e4e46be17228b0f2b66a010513984e18b15deeeac49369c4
+ languageName: node
+ linkType: hard
+
+"devlop@npm:^1.0.0, devlop@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "devlop@npm:1.1.0"
+ dependencies:
+ dequal: "npm:^2.0.0"
+ checksum: 10c0/e0928ab8f94c59417a2b8389c45c55ce0a02d9ac7fd74ef62d01ba48060129e1d594501b77de01f3eeafc7cb00773819b0df74d96251cf20b31c5b3071f45c0e
+ languageName: node
+ linkType: hard
+
+"didyoumean@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "didyoumean@npm:1.2.2"
+ checksum: 10c0/95d0b53d23b851aacff56dfadb7ecfedce49da4232233baecfeecb7710248c4aa03f0aa8995062f0acafaf925adf8536bd7044a2e68316fd7d411477599bc27b
+ languageName: node
+ linkType: hard
+
+"diff@npm:^5.0.0":
+ version: 5.2.2
+ resolution: "diff@npm:5.2.2"
+ checksum: 10c0/52da594c54e9033423da26984b1449ae6accd782d5afc4431c9a192a8507ddc83120fe8f925d7220b9da5b5963c7b6f5e46add3660a00cb36df7a13420a09d4b
+ languageName: node
+ linkType: hard
+
+"dlv@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "dlv@npm:1.1.3"
+ checksum: 10c0/03eb4e769f19a027fd5b43b59e8a05e3fd2100ac239ebb0bf9a745de35d449e2f25cfaf3aa3934664551d72856f4ae8b7822016ce5c42c2d27c18ae79429ec42
+ languageName: node
+ linkType: hard
+
+"doctrine@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "doctrine@npm:2.1.0"
+ dependencies:
+ esutils: "npm:^2.0.2"
+ checksum: 10c0/b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac
+ languageName: node
+ linkType: hard
+
+"dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "dunder-proto@npm:1.0.1"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ gopd: "npm:^1.2.0"
+ checksum: 10c0/199f2a0c1c16593ca0a145dbf76a962f8033ce3129f01284d48c45ed4e14fea9bbacd7b3610b6cdc33486cef20385ac054948fefc6272fcce645c09468f93031
+ languageName: node
+ linkType: hard
+
+"emoji-regex@npm:^9.2.2":
+ version: 9.2.2
+ resolution: "emoji-regex@npm:9.2.2"
+ checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639
+ languageName: node
+ linkType: hard
+
+"entities@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "entities@npm:6.0.1"
+ checksum: 10c0/ed836ddac5acb34341094eb495185d527bd70e8632b6c0d59548cbfa23defdbae70b96f9a405c82904efa421230b5b3fd2283752447d737beffd3f3e6ee74414
+ languageName: node
+ linkType: hard
+
+"env-paths@npm:^2.2.0":
+ version: 2.2.1
+ resolution: "env-paths@npm:2.2.1"
+ checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4
+ languageName: node
+ linkType: hard
+
+"es-abstract@npm:^1.17.5, es-abstract@npm:^1.23.2, es-abstract@npm:^1.23.3, es-abstract@npm:^1.23.5, es-abstract@npm:^1.23.6, es-abstract@npm:^1.23.9, es-abstract@npm:^1.24.0, es-abstract@npm:^1.24.1":
+ version: 1.24.1
+ resolution: "es-abstract@npm:1.24.1"
+ dependencies:
+ array-buffer-byte-length: "npm:^1.0.2"
+ arraybuffer.prototype.slice: "npm:^1.0.4"
+ available-typed-arrays: "npm:^1.0.7"
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ data-view-buffer: "npm:^1.0.2"
+ data-view-byte-length: "npm:^1.0.2"
+ data-view-byte-offset: "npm:^1.0.1"
+ es-define-property: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ es-set-tostringtag: "npm:^2.1.0"
+ es-to-primitive: "npm:^1.3.0"
+ function.prototype.name: "npm:^1.1.8"
+ get-intrinsic: "npm:^1.3.0"
+ get-proto: "npm:^1.0.1"
+ get-symbol-description: "npm:^1.1.0"
+ globalthis: "npm:^1.0.4"
+ gopd: "npm:^1.2.0"
+ has-property-descriptors: "npm:^1.0.2"
+ has-proto: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ hasown: "npm:^2.0.2"
+ internal-slot: "npm:^1.1.0"
+ is-array-buffer: "npm:^3.0.5"
+ is-callable: "npm:^1.2.7"
+ is-data-view: "npm:^1.0.2"
+ is-negative-zero: "npm:^2.0.3"
+ is-regex: "npm:^1.2.1"
+ is-set: "npm:^2.0.3"
+ is-shared-array-buffer: "npm:^1.0.4"
+ is-string: "npm:^1.1.1"
+ is-typed-array: "npm:^1.1.15"
+ is-weakref: "npm:^1.1.1"
+ math-intrinsics: "npm:^1.1.0"
+ object-inspect: "npm:^1.13.4"
+ object-keys: "npm:^1.1.1"
+ object.assign: "npm:^4.1.7"
+ own-keys: "npm:^1.0.1"
+ regexp.prototype.flags: "npm:^1.5.4"
+ safe-array-concat: "npm:^1.1.3"
+ safe-push-apply: "npm:^1.0.0"
+ safe-regex-test: "npm:^1.1.0"
+ set-proto: "npm:^1.0.0"
+ stop-iteration-iterator: "npm:^1.1.0"
+ string.prototype.trim: "npm:^1.2.10"
+ string.prototype.trimend: "npm:^1.0.9"
+ string.prototype.trimstart: "npm:^1.0.8"
+ typed-array-buffer: "npm:^1.0.3"
+ typed-array-byte-length: "npm:^1.0.3"
+ typed-array-byte-offset: "npm:^1.0.4"
+ typed-array-length: "npm:^1.0.7"
+ unbox-primitive: "npm:^1.1.0"
+ which-typed-array: "npm:^1.1.19"
+ checksum: 10c0/fca062ef8b5daacf743732167d319a212d45cb655b0bb540821d38d715416ae15b04b84fc86da9e2c89135aa7b337337b6c867f84dcde698d75d55688d5d765c
+ languageName: node
+ linkType: hard
+
+"es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "es-define-property@npm:1.0.1"
+ checksum: 10c0/3f54eb49c16c18707949ff25a1456728c883e81259f045003499efba399c08bad00deebf65cccde8c0e07908c1a225c9d472b7107e558f2a48e28d530e34527c
+ languageName: node
+ linkType: hard
+
+"es-errors@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "es-errors@npm:1.3.0"
+ checksum: 10c0/0a61325670072f98d8ae3b914edab3559b6caa980f08054a3b872052640d91da01d38df55df797fcc916389d77fc92b8d5906cf028f4db46d7e3003abecbca85
+ languageName: node
+ linkType: hard
+
+"es-iterator-helpers@npm:^1.2.1":
+ version: 1.2.2
+ resolution: "es-iterator-helpers@npm:1.2.2"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.24.1"
+ es-errors: "npm:^1.3.0"
+ es-set-tostringtag: "npm:^2.1.0"
+ function-bind: "npm:^1.1.2"
+ get-intrinsic: "npm:^1.3.0"
+ globalthis: "npm:^1.0.4"
+ gopd: "npm:^1.2.0"
+ has-property-descriptors: "npm:^1.0.2"
+ has-proto: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ internal-slot: "npm:^1.1.0"
+ iterator.prototype: "npm:^1.1.5"
+ safe-array-concat: "npm:^1.1.3"
+ checksum: 10c0/1ced8abf845a45e660dd77b5f3a64358421df70e4a0bd1897d5ddfefffed8409a6a2ca21241b9367e639df9eca74abc1c678b3020bffe6bee1f1826393658ddb
+ languageName: node
+ linkType: hard
+
+"es-object-atoms@npm:^1.0.0, es-object-atoms@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "es-object-atoms@npm:1.1.1"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ checksum: 10c0/65364812ca4daf48eb76e2a3b7a89b3f6a2e62a1c420766ce9f692665a29d94fe41fe88b65f24106f449859549711e4b40d9fb8002d862dfd7eb1c512d10be0c
+ languageName: node
+ linkType: hard
+
+"es-set-tostringtag@npm:^2.1.0":
+ version: 2.1.0
+ resolution: "es-set-tostringtag@npm:2.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.6"
+ has-tostringtag: "npm:^1.0.2"
+ hasown: "npm:^2.0.2"
+ checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af
+ languageName: node
+ linkType: hard
+
+"es-shim-unscopables@npm:^1.0.2, es-shim-unscopables@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "es-shim-unscopables@npm:1.1.0"
+ dependencies:
+ hasown: "npm:^2.0.2"
+ checksum: 10c0/1b9702c8a1823fc3ef39035a4e958802cf294dd21e917397c561d0b3e195f383b978359816b1732d02b255ccf63e1e4815da0065b95db8d7c992037be3bbbcdb
+ languageName: node
+ linkType: hard
+
+"es-to-primitive@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "es-to-primitive@npm:1.3.0"
+ dependencies:
+ is-callable: "npm:^1.2.7"
+ is-date-object: "npm:^1.0.5"
+ is-symbol: "npm:^1.0.4"
+ checksum: 10c0/c7e87467abb0b438639baa8139f701a06537d2b9bc758f23e8622c3b42fd0fdb5bde0f535686119e446dd9d5e4c0f238af4e14960f4771877cf818d023f6730b
+ languageName: node
+ linkType: hard
+
+"esbuild@npm:~0.27.0":
+ version: 0.27.3
+ resolution: "esbuild@npm:0.27.3"
+ dependencies:
+ "@esbuild/aix-ppc64": "npm:0.27.3"
+ "@esbuild/android-arm": "npm:0.27.3"
+ "@esbuild/android-arm64": "npm:0.27.3"
+ "@esbuild/android-x64": "npm:0.27.3"
+ "@esbuild/darwin-arm64": "npm:0.27.3"
+ "@esbuild/darwin-x64": "npm:0.27.3"
+ "@esbuild/freebsd-arm64": "npm:0.27.3"
+ "@esbuild/freebsd-x64": "npm:0.27.3"
+ "@esbuild/linux-arm": "npm:0.27.3"
+ "@esbuild/linux-arm64": "npm:0.27.3"
+ "@esbuild/linux-ia32": "npm:0.27.3"
+ "@esbuild/linux-loong64": "npm:0.27.3"
+ "@esbuild/linux-mips64el": "npm:0.27.3"
+ "@esbuild/linux-ppc64": "npm:0.27.3"
+ "@esbuild/linux-riscv64": "npm:0.27.3"
+ "@esbuild/linux-s390x": "npm:0.27.3"
+ "@esbuild/linux-x64": "npm:0.27.3"
+ "@esbuild/netbsd-arm64": "npm:0.27.3"
+ "@esbuild/netbsd-x64": "npm:0.27.3"
+ "@esbuild/openbsd-arm64": "npm:0.27.3"
+ "@esbuild/openbsd-x64": "npm:0.27.3"
+ "@esbuild/openharmony-arm64": "npm:0.27.3"
+ "@esbuild/sunos-x64": "npm:0.27.3"
+ "@esbuild/win32-arm64": "npm:0.27.3"
+ "@esbuild/win32-ia32": "npm:0.27.3"
+ "@esbuild/win32-x64": "npm:0.27.3"
+ dependenciesMeta:
+ "@esbuild/aix-ppc64":
+ optional: true
+ "@esbuild/android-arm":
+ optional: true
+ "@esbuild/android-arm64":
+ optional: true
+ "@esbuild/android-x64":
+ optional: true
+ "@esbuild/darwin-arm64":
+ optional: true
+ "@esbuild/darwin-x64":
+ optional: true
+ "@esbuild/freebsd-arm64":
+ optional: true
+ "@esbuild/freebsd-x64":
+ optional: true
+ "@esbuild/linux-arm":
+ optional: true
+ "@esbuild/linux-arm64":
+ optional: true
+ "@esbuild/linux-ia32":
+ optional: true
+ "@esbuild/linux-loong64":
+ optional: true
+ "@esbuild/linux-mips64el":
+ optional: true
+ "@esbuild/linux-ppc64":
+ optional: true
+ "@esbuild/linux-riscv64":
+ optional: true
+ "@esbuild/linux-s390x":
+ optional: true
+ "@esbuild/linux-x64":
+ optional: true
+ "@esbuild/netbsd-arm64":
+ optional: true
+ "@esbuild/netbsd-x64":
+ optional: true
+ "@esbuild/openbsd-arm64":
+ optional: true
+ "@esbuild/openbsd-x64":
+ optional: true
+ "@esbuild/openharmony-arm64":
+ optional: true
+ "@esbuild/sunos-x64":
+ optional: true
+ "@esbuild/win32-arm64":
+ optional: true
+ "@esbuild/win32-ia32":
+ optional: true
+ "@esbuild/win32-x64":
+ optional: true
+ bin:
+ esbuild: bin/esbuild
+ checksum: 10c0/fdc3f87a3f08b3ef98362f37377136c389a0d180fda4b8d073b26ba930cf245521db0a368f119cc7624bc619248fff1439f5811f062d853576f8ffa3df8ee5f1
+ languageName: node
+ linkType: hard
+
+"escape-string-regexp@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "escape-string-regexp@npm:4.0.0"
+ checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9
+ languageName: node
+ linkType: hard
+
+"escape-string-regexp@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "escape-string-regexp@npm:5.0.0"
+ checksum: 10c0/6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95
+ languageName: node
+ linkType: hard
+
+"eslint-config-next@npm:15.1.6":
+ version: 15.1.6
+ resolution: "eslint-config-next@npm:15.1.6"
+ dependencies:
+ "@next/eslint-plugin-next": "npm:15.1.6"
+ "@rushstack/eslint-patch": "npm:^1.10.3"
+ "@typescript-eslint/eslint-plugin": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/parser": "npm:^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ eslint-import-resolver-node: "npm:^0.3.6"
+ eslint-import-resolver-typescript: "npm:^3.5.2"
+ eslint-plugin-import: "npm:^2.31.0"
+ eslint-plugin-jsx-a11y: "npm:^6.10.0"
+ eslint-plugin-react: "npm:^7.37.0"
+ eslint-plugin-react-hooks: "npm:^5.0.0"
+ peerDependencies:
+ eslint: ^7.23.0 || ^8.0.0 || ^9.0.0
+ typescript: ">=3.3.1"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: 10c0/6d207de7169869f5ce113038b650167b51f6584dd7f9bd9557030a5681eff690ec9ec1ac9183f012efdddba7914b8928b16f11fa4a5ed20aa0d5056ead4d4f4e
+ languageName: node
+ linkType: hard
+
+"eslint-import-resolver-node@npm:^0.3.6, eslint-import-resolver-node@npm:^0.3.9":
+ version: 0.3.9
+ resolution: "eslint-import-resolver-node@npm:0.3.9"
+ dependencies:
+ debug: "npm:^3.2.7"
+ is-core-module: "npm:^2.13.0"
+ resolve: "npm:^1.22.4"
+ checksum: 10c0/0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61
+ languageName: node
+ linkType: hard
+
+"eslint-import-resolver-typescript@npm:^3.5.2":
+ version: 3.10.1
+ resolution: "eslint-import-resolver-typescript@npm:3.10.1"
+ dependencies:
+ "@nolyfill/is-core-module": "npm:1.0.39"
+ debug: "npm:^4.4.0"
+ get-tsconfig: "npm:^4.10.0"
+ is-bun-module: "npm:^2.0.0"
+ stable-hash: "npm:^0.0.5"
+ tinyglobby: "npm:^0.2.13"
+ unrs-resolver: "npm:^1.6.2"
+ peerDependencies:
+ eslint: "*"
+ eslint-plugin-import: "*"
+ eslint-plugin-import-x: "*"
+ peerDependenciesMeta:
+ eslint-plugin-import:
+ optional: true
+ eslint-plugin-import-x:
+ optional: true
+ checksum: 10c0/02ba72cf757753ab9250806c066d09082e00807b7b6525d7687e1c0710bc3f6947e39120227fe1f93dabea3510776d86fb3fd769466ba3c46ce67e9f874cb702
+ languageName: node
+ linkType: hard
+
+"eslint-module-utils@npm:^2.12.1":
+ version: 2.12.1
+ resolution: "eslint-module-utils@npm:2.12.1"
+ dependencies:
+ debug: "npm:^3.2.7"
+ peerDependenciesMeta:
+ eslint:
+ optional: true
+ checksum: 10c0/6f4efbe7a91ae49bf67b4ab3644cb60bc5bd7db4cb5521de1b65be0847ffd3fb6bce0dd68f0995e1b312d137f768e2a1f842ee26fe73621afa05f850628fdc40
+ languageName: node
+ linkType: hard
+
+"eslint-plugin-import@npm:^2.31.0":
+ version: 2.32.0
+ resolution: "eslint-plugin-import@npm:2.32.0"
+ dependencies:
+ "@rtsao/scc": "npm:^1.1.0"
+ array-includes: "npm:^3.1.9"
+ array.prototype.findlastindex: "npm:^1.2.6"
+ array.prototype.flat: "npm:^1.3.3"
+ array.prototype.flatmap: "npm:^1.3.3"
+ debug: "npm:^3.2.7"
+ doctrine: "npm:^2.1.0"
+ eslint-import-resolver-node: "npm:^0.3.9"
+ eslint-module-utils: "npm:^2.12.1"
+ hasown: "npm:^2.0.2"
+ is-core-module: "npm:^2.16.1"
+ is-glob: "npm:^4.0.3"
+ minimatch: "npm:^3.1.2"
+ object.fromentries: "npm:^2.0.8"
+ object.groupby: "npm:^1.0.3"
+ object.values: "npm:^1.2.1"
+ semver: "npm:^6.3.1"
+ string.prototype.trimend: "npm:^1.0.9"
+ tsconfig-paths: "npm:^3.15.0"
+ peerDependencies:
+ eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9
+ checksum: 10c0/bfb1b8fc8800398e62ddfefbf3638d185286edfed26dfe00875cc2846d954491b4f5112457831588b757fa789384e1ae585f812614c4797f0499fa234fd4a48b
+ languageName: node
+ linkType: hard
+
+"eslint-plugin-jsx-a11y@npm:^6.10.0":
+ version: 6.10.2
+ resolution: "eslint-plugin-jsx-a11y@npm:6.10.2"
+ dependencies:
+ aria-query: "npm:^5.3.2"
+ array-includes: "npm:^3.1.8"
+ array.prototype.flatmap: "npm:^1.3.2"
+ ast-types-flow: "npm:^0.0.8"
+ axe-core: "npm:^4.10.0"
+ axobject-query: "npm:^4.1.0"
+ damerau-levenshtein: "npm:^1.0.8"
+ emoji-regex: "npm:^9.2.2"
+ hasown: "npm:^2.0.2"
+ jsx-ast-utils: "npm:^3.3.5"
+ language-tags: "npm:^1.0.9"
+ minimatch: "npm:^3.1.2"
+ object.fromentries: "npm:^2.0.8"
+ safe-regex-test: "npm:^1.0.3"
+ string.prototype.includes: "npm:^2.0.1"
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9
+ checksum: 10c0/d93354e03b0cf66f018d5c50964e074dffe4ddf1f9b535fa020d19c4ae45f89c1a16e9391ca61ac3b19f7042c751ac0d361a056a65cbd1de24718a53ff8daa6e
+ languageName: node
+ linkType: hard
+
+"eslint-plugin-react-hooks@npm:^5.0.0":
+ version: 5.2.0
+ resolution: "eslint-plugin-react-hooks@npm:5.2.0"
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
+ checksum: 10c0/1c8d50fa5984c6dea32470651807d2922cc3934cf3425e78f84a24c2dfd972e7f019bee84aefb27e0cf2c13fea0ac1d4473267727408feeb1c56333ca1489385
+ languageName: node
+ linkType: hard
+
+"eslint-plugin-react@npm:^7.37.0":
+ version: 7.37.5
+ resolution: "eslint-plugin-react@npm:7.37.5"
+ dependencies:
+ array-includes: "npm:^3.1.8"
+ array.prototype.findlast: "npm:^1.2.5"
+ array.prototype.flatmap: "npm:^1.3.3"
+ array.prototype.tosorted: "npm:^1.1.4"
+ doctrine: "npm:^2.1.0"
+ es-iterator-helpers: "npm:^1.2.1"
+ estraverse: "npm:^5.3.0"
+ hasown: "npm:^2.0.2"
+ jsx-ast-utils: "npm:^2.4.1 || ^3.0.0"
+ minimatch: "npm:^3.1.2"
+ object.entries: "npm:^1.1.9"
+ object.fromentries: "npm:^2.0.8"
+ object.values: "npm:^1.2.1"
+ prop-types: "npm:^15.8.1"
+ resolve: "npm:^2.0.0-next.5"
+ semver: "npm:^6.3.1"
+ string.prototype.matchall: "npm:^4.0.12"
+ string.prototype.repeat: "npm:^1.0.0"
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
+ checksum: 10c0/c850bfd556291d4d9234f5ca38db1436924a1013627c8ab1853f77cac73ec19b020e861e6c7b783436a48b6ffcdfba4547598235a37ad4611b6739f65fd8ad57
+ languageName: node
+ linkType: hard
+
+"eslint-scope@npm:^8.4.0":
+ version: 8.4.0
+ resolution: "eslint-scope@npm:8.4.0"
+ dependencies:
+ esrecurse: "npm:^4.3.0"
+ estraverse: "npm:^5.2.0"
+ checksum: 10c0/407f6c600204d0f3705bd557f81bd0189e69cd7996f408f8971ab5779c0af733d1af2f1412066b40ee1588b085874fc37a2333986c6521669cdbdd36ca5058e0
+ languageName: node
+ linkType: hard
+
+"eslint-visitor-keys@npm:^3.4.3":
+ version: 3.4.3
+ resolution: "eslint-visitor-keys@npm:3.4.3"
+ checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820
+ languageName: node
+ linkType: hard
+
+"eslint-visitor-keys@npm:^4.2.1":
+ version: 4.2.1
+ resolution: "eslint-visitor-keys@npm:4.2.1"
+ checksum: 10c0/fcd43999199d6740db26c58dbe0c2594623e31ca307e616ac05153c9272f12f1364f5a0b1917a8e962268fdecc6f3622c1c2908b4fcc2e047a106fe6de69dc43
+ languageName: node
+ linkType: hard
+
+"eslint-visitor-keys@npm:^5.0.0":
+ version: 5.0.1
+ resolution: "eslint-visitor-keys@npm:5.0.1"
+ checksum: 10c0/16190bdf2cbae40a1109384c94450c526a79b0b9c3cb21e544256ed85ac48a4b84db66b74a6561d20fe6ab77447f150d711c2ad5ad74df4fcc133736bce99678
+ languageName: node
+ linkType: hard
+
+"eslint@npm:^9":
+ version: 9.39.3
+ resolution: "eslint@npm:9.39.3"
+ dependencies:
+ "@eslint-community/eslint-utils": "npm:^4.8.0"
+ "@eslint-community/regexpp": "npm:^4.12.1"
+ "@eslint/config-array": "npm:^0.21.1"
+ "@eslint/config-helpers": "npm:^0.4.2"
+ "@eslint/core": "npm:^0.17.0"
+ "@eslint/eslintrc": "npm:^3.3.1"
+ "@eslint/js": "npm:9.39.3"
+ "@eslint/plugin-kit": "npm:^0.4.1"
+ "@humanfs/node": "npm:^0.16.6"
+ "@humanwhocodes/module-importer": "npm:^1.0.1"
+ "@humanwhocodes/retry": "npm:^0.4.2"
+ "@types/estree": "npm:^1.0.6"
+ ajv: "npm:^6.12.4"
+ chalk: "npm:^4.0.0"
+ cross-spawn: "npm:^7.0.6"
+ debug: "npm:^4.3.2"
+ escape-string-regexp: "npm:^4.0.0"
+ eslint-scope: "npm:^8.4.0"
+ eslint-visitor-keys: "npm:^4.2.1"
+ espree: "npm:^10.4.0"
+ esquery: "npm:^1.5.0"
+ esutils: "npm:^2.0.2"
+ fast-deep-equal: "npm:^3.1.3"
+ file-entry-cache: "npm:^8.0.0"
+ find-up: "npm:^5.0.0"
+ glob-parent: "npm:^6.0.2"
+ ignore: "npm:^5.2.0"
+ imurmurhash: "npm:^0.1.4"
+ is-glob: "npm:^4.0.0"
+ json-stable-stringify-without-jsonify: "npm:^1.0.1"
+ lodash.merge: "npm:^4.6.2"
+ minimatch: "npm:^3.1.2"
+ natural-compare: "npm:^1.4.0"
+ optionator: "npm:^0.9.3"
+ peerDependencies:
+ jiti: "*"
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ bin:
+ eslint: bin/eslint.js
+ checksum: 10c0/5e5dbf84d4f604f5d2d7a58c5c3fcdde30a01b8973ff3caeca8b2bacc16066717cedb4385ce52db1a2746d0b621770d4d4227cc7f44982b0b03818be2c31538d
+ languageName: node
+ linkType: hard
+
+"espree@npm:^10.0.1, espree@npm:^10.4.0":
+ version: 10.4.0
+ resolution: "espree@npm:10.4.0"
+ dependencies:
+ acorn: "npm:^8.15.0"
+ acorn-jsx: "npm:^5.3.2"
+ eslint-visitor-keys: "npm:^4.2.1"
+ checksum: 10c0/c63fe06131c26c8157b4083313cb02a9a54720a08e21543300e55288c40e06c3fc284bdecf108d3a1372c5934a0a88644c98714f38b6ae8ed272b40d9ea08d6b
+ languageName: node
+ linkType: hard
+
+"esprima@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "esprima@npm:4.0.1"
+ bin:
+ esparse: ./bin/esparse.js
+ esvalidate: ./bin/esvalidate.js
+ checksum: 10c0/ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3
+ languageName: node
+ linkType: hard
+
+"esquery@npm:^1.5.0":
+ version: 1.7.0
+ resolution: "esquery@npm:1.7.0"
+ dependencies:
+ estraverse: "npm:^5.1.0"
+ checksum: 10c0/77d5173db450b66f3bc685d11af4c90cffeedb340f34a39af96d43509a335ce39c894fd79233df32d38f5e4e219fa0f7076f6ec90bae8320170ba082c0db4793
+ languageName: node
+ linkType: hard
+
+"esrecurse@npm:^4.3.0":
+ version: 4.3.0
+ resolution: "esrecurse@npm:4.3.0"
+ dependencies:
+ estraverse: "npm:^5.2.0"
+ checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5
+ languageName: node
+ linkType: hard
+
+"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0":
+ version: 5.3.0
+ resolution: "estraverse@npm:5.3.0"
+ checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107
+ languageName: node
+ linkType: hard
+
+"estree-util-is-identifier-name@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "estree-util-is-identifier-name@npm:3.0.0"
+ checksum: 10c0/d1881c6ed14bd588ebd508fc90bf2a541811dbb9ca04dec2f39d27dcaa635f85b5ed9bbbe7fc6fb1ddfca68744a5f7c70456b4b7108b6c4c52780631cc787c5b
+ languageName: node
+ linkType: hard
+
+"esutils@npm:^2.0.2":
+ version: 2.0.3
+ resolution: "esutils@npm:2.0.3"
+ checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7
+ languageName: node
+ linkType: hard
+
+"exponential-backoff@npm:^3.1.1":
+ version: 3.1.3
+ resolution: "exponential-backoff@npm:3.1.3"
+ checksum: 10c0/77e3ae682b7b1f4972f563c6dbcd2b0d54ac679e62d5d32f3e5085feba20483cf28bd505543f520e287a56d4d55a28d7874299941faf637e779a1aa5994d1267
+ languageName: node
+ linkType: hard
+
+"extend-shallow@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "extend-shallow@npm:2.0.1"
+ dependencies:
+ is-extendable: "npm:^0.1.0"
+ checksum: 10c0/ee1cb0a18c9faddb42d791b2d64867bd6cfd0f3affb711782eb6e894dd193e2934a7f529426aac7c8ddb31ac5d38000a00aa2caf08aa3dfc3e1c8ff6ba340bd9
+ languageName: node
+ linkType: hard
+
+"extend@npm:^3.0.0":
+ version: 3.0.2
+ resolution: "extend@npm:3.0.2"
+ checksum: 10c0/73bf6e27406e80aa3e85b0d1c4fd987261e628064e170ca781125c0b635a3dabad5e05adbf07595ea0cf1e6c5396cacb214af933da7cbaf24fe75ff14818e8f9
+ languageName: node
+ linkType: hard
+
+"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3":
+ version: 3.1.3
+ resolution: "fast-deep-equal@npm:3.1.3"
+ checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0
+ languageName: node
+ linkType: hard
+
+"fast-glob@npm:3.3.1":
+ version: 3.3.1
+ resolution: "fast-glob@npm:3.3.1"
+ dependencies:
+ "@nodelib/fs.stat": "npm:^2.0.2"
+ "@nodelib/fs.walk": "npm:^1.2.3"
+ glob-parent: "npm:^5.1.2"
+ merge2: "npm:^1.3.0"
+ micromatch: "npm:^4.0.4"
+ checksum: 10c0/b68431128fb6ce4b804c5f9622628426d990b66c75b21c0d16e3d80e2d1398bf33f7e1724e66a2e3f299285dcf5b8d745b122d0304e7dd66f5231081f33ec67c
+ languageName: node
+ linkType: hard
+
+"fast-glob@npm:^3.3.2":
+ version: 3.3.3
+ resolution: "fast-glob@npm:3.3.3"
+ dependencies:
+ "@nodelib/fs.stat": "npm:^2.0.2"
+ "@nodelib/fs.walk": "npm:^1.2.3"
+ glob-parent: "npm:^5.1.2"
+ merge2: "npm:^1.3.0"
+ micromatch: "npm:^4.0.8"
+ checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe
+ languageName: node
+ linkType: hard
+
+"fast-json-stable-stringify@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "fast-json-stable-stringify@npm:2.1.0"
+ checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b
+ languageName: node
+ linkType: hard
+
+"fast-levenshtein@npm:^2.0.6":
+ version: 2.0.6
+ resolution: "fast-levenshtein@npm:2.0.6"
+ checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4
+ languageName: node
+ linkType: hard
+
+"fast-xml-builder@npm:^1.1.4":
+ version: 1.1.4
+ resolution: "fast-xml-builder@npm:1.1.4"
+ dependencies:
+ path-expression-matcher: "npm:^1.1.3"
+ checksum: 10c0/d5dfc0660f7f886b9f42747e6aa1d5e16c090c804b322652f65a5d7ffb93aa00153c3e1276cd053629f9f4c4f625131dc6886677394f7048e827e63b97b18927
+ languageName: node
+ linkType: hard
+
+"fast-xml-parser@npm:^5.3.0":
+ version: 5.5.10
+ resolution: "fast-xml-parser@npm:5.5.10"
+ dependencies:
+ fast-xml-builder: "npm:^1.1.4"
+ path-expression-matcher: "npm:^1.2.1"
+ strnum: "npm:^2.2.2"
+ bin:
+ fxparser: src/cli/cli.js
+ checksum: 10c0/7525e670e75d4a3da1c8fa25024879e3ddd06190ca7c390c18c2443e7aea6b9921c311207feb2901dc1728ac64220ddd838ca201e0fb564de158d9d18b9d170f
+ languageName: node
+ linkType: hard
+
+"fastq@npm:^1.6.0":
+ version: 1.20.1
+ resolution: "fastq@npm:1.20.1"
+ dependencies:
+ reusify: "npm:^1.0.4"
+ checksum: 10c0/e5dd725884decb1f11e5c822221d76136f239d0236f176fab80b7b8f9e7619ae57e6b4e5b73defc21e6b9ef99437ee7b545cff8e6c2c337819633712fa9d352e
+ languageName: node
+ linkType: hard
+
+"fdir@npm:^6.5.0":
+ version: 6.5.0
+ resolution: "fdir@npm:6.5.0"
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+ checksum: 10c0/e345083c4306b3aed6cb8ec551e26c36bab5c511e99ea4576a16750ddc8d3240e63826cc624f5ae17ad4dc82e68a253213b60d556c11bfad064b7607847ed07f
+ languageName: node
+ linkType: hard
+
+"file-entry-cache@npm:^8.0.0":
+ version: 8.0.0
+ resolution: "file-entry-cache@npm:8.0.0"
+ dependencies:
+ flat-cache: "npm:^4.0.0"
+ checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638
+ languageName: node
+ linkType: hard
+
+"fill-range@npm:^7.1.1":
+ version: 7.1.1
+ resolution: "fill-range@npm:7.1.1"
+ dependencies:
+ to-regex-range: "npm:^5.0.1"
+ checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018
+ languageName: node
+ linkType: hard
+
+"find-up@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "find-up@npm:5.0.0"
+ dependencies:
+ locate-path: "npm:^6.0.0"
+ path-exists: "npm:^4.0.0"
+ checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a
+ languageName: node
+ linkType: hard
+
+"flat-cache@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "flat-cache@npm:4.0.1"
+ dependencies:
+ flatted: "npm:^3.2.9"
+ keyv: "npm:^4.5.4"
+ checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc
+ languageName: node
+ linkType: hard
+
+"flatted@npm:^3.2.9":
+ version: 3.3.4
+ resolution: "flatted@npm:3.3.4"
+ checksum: 10c0/d1f33426e9714063a65a90940acdb2897eceb810230a58e496d90334dcecfa81a90135bbc660df6827939865d57cb4a2afab14dcd3d505e16a8484fd73bf9642
+ languageName: node
+ linkType: hard
+
+"for-each@npm:^0.3.3, for-each@npm:^0.3.5":
+ version: 0.3.5
+ resolution: "for-each@npm:0.3.5"
+ dependencies:
+ is-callable: "npm:^1.2.7"
+ checksum: 10c0/0e0b50f6a843a282637d43674d1fb278dda1dd85f4f99b640024cfb10b85058aac0cc781bf689d5fe50b4b7f638e91e548560723a4e76e04fe96ae35ef039cee
+ languageName: node
+ linkType: hard
+
+"framer-motion@npm:^12.5.0":
+ version: 12.35.0
+ resolution: "framer-motion@npm:12.35.0"
+ dependencies:
+ motion-dom: "npm:^12.35.0"
+ motion-utils: "npm:^12.29.2"
+ tslib: "npm:^2.4.0"
+ peerDependencies:
+ "@emotion/is-prop-valid": "*"
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ "@emotion/is-prop-valid":
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ checksum: 10c0/f79e2877d28f8f467bd7e936f2d67a53398c13adce5ac110bd4364da25b8e11b6c3daee7ea533df5d9624bef881ae2b7dd11a8805960bcdffaaee9d2438426f5
+ languageName: node
+ linkType: hard
+
+"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3":
+ version: 2.3.3
+ resolution: "fsevents@npm:2.3.3"
+ dependencies:
+ node-gyp: "npm:latest"
+ checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin":
+ version: 2.3.3
+ resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1"
+ dependencies:
+ node-gyp: "npm:latest"
+ conditions: os=darwin
+ languageName: node
+ linkType: hard
+
+"function-bind@npm:^1.1.2":
+ version: 1.1.2
+ resolution: "function-bind@npm:1.1.2"
+ checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5
+ languageName: node
+ linkType: hard
+
+"function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8":
+ version: 1.1.8
+ resolution: "function.prototype.name@npm:1.1.8"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ define-properties: "npm:^1.2.1"
+ functions-have-names: "npm:^1.2.3"
+ hasown: "npm:^2.0.2"
+ is-callable: "npm:^1.2.7"
+ checksum: 10c0/e920a2ab52663005f3cbe7ee3373e3c71c1fb5558b0b0548648cdf3e51961085032458e26c71ff1a8c8c20e7ee7caeb03d43a5d1fa8610c459333323a2e71253
+ languageName: node
+ linkType: hard
+
+"functions-have-names@npm:^1.2.3":
+ version: 1.2.3
+ resolution: "functions-have-names@npm:1.2.3"
+ checksum: 10c0/33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca
+ languageName: node
+ linkType: hard
+
+"generator-function@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "generator-function@npm:2.0.1"
+ checksum: 10c0/8a9f59df0f01cfefafdb3b451b80555e5cf6d76487095db91ac461a0e682e4ff7a9dbce15f4ecec191e53586d59eece01949e05a4b4492879600bbbe8e28d6b8
+ languageName: node
+ linkType: hard
+
+"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "get-intrinsic@npm:1.3.0"
+ dependencies:
+ call-bind-apply-helpers: "npm:^1.0.2"
+ es-define-property: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.1.1"
+ function-bind: "npm:^1.1.2"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ hasown: "npm:^2.0.2"
+ math-intrinsics: "npm:^1.1.0"
+ checksum: 10c0/52c81808af9a8130f581e6a6a83e1ba4a9f703359e7a438d1369a5267a25412322f03dcbd7c549edaef0b6214a0630a28511d7df0130c93cfd380f4fa0b5b66a
+ languageName: node
+ linkType: hard
+
+"get-proto@npm:^1.0.0, get-proto@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "get-proto@npm:1.0.1"
+ dependencies:
+ dunder-proto: "npm:^1.0.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/9224acb44603c5526955e83510b9da41baf6ae73f7398875fba50edc5e944223a89c4a72b070fcd78beb5f7bdda58ecb6294adc28f7acfc0da05f76a2399643c
+ languageName: node
+ linkType: hard
+
+"get-symbol-description@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "get-symbol-description@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.6"
+ checksum: 10c0/d6a7d6afca375779a4b307738c9e80dbf7afc0bdbe5948768d54ab9653c865523d8920e670991a925936eb524b7cb6a6361d199a760b21d0ca7620194455aa4b
+ languageName: node
+ linkType: hard
+
+"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.7.5":
+ version: 4.13.6
+ resolution: "get-tsconfig@npm:4.13.6"
+ dependencies:
+ resolve-pkg-maps: "npm:^1.0.0"
+ checksum: 10c0/bab6937302f542f97217cbe7cbbdfa7e85a56a377bc7a73e69224c1f0b7c9ae8365918e55752ae8648265903f506c1705f63c0de1d4bab1ec2830fef3e539a1a
+ languageName: node
+ linkType: hard
+
+"giscus@npm:^1.6.0":
+ version: 1.6.0
+ resolution: "giscus@npm:1.6.0"
+ dependencies:
+ lit: "npm:^3.2.1"
+ checksum: 10c0/2dc96e45591b38bbf8db7c9a0efbb25f598e57522cd90ca0cad23d573f88f5adbe4411c0c4cf61231f6dca57531d6fe4fbbcd12be78681cba3aa218eb4584e11
+ languageName: node
+ linkType: hard
+
+"github-slugger@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "github-slugger@npm:2.0.0"
+ checksum: 10c0/21b912b6b1e48f1e5a50b2292b48df0ff6abeeb0691b161b3d93d84f4ae6b1acd6ae23702e914af7ea5d441c096453cf0f621b72d57893946618d21dd1a1c486
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2":
+ version: 5.1.2
+ resolution: "glob-parent@npm:5.1.2"
+ dependencies:
+ is-glob: "npm:^4.0.1"
+ checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee
+ languageName: node
+ linkType: hard
+
+"glob-parent@npm:^6.0.2":
+ version: 6.0.2
+ resolution: "glob-parent@npm:6.0.2"
+ dependencies:
+ is-glob: "npm:^4.0.3"
+ checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8
+ languageName: node
+ linkType: hard
+
+"globals@npm:^14.0.0":
+ version: 14.0.0
+ resolution: "globals@npm:14.0.0"
+ checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d
+ languageName: node
+ linkType: hard
+
+"globalthis@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "globalthis@npm:1.0.4"
+ dependencies:
+ define-properties: "npm:^1.2.1"
+ gopd: "npm:^1.0.1"
+ checksum: 10c0/9d156f313af79d80b1566b93e19285f481c591ad6d0d319b4be5e03750d004dde40a39a0f26f7e635f9007a3600802f53ecd85a759b86f109e80a5f705e01846
+ languageName: node
+ linkType: hard
+
+"gopd@npm:^1.0.1, gopd@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "gopd@npm:1.2.0"
+ checksum: 10c0/50fff1e04ba2b7737c097358534eacadad1e68d24cccee3272e04e007bed008e68d2614f3987788428fd192a5ae3889d08fb2331417e4fc4a9ab366b2043cead
+ languageName: node
+ linkType: hard
+
+"graceful-fs@npm:^4.2.6":
+ version: 4.2.11
+ resolution: "graceful-fs@npm:4.2.11"
+ checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2
+ languageName: node
+ linkType: hard
+
+"gray-matter@npm:^4.0.3":
+ version: 4.0.3
+ resolution: "gray-matter@npm:4.0.3"
+ dependencies:
+ js-yaml: "npm:^3.13.1"
+ kind-of: "npm:^6.0.2"
+ section-matter: "npm:^1.0.0"
+ strip-bom-string: "npm:^1.0.0"
+ checksum: 10c0/e38489906dad4f162ca01e0dcbdbed96d1a53740cef446b9bf76d80bec66fa799af07776a18077aee642346c5e1365ed95e4c91854a12bf40ba0d4fb43a625a6
+ languageName: node
+ linkType: hard
+
+"has-bigints@npm:^1.0.2":
+ version: 1.1.0
+ resolution: "has-bigints@npm:1.1.0"
+ checksum: 10c0/2de0cdc4a1ccf7a1e75ffede1876994525ac03cc6f5ae7392d3415dd475cd9eee5bceec63669ab61aa997ff6cceebb50ef75561c7002bed8988de2b9d1b40788
+ languageName: node
+ linkType: hard
+
+"has-flag@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "has-flag@npm:4.0.0"
+ checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1
+ languageName: node
+ linkType: hard
+
+"has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "has-property-descriptors@npm:1.0.2"
+ dependencies:
+ es-define-property: "npm:^1.0.0"
+ checksum: 10c0/253c1f59e80bb476cf0dde8ff5284505d90c3bdb762983c3514d36414290475fe3fd6f574929d84de2a8eec00d35cf07cb6776205ff32efd7c50719125f00236
+ languageName: node
+ linkType: hard
+
+"has-proto@npm:^1.2.0":
+ version: 1.2.0
+ resolution: "has-proto@npm:1.2.0"
+ dependencies:
+ dunder-proto: "npm:^1.0.0"
+ checksum: 10c0/46538dddab297ec2f43923c3d35237df45d8c55a6fc1067031e04c13ed8a9a8f94954460632fd4da84c31a1721eefee16d901cbb1ae9602bab93bb6e08f93b95
+ languageName: node
+ linkType: hard
+
+"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "has-symbols@npm:1.1.0"
+ checksum: 10c0/dde0a734b17ae51e84b10986e651c664379018d10b91b6b0e9b293eddb32f0f069688c841fb40f19e9611546130153e0a2a48fd7f512891fb000ddfa36f5a20e
+ languageName: node
+ linkType: hard
+
+"has-tostringtag@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "has-tostringtag@npm:1.0.2"
+ dependencies:
+ has-symbols: "npm:^1.0.3"
+ checksum: 10c0/a8b166462192bafe3d9b6e420a1d581d93dd867adb61be223a17a8d6dad147aa77a8be32c961bb2f27b3ef893cae8d36f564ab651f5e9b7938ae86f74027c48c
+ languageName: node
+ linkType: hard
+
+"hasown@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "hasown@npm:2.0.2"
+ dependencies:
+ function-bind: "npm:^1.1.2"
+ checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9
+ languageName: node
+ linkType: hard
+
+"hast-util-from-parse5@npm:^8.0.0":
+ version: 8.0.3
+ resolution: "hast-util-from-parse5@npm:8.0.3"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ devlop: "npm:^1.0.0"
+ hastscript: "npm:^9.0.0"
+ property-information: "npm:^7.0.0"
+ vfile: "npm:^6.0.0"
+ vfile-location: "npm:^5.0.0"
+ web-namespaces: "npm:^2.0.0"
+ checksum: 10c0/40ace6c0ad43c26f721c7499fe408e639cde917b2350c9299635e6326559855896dae3c3ebf7440df54766b96c4276a7823e8f376a2b6a28b37b591f03412545
+ languageName: node
+ linkType: hard
+
+"hast-util-heading-rank@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "hast-util-heading-rank@npm:3.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/1879c84f629e73f1f13247ab349324355cd801363b44e3d46f763aa5c0ea3b42dcd47b46e5643a0502cf01a6b1fdb9208fd12852e44ca6c671b3e4bccf9369a1
+ languageName: node
+ linkType: hard
+
+"hast-util-is-element@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "hast-util-is-element@npm:3.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/f5361e4c9859c587ca8eb0d8343492f3077ccaa0f58a44cd09f35d5038f94d65152288dcd0c19336ef2c9491ec4d4e45fde2176b05293437021570aa0bc3613b
+ languageName: node
+ linkType: hard
+
+"hast-util-parse-selector@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "hast-util-parse-selector@npm:4.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/5e98168cb44470dc274aabf1a28317e4feb09b1eaf7a48bbaa8c1de1b43a89cd195cb1284e535698e658e3ec26ad91bc5e52c9563c36feb75abbc68aaf68fb9f
+ languageName: node
+ linkType: hard
+
+"hast-util-raw@npm:^9.0.0":
+ version: 9.1.0
+ resolution: "hast-util-raw@npm:9.1.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ hast-util-from-parse5: "npm:^8.0.0"
+ hast-util-to-parse5: "npm:^8.0.0"
+ html-void-elements: "npm:^3.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ parse5: "npm:^7.0.0"
+ unist-util-position: "npm:^5.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ web-namespaces: "npm:^2.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/d0d909d2aedecef6a06f0005cfae410d6475e6e182d768bde30c3af9fcbbe4f9beb0522bdc21d0679cb3c243c0df40385797ed255148d68b3d3f12e82d12aacc
+ languageName: node
+ linkType: hard
+
+"hast-util-to-jsx-runtime@npm:^2.0.0":
+ version: 2.3.6
+ resolution: "hast-util-to-jsx-runtime@npm:2.3.6"
+ dependencies:
+ "@types/estree": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ estree-util-is-identifier-name: "npm:^3.0.0"
+ hast-util-whitespace: "npm:^3.0.0"
+ mdast-util-mdx-expression: "npm:^2.0.0"
+ mdast-util-mdx-jsx: "npm:^3.0.0"
+ mdast-util-mdxjs-esm: "npm:^2.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ style-to-js: "npm:^1.0.0"
+ unist-util-position: "npm:^5.0.0"
+ vfile-message: "npm:^4.0.0"
+ checksum: 10c0/27297e02848fe37ef219be04a26ce708d17278a175a807689e94a821dcffc88aa506d62c3a85beed1f9a8544f7211bdcbcde0528b7b456a57c2e342c3fd11056
+ languageName: node
+ linkType: hard
+
+"hast-util-to-parse5@npm:^8.0.0":
+ version: 8.0.1
+ resolution: "hast-util-to-parse5@npm:8.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ web-namespaces: "npm:^2.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/8e8a1817c7ff8906ac66e7201b1b8d19d9e1b705e695a6e71620270d498d982ec1ecc0e227bd517f723e91e7fdfb90ef75f9ae64d14b3b65239a7d5e1194d7dd
+ languageName: node
+ linkType: hard
+
+"hast-util-to-string@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "hast-util-to-string@npm:3.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/b5fa1912a6ba6131affae52a0f4394406c4c0d23c2b0307f1d69988f1030c7bb830289303e67c5ad8f674f5f23a454c1dcd492c39e45a22c1f46d3c9bce5bd0c
+ languageName: node
+ linkType: hard
+
+"hast-util-to-text@npm:^4.0.0":
+ version: 4.0.2
+ resolution: "hast-util-to-text@npm:4.0.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/unist": "npm:^3.0.0"
+ hast-util-is-element: "npm:^3.0.0"
+ unist-util-find-after: "npm:^5.0.0"
+ checksum: 10c0/93ecc10e68fe5391c6e634140eb330942e71dea2724c8e0c647c73ed74a8ec930a4b77043b5081284808c96f73f2bee64ee416038ece75a63a467e8d14f09946
+ languageName: node
+ linkType: hard
+
+"hast-util-whitespace@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "hast-util-whitespace@npm:3.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ checksum: 10c0/b898bc9fe27884b272580d15260b6bbdabe239973a147e97fa98c45fa0ffec967a481aaa42291ec34fb56530dc2d484d473d7e2bae79f39c83f3762307edfea8
+ languageName: node
+ linkType: hard
+
+"hastscript@npm:^9.0.0":
+ version: 9.0.1
+ resolution: "hastscript@npm:9.0.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ comma-separated-tokens: "npm:^2.0.0"
+ hast-util-parse-selector: "npm:^4.0.0"
+ property-information: "npm:^7.0.0"
+ space-separated-tokens: "npm:^2.0.0"
+ checksum: 10c0/18dc8064e5c3a7a2ae862978e626b97a254e1c8a67ee9d0c9f06d373bba155ed805fc5b5ce21b990fb7bc174624889e5e1ce1cade264f1b1d58b48f994bc85ce
+ languageName: node
+ linkType: hard
+
+"highlight.js@npm:^11.7.0, highlight.js@npm:~11.11.0":
+ version: 11.11.1
+ resolution: "highlight.js@npm:11.11.1"
+ checksum: 10c0/40f53ac19dac079891fcefd5bd8a21cf2e8931fd47da5bd1dca73b7e4375c1defed0636fc39120c639b9c44119b7d110f7f0c15aa899557a5a1c8910f3c0144c
+ languageName: node
+ linkType: hard
+
+"html-url-attributes@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "html-url-attributes@npm:3.0.1"
+ checksum: 10c0/496e4908aa8b77665f348b4b03521901794f648b8ac34a581022cd6f2c97934d5c910cd91bc6593bbf2994687549037bc2520fcdc769b31484f29ffdd402acd0
+ languageName: node
+ linkType: hard
+
+"html-void-elements@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "html-void-elements@npm:3.0.0"
+ checksum: 10c0/a8b9ec5db23b7c8053876dad73a0336183e6162bf6d2677376d8b38d654fdc59ba74fdd12f8812688f7db6fad451210c91b300e472afc0909224e0a44c8610d2
+ languageName: node
+ linkType: hard
+
+"ignore@npm:^5.2.0":
+ version: 5.3.2
+ resolution: "ignore@npm:5.3.2"
+ checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337
+ languageName: node
+ linkType: hard
+
+"ignore@npm:^7.0.5":
+ version: 7.0.5
+ resolution: "ignore@npm:7.0.5"
+ checksum: 10c0/ae00db89fe873064a093b8999fe4cc284b13ef2a178636211842cceb650b9c3e390d3339191acb145d81ed5379d2074840cf0c33a20bdbd6f32821f79eb4ad5d
+ languageName: node
+ linkType: hard
+
+"import-fresh@npm:^3.2.1":
+ version: 3.3.1
+ resolution: "import-fresh@npm:3.3.1"
+ dependencies:
+ parent-module: "npm:^1.0.0"
+ resolve-from: "npm:^4.0.0"
+ checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec
+ languageName: node
+ linkType: hard
+
+"imurmurhash@npm:^0.1.4":
+ version: 0.1.4
+ resolution: "imurmurhash@npm:0.1.4"
+ checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6
+ languageName: node
+ linkType: hard
+
+"inline-style-parser@npm:0.2.7":
+ version: 0.2.7
+ resolution: "inline-style-parser@npm:0.2.7"
+ checksum: 10c0/d884d76f84959517430ae6c22f0bda59bb3f58f539f99aac75a8d786199ec594ed648c6ab4640531f9fc244b0ed5cd8c458078e592d016ef06de793beb1debff
+ languageName: node
+ linkType: hard
+
+"internal-slot@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "internal-slot@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ hasown: "npm:^2.0.2"
+ side-channel: "npm:^1.1.0"
+ checksum: 10c0/03966f5e259b009a9bf1a78d60da920df198af4318ec004f57b8aef1dd3fe377fbc8cce63a96e8c810010302654de89f9e19de1cd8ad0061d15be28a695465c7
+ languageName: node
+ linkType: hard
+
+"is-alphabetical@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-alphabetical@npm:2.0.1"
+ checksum: 10c0/932367456f17237533fd1fc9fe179df77957271020b83ea31da50e5cc472d35ef6b5fb8147453274ffd251134472ce24eb6f8d8398d96dee98237cdb81a6c9a7
+ languageName: node
+ linkType: hard
+
+"is-alphanumerical@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-alphanumerical@npm:2.0.1"
+ dependencies:
+ is-alphabetical: "npm:^2.0.0"
+ is-decimal: "npm:^2.0.0"
+ checksum: 10c0/4b35c42b18e40d41378293f82a3ecd9de77049b476f748db5697c297f686e1e05b072a6aaae2d16f54d2a57f85b00cbbe755c75f6d583d1c77d6657bd0feb5a2
+ languageName: node
+ linkType: hard
+
+"is-array-buffer@npm:^3.0.4, is-array-buffer@npm:^3.0.5":
+ version: 3.0.5
+ resolution: "is-array-buffer@npm:3.0.5"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ get-intrinsic: "npm:^1.2.6"
+ checksum: 10c0/c5c9f25606e86dbb12e756694afbbff64bc8b348d1bc989324c037e1068695131930199d6ad381952715dad3a9569333817f0b1a72ce5af7f883ce802e49c83d
+ languageName: node
+ linkType: hard
+
+"is-arrayish@npm:^0.3.1":
+ version: 0.3.4
+ resolution: "is-arrayish@npm:0.3.4"
+ checksum: 10c0/1fa672a2f0bedb74154440310f616c0b6e53a95cf0625522ae050f06626d1cabd1a3d8085c882dc45c61ad0e7df2529aff122810b3b4a552880bf170d6df94e0
+ languageName: node
+ linkType: hard
+
+"is-async-function@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "is-async-function@npm:2.1.1"
+ dependencies:
+ async-function: "npm:^1.0.0"
+ call-bound: "npm:^1.0.3"
+ get-proto: "npm:^1.0.1"
+ has-tostringtag: "npm:^1.0.2"
+ safe-regex-test: "npm:^1.1.0"
+ checksum: 10c0/d70c236a5e82de6fc4d44368ffd0c2fee2b088b893511ce21e679da275a5ecc6015ff59a7d7e1bdd7ca39f71a8dbdd253cf8cce5c6b3c91cdd5b42b5ce677298
+ languageName: node
+ linkType: hard
+
+"is-bigint@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "is-bigint@npm:1.1.0"
+ dependencies:
+ has-bigints: "npm:^1.0.2"
+ checksum: 10c0/f4f4b905ceb195be90a6ea7f34323bf1c18e3793f18922e3e9a73c684c29eeeeff5175605c3a3a74cc38185fe27758f07efba3dbae812e5c5afbc0d2316b40e4
+ languageName: node
+ linkType: hard
+
+"is-binary-path@npm:~2.1.0":
+ version: 2.1.0
+ resolution: "is-binary-path@npm:2.1.0"
+ dependencies:
+ binary-extensions: "npm:^2.0.0"
+ checksum: 10c0/a16eaee59ae2b315ba36fad5c5dcaf8e49c3e27318f8ab8fa3cdb8772bf559c8d1ba750a589c2ccb096113bb64497084361a25960899cb6172a6925ab6123d38
+ languageName: node
+ linkType: hard
+
+"is-boolean-object@npm:^1.2.1":
+ version: 1.2.2
+ resolution: "is-boolean-object@npm:1.2.2"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/36ff6baf6bd18b3130186990026f5a95c709345c39cd368468e6c1b6ab52201e9fd26d8e1f4c066357b4938b0f0401e1a5000e08257787c1a02f3a719457001e
+ languageName: node
+ linkType: hard
+
+"is-buffer@npm:^2.0.0":
+ version: 2.0.5
+ resolution: "is-buffer@npm:2.0.5"
+ checksum: 10c0/e603f6fced83cf94c53399cff3bda1a9f08e391b872b64a73793b0928be3e5f047f2bcece230edb7632eaea2acdbfcb56c23b33d8a20c820023b230f1485679a
+ languageName: node
+ linkType: hard
+
+"is-bun-module@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "is-bun-module@npm:2.0.0"
+ dependencies:
+ semver: "npm:^7.7.1"
+ checksum: 10c0/7d27a0679cfa5be1f5052650391f9b11040cd70c48d45112e312c56bc6b6ca9c9aea70dcce6cc40b1e8947bfff8567a5c5715d3b066fb478522dab46ea379240
+ languageName: node
+ linkType: hard
+
+"is-callable@npm:^1.2.7":
+ version: 1.2.7
+ resolution: "is-callable@npm:1.2.7"
+ checksum: 10c0/ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f
+ languageName: node
+ linkType: hard
+
+"is-core-module@npm:^2.13.0, is-core-module@npm:^2.16.1":
+ version: 2.16.1
+ resolution: "is-core-module@npm:2.16.1"
+ dependencies:
+ hasown: "npm:^2.0.2"
+ checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd
+ languageName: node
+ linkType: hard
+
+"is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "is-data-view@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.2.6"
+ is-typed-array: "npm:^1.1.13"
+ checksum: 10c0/ef3548a99d7e7f1370ce21006baca6d40c73e9f15c941f89f0049c79714c873d03b02dae1c64b3f861f55163ecc16da06506c5b8a1d4f16650b3d9351c380153
+ languageName: node
+ linkType: hard
+
+"is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "is-date-object@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/1a4d199c8e9e9cac5128d32e6626fa7805175af9df015620ac0d5d45854ccf348ba494679d872d37301032e35a54fc7978fba1687e8721b2139aea7870cafa2f
+ languageName: node
+ linkType: hard
+
+"is-decimal@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-decimal@npm:2.0.1"
+ checksum: 10c0/8085dd66f7d82f9de818fba48b9e9c0429cb4291824e6c5f2622e96b9680b54a07a624cfc663b24148b8e853c62a1c987cfe8b0b5a13f5156991afaf6736e334
+ languageName: node
+ linkType: hard
+
+"is-extendable@npm:^0.1.0":
+ version: 0.1.1
+ resolution: "is-extendable@npm:0.1.1"
+ checksum: 10c0/dd5ca3994a28e1740d1e25192e66eed128e0b2ff161a7ea348e87ae4f616554b486854de423877a2a2c171d5f7cd6e8093b91f54533bc88a59ee1c9838c43879
+ languageName: node
+ linkType: hard
+
+"is-extglob@npm:^2.1.1":
+ version: 2.1.1
+ resolution: "is-extglob@npm:2.1.1"
+ checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912
+ languageName: node
+ linkType: hard
+
+"is-finalizationregistry@npm:^1.1.0":
+ version: 1.1.1
+ resolution: "is-finalizationregistry@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ checksum: 10c0/818dff679b64f19e228a8205a1e2d09989a98e98def3a817f889208cfcbf918d321b251aadf2c05918194803ebd2eb01b14fc9d0b2bea53d984f4137bfca5e97
+ languageName: node
+ linkType: hard
+
+"is-generator-function@npm:^1.0.10":
+ version: 1.1.2
+ resolution: "is-generator-function@npm:1.1.2"
+ dependencies:
+ call-bound: "npm:^1.0.4"
+ generator-function: "npm:^2.0.0"
+ get-proto: "npm:^1.0.1"
+ has-tostringtag: "npm:^1.0.2"
+ safe-regex-test: "npm:^1.1.0"
+ checksum: 10c0/83da102e89c3e3b71d67b51d47c9f9bc862bceb58f87201727e27f7fa19d1d90b0ab223644ecaee6fc6e3d2d622bb25c966fbdaf87c59158b01ce7c0fe2fa372
+ languageName: node
+ linkType: hard
+
+"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1":
+ version: 4.0.3
+ resolution: "is-glob@npm:4.0.3"
+ dependencies:
+ is-extglob: "npm:^2.1.1"
+ checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a
+ languageName: node
+ linkType: hard
+
+"is-hexadecimal@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "is-hexadecimal@npm:2.0.1"
+ checksum: 10c0/3eb60fe2f1e2bbc760b927dcad4d51eaa0c60138cf7fc671803f66353ad90c301605b502c7ea4c6bb0548e1c7e79dfd37b73b632652e3b76030bba603a7e9626
+ languageName: node
+ linkType: hard
+
+"is-map@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "is-map@npm:2.0.3"
+ checksum: 10c0/2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc
+ languageName: node
+ linkType: hard
+
+"is-negative-zero@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "is-negative-zero@npm:2.0.3"
+ checksum: 10c0/bcdcf6b8b9714063ffcfa9929c575ac69bfdabb8f4574ff557dfc086df2836cf07e3906f5bbc4f2a5c12f8f3ba56af640c843cdfc74da8caed86c7c7d66fd08e
+ languageName: node
+ linkType: hard
+
+"is-number-object@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-number-object@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/97b451b41f25135ff021d85c436ff0100d84a039bb87ffd799cbcdbea81ef30c464ced38258cdd34f080be08fc3b076ca1f472086286d2aa43521d6ec6a79f53
+ languageName: node
+ linkType: hard
+
+"is-number@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "is-number@npm:7.0.0"
+ checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811
+ languageName: node
+ linkType: hard
+
+"is-plain-obj@npm:^4.0.0":
+ version: 4.1.0
+ resolution: "is-plain-obj@npm:4.1.0"
+ checksum: 10c0/32130d651d71d9564dc88ba7e6fda0e91a1010a3694648e9f4f47bb6080438140696d3e3e15c741411d712e47ac9edc1a8a9de1fe76f3487b0d90be06ac9975e
+ languageName: node
+ linkType: hard
+
+"is-regex@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "is-regex@npm:1.2.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ gopd: "npm:^1.2.0"
+ has-tostringtag: "npm:^1.0.2"
+ hasown: "npm:^2.0.2"
+ checksum: 10c0/1d3715d2b7889932349241680032e85d0b492cfcb045acb75ffc2c3085e8d561184f1f7e84b6f8321935b4aea39bc9c6ba74ed595b57ce4881a51dfdbc214e04
+ languageName: node
+ linkType: hard
+
+"is-set@npm:^2.0.3":
+ version: 2.0.3
+ resolution: "is-set@npm:2.0.3"
+ checksum: 10c0/f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7
+ languageName: node
+ linkType: hard
+
+"is-shared-array-buffer@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "is-shared-array-buffer@npm:1.0.4"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ checksum: 10c0/65158c2feb41ff1edd6bbd6fd8403a69861cf273ff36077982b5d4d68e1d59278c71691216a4a64632bd76d4792d4d1d2553901b6666d84ade13bba5ea7bc7db
+ languageName: node
+ linkType: hard
+
+"is-string@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-string@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/2f518b4e47886bb81567faba6ffd0d8a8333cf84336e2e78bf160693972e32ad00fe84b0926491cc598dee576fdc55642c92e62d0cbe96bf36f643b6f956f94d
+ languageName: node
+ linkType: hard
+
+"is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-symbol@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ has-symbols: "npm:^1.1.0"
+ safe-regex-test: "npm:^1.1.0"
+ checksum: 10c0/f08f3e255c12442e833f75a9e2b84b2d4882fdfd920513cf2a4a2324f0a5b076c8fd913778e3ea5d258d5183e9d92c0cd20e04b03ab3df05316b049b2670af1e
+ languageName: node
+ linkType: hard
+
+"is-typed-array@npm:^1.1.13, is-typed-array@npm:^1.1.14, is-typed-array@npm:^1.1.15":
+ version: 1.1.15
+ resolution: "is-typed-array@npm:1.1.15"
+ dependencies:
+ which-typed-array: "npm:^1.1.16"
+ checksum: 10c0/415511da3669e36e002820584e264997ffe277ff136643a3126cc949197e6ca3334d0f12d084e83b1994af2e9c8141275c741cf2b7da5a2ff62dd0cac26f76c4
+ languageName: node
+ linkType: hard
+
+"is-weakmap@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "is-weakmap@npm:2.0.2"
+ checksum: 10c0/443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299
+ languageName: node
+ linkType: hard
+
+"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "is-weakref@npm:1.1.1"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ checksum: 10c0/8e0a9c07b0c780949a100e2cab2b5560a48ecd4c61726923c1a9b77b6ab0aa0046c9e7fb2206042296817045376dee2c8ab1dabe08c7c3dfbf195b01275a085b
+ languageName: node
+ linkType: hard
+
+"is-weakset@npm:^2.0.3":
+ version: 2.0.4
+ resolution: "is-weakset@npm:2.0.4"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ get-intrinsic: "npm:^1.2.6"
+ checksum: 10c0/6491eba08acb8dc9532da23cb226b7d0192ede0b88f16199e592e4769db0a077119c1f5d2283d1e0d16d739115f70046e887e477eb0e66cd90e1bb29f28ba647
+ languageName: node
+ linkType: hard
+
+"isarray@npm:^2.0.5":
+ version: 2.0.5
+ resolution: "isarray@npm:2.0.5"
+ checksum: 10c0/4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "isexe@npm:2.0.0"
+ checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d
+ languageName: node
+ linkType: hard
+
+"isexe@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "isexe@npm:4.0.0"
+ checksum: 10c0/5884815115bceac452877659a9c7726382531592f43dc29e5d48b7c4100661aed54018cb90bd36cb2eaeba521092570769167acbb95c18d39afdccbcca06c5ce
+ languageName: node
+ linkType: hard
+
+"iterator.prototype@npm:^1.1.5":
+ version: 1.1.5
+ resolution: "iterator.prototype@npm:1.1.5"
+ dependencies:
+ define-data-property: "npm:^1.1.4"
+ es-object-atoms: "npm:^1.0.0"
+ get-intrinsic: "npm:^1.2.6"
+ get-proto: "npm:^1.0.0"
+ has-symbols: "npm:^1.1.0"
+ set-function-name: "npm:^2.0.2"
+ checksum: 10c0/f7a262808e1b41049ab55f1e9c29af7ec1025a000d243b83edf34ce2416eedd56079b117fa59376bb4a724110690f13aa8427f2ee29a09eec63a7e72367626d0
+ languageName: node
+ linkType: hard
+
+"jiti@npm:^1.21.7":
+ version: 1.21.7
+ resolution: "jiti@npm:1.21.7"
+ bin:
+ jiti: bin/jiti.js
+ checksum: 10c0/77b61989c758ff32407cdae8ddc77f85e18e1a13fc4977110dbd2e05fc761842f5f71bce684d9a01316e1c4263971315a111385759951080bbfe17cbb5de8f7a
+ languageName: node
+ linkType: hard
+
+"js-tokens@npm:^3.0.0 || ^4.0.0":
+ version: 4.0.0
+ resolution: "js-tokens@npm:4.0.0"
+ checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed
+ languageName: node
+ linkType: hard
+
+"js-yaml@npm:^3.13.1":
+ version: 3.14.2
+ resolution: "js-yaml@npm:3.14.2"
+ dependencies:
+ argparse: "npm:^1.0.7"
+ esprima: "npm:^4.0.0"
+ bin:
+ js-yaml: bin/js-yaml.js
+ checksum: 10c0/3261f25912f5dd76605e5993d0a126c2b6c346311885d3c483706cd722efe34f697ea0331f654ce27c00a42b426e524518ec89d65ed02ea47df8ad26dcc8ce69
+ languageName: node
+ linkType: hard
+
+"js-yaml@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "js-yaml@npm:4.1.1"
+ dependencies:
+ argparse: "npm:^2.0.1"
+ bin:
+ js-yaml: bin/js-yaml.js
+ checksum: 10c0/561c7d7088c40a9bb53cc75becbfb1df6ae49b34b5e6e5a81744b14ae8667ec564ad2527709d1a6e7d5e5fa6d483aa0f373a50ad98d42fde368ec4a190d4fae7
+ languageName: node
+ linkType: hard
+
+"json-buffer@npm:3.0.1":
+ version: 3.0.1
+ resolution: "json-buffer@npm:3.0.1"
+ checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7
+ languageName: node
+ linkType: hard
+
+"json-schema-traverse@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "json-schema-traverse@npm:0.4.1"
+ checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce
+ languageName: node
+ linkType: hard
+
+"json-stable-stringify-without-jsonify@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "json-stable-stringify-without-jsonify@npm:1.0.1"
+ checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5
+ languageName: node
+ linkType: hard
+
+"json5@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "json5@npm:1.0.2"
+ dependencies:
+ minimist: "npm:^1.2.0"
+ bin:
+ json5: lib/cli.js
+ checksum: 10c0/9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f
+ languageName: node
+ linkType: hard
+
+"jsx-ast-utils@npm:^2.4.1 || ^3.0.0, jsx-ast-utils@npm:^3.3.5":
+ version: 3.3.5
+ resolution: "jsx-ast-utils@npm:3.3.5"
+ dependencies:
+ array-includes: "npm:^3.1.6"
+ array.prototype.flat: "npm:^1.3.1"
+ object.assign: "npm:^4.1.4"
+ object.values: "npm:^1.1.6"
+ checksum: 10c0/a32679e9cb55469cb6d8bbc863f7d631b2c98b7fc7bf172629261751a6e7bc8da6ae374ddb74d5fbd8b06cf0eb4572287b259813d92b36e384024ed35e4c13e1
+ languageName: node
+ linkType: hard
+
+"keyv@npm:^4.5.4":
+ version: 4.5.4
+ resolution: "keyv@npm:4.5.4"
+ dependencies:
+ json-buffer: "npm:3.0.1"
+ checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e
+ languageName: node
+ linkType: hard
+
+"kind-of@npm:^6.0.0, kind-of@npm:^6.0.2":
+ version: 6.0.3
+ resolution: "kind-of@npm:6.0.3"
+ checksum: 10c0/61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4
+ languageName: node
+ linkType: hard
+
+"kleur@npm:^4.0.3":
+ version: 4.1.5
+ resolution: "kleur@npm:4.1.5"
+ checksum: 10c0/e9de6cb49657b6fa70ba2d1448fd3d691a5c4370d8f7bbf1c2f64c24d461270f2117e1b0afe8cb3114f13bbd8e51de158c2a224953960331904e636a5e4c0f2a
+ languageName: node
+ linkType: hard
+
+"language-subtag-registry@npm:^0.3.20":
+ version: 0.3.23
+ resolution: "language-subtag-registry@npm:0.3.23"
+ checksum: 10c0/e9b05190421d2cd36dd6c95c28673019c927947cb6d94f40ba7e77a838629ee9675c94accf897fbebb07923187deb843b8fbb8935762df6edafe6c28dcb0b86c
+ languageName: node
+ linkType: hard
+
+"language-tags@npm:^1.0.9":
+ version: 1.0.9
+ resolution: "language-tags@npm:1.0.9"
+ dependencies:
+ language-subtag-registry: "npm:^0.3.20"
+ checksum: 10c0/9ab911213c4bd8bd583c850201c17794e52cb0660d1ab6e32558aadc8324abebf6844e46f92b80a5d600d0fbba7eface2c207bfaf270a1c7fd539e4c3a880bff
+ languageName: node
+ linkType: hard
+
+"levn@npm:^0.4.1":
+ version: 0.4.1
+ resolution: "levn@npm:0.4.1"
+ dependencies:
+ prelude-ls: "npm:^1.2.1"
+ type-check: "npm:~0.4.0"
+ checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e
+ languageName: node
+ linkType: hard
+
+"lilconfig@npm:^3.1.1, lilconfig@npm:^3.1.3":
+ version: 3.1.3
+ resolution: "lilconfig@npm:3.1.3"
+ checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc
+ languageName: node
+ linkType: hard
+
+"lines-and-columns@npm:^1.1.6":
+ version: 1.2.4
+ resolution: "lines-and-columns@npm:1.2.4"
+ checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d
+ languageName: node
+ linkType: hard
+
+"lit-element@npm:^4.2.0":
+ version: 4.2.2
+ resolution: "lit-element@npm:4.2.2"
+ dependencies:
+ "@lit-labs/ssr-dom-shim": "npm:^1.5.0"
+ "@lit/reactive-element": "npm:^2.1.0"
+ lit-html: "npm:^3.3.0"
+ checksum: 10c0/114ab5837f1f9e03a30b1ed1c055fa0e31f01e444464e5ab0453ef88be12d778508235533267c42614d323e3048ee58f865b5c612948a53bd6219abca404c710
+ languageName: node
+ linkType: hard
+
+"lit-html@npm:^3.3.0":
+ version: 3.3.2
+ resolution: "lit-html@npm:3.3.2"
+ dependencies:
+ "@types/trusted-types": "npm:^2.0.2"
+ checksum: 10c0/0a6763875acd03dfc5d4483ea74ca4bfe5d71a90b05bfc484e8201721c8603db982760fd27566a69a834f21d34437f7c390e21cd4c6bff149ca7e3a46d3b217a
+ languageName: node
+ linkType: hard
+
+"lit@npm:^3.2.1":
+ version: 3.3.2
+ resolution: "lit@npm:3.3.2"
+ dependencies:
+ "@lit/reactive-element": "npm:^2.1.0"
+ lit-element: "npm:^4.2.0"
+ lit-html: "npm:^3.3.0"
+ checksum: 10c0/50563fd9c7bf546f8fdc6a936321b5be581ce440a359b06048ae5d44c1ecf6c38c2ded708e97d36a1ce70da1a7ad569890e40e0fb5ed040ec42d5ed2365f468d
+ languageName: node
+ linkType: hard
+
+"locate-path@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "locate-path@npm:6.0.0"
+ dependencies:
+ p-locate: "npm:^5.0.0"
+ checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3
+ languageName: node
+ linkType: hard
+
+"lodash.merge@npm:^4.6.2":
+ version: 4.6.2
+ resolution: "lodash.merge@npm:4.6.2"
+ checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506
+ languageName: node
+ linkType: hard
+
+"longest-streak@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "longest-streak@npm:3.1.0"
+ checksum: 10c0/7c2f02d0454b52834d1bcedef79c557bd295ee71fdabb02d041ff3aa9da48a90b5df7c0409156dedbc4df9b65da18742652aaea4759d6ece01f08971af6a7eaa
+ languageName: node
+ linkType: hard
+
+"loose-envify@npm:^1.4.0":
+ version: 1.4.0
+ resolution: "loose-envify@npm:1.4.0"
+ dependencies:
+ js-tokens: "npm:^3.0.0 || ^4.0.0"
+ bin:
+ loose-envify: cli.js
+ checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e
+ languageName: node
+ linkType: hard
+
+"lowlight@npm:^3.0.0":
+ version: 3.3.0
+ resolution: "lowlight@npm:3.3.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ devlop: "npm:^1.0.0"
+ highlight.js: "npm:~11.11.0"
+ checksum: 10c0/9b796fa8443b0334ebf18bc57387c9ee31432d8c263cf2089d23e1087c653d708447284e0647bf993cb2cdc810e0b268a28f51ea27b4a624893b97bdd3f025f4
+ languageName: node
+ linkType: hard
+
+"lucide-react@npm:^0.474.0":
+ version: 0.474.0
+ resolution: "lucide-react@npm:0.474.0"
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ checksum: 10c0/60c88c251b2ed4d1074d24a7041122dc280c48cf68a1a25b23e35a296f49955e0edc22744f278929bc7e48dcd4248bed27d6a8227d5a42fc49fceb134194b310
+ languageName: node
+ linkType: hard
+
+"markdown-table@npm:^3.0.0":
+ version: 3.0.4
+ resolution: "markdown-table@npm:3.0.4"
+ checksum: 10c0/1257b31827629a54c24a5030a3dac952256c559174c95ce3ef89bebd6bff0cb1444b1fd667b1a1bb53307f83278111505b3e26f0c4e7b731e0060d435d2d930b
+ languageName: node
+ linkType: hard
+
+"math-intrinsics@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "math-intrinsics@npm:1.1.0"
+ checksum: 10c0/7579ff94e899e2f76ab64491d76cf606274c874d8f2af4a442c016bd85688927fcfca157ba6bf74b08e9439dc010b248ce05b96cc7c126a354c3bae7fcb48b7f
+ languageName: node
+ linkType: hard
+
+"mdast-util-find-and-replace@npm:^3.0.0":
+ version: 3.0.2
+ resolution: "mdast-util-find-and-replace@npm:3.0.2"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ escape-string-regexp: "npm:^5.0.0"
+ unist-util-is: "npm:^6.0.0"
+ unist-util-visit-parents: "npm:^6.0.0"
+ checksum: 10c0/c8417a35605d567772ff5c1aa08363ff3010b0d60c8ea68c53cba09bf25492e3dd261560425c1756535f3b7107f62e7ff3857cdd8fb1e62d1b2cc2ea6e074ca2
+ languageName: node
+ linkType: hard
+
+"mdast-util-from-markdown@npm:^1.0.0":
+ version: 1.3.1
+ resolution: "mdast-util-from-markdown@npm:1.3.1"
+ dependencies:
+ "@types/mdast": "npm:^3.0.0"
+ "@types/unist": "npm:^2.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ mdast-util-to-string: "npm:^3.1.0"
+ micromark: "npm:^3.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^1.0.0"
+ micromark-util-decode-string: "npm:^1.0.0"
+ micromark-util-normalize-identifier: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ unist-util-stringify-position: "npm:^3.0.0"
+ uvu: "npm:^0.5.0"
+ checksum: 10c0/f4e901bf2a2e93fe35a339e0cff581efacce2f7117cd5652e9a270847bd7e2508b3e717b7b4156af54d4f896d63033e06ff9fafbf59a1d46fe17dd5e2a3f7846
+ languageName: node
+ linkType: hard
+
+"mdast-util-from-markdown@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "mdast-util-from-markdown@npm:2.0.3"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ "@types/unist": "npm:^3.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-to-string: "npm:^4.0.0"
+ micromark: "npm:^4.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^2.0.0"
+ micromark-util-decode-string: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ unist-util-stringify-position: "npm:^4.0.0"
+ checksum: 10c0/d3eac9ac2b88e3b41fb85aa81c7bfd1f4f8a2fde497ad805e66fea7b2abfe486ffd94d2a20f9fd2951dcdebe4916f3bdcf851319891dd62d343e26c2f02583ba
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-autolink-literal@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "mdast-util-gfm-autolink-literal@npm:2.0.1"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ ccount: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-find-and-replace: "npm:^3.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ checksum: 10c0/963cd22bd42aebdec7bdd0a527c9494d024d1ad0739c43dc040fee35bdfb5e29c22564330a7418a72b5eab51d47a6eff32bc0255ef3ccb5cebfe8970e91b81b6
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-footnote@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "mdast-util-gfm-footnote@npm:2.1.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.1.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ checksum: 10c0/8ab965ee6be3670d76ec0e95b2ba3101fc7444eec47564943ab483d96ac17d29da2a4e6146a2a288be30c21b48c4f3938a1e54b9a46fbdd321d49a5bc0077ed0
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-strikethrough@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-strikethrough@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/b053e93d62c7545019bd914271ea9e5667ad3b3b57d16dbf68e56fea39a7e19b4a345e781312714eb3d43fdd069ff7ee22a3ca7f6149dfa774554f19ce3ac056
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-table@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-table@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ markdown-table: "npm:^3.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/128af47c503a53bd1c79f20642561e54a510ad5e2db1e418d28fefaf1294ab839e6c838e341aef5d7e404f9170b9ca3d1d89605f234efafde93ee51174a6e31e
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm-task-list-item@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "mdast-util-gfm-task-list-item@npm:2.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/258d725288482b636c0a376c296431390c14b4f29588675297cb6580a8598ed311fc73ebc312acfca12cc8546f07a3a285a53a3b082712e2cbf5c190d677d834
+ languageName: node
+ linkType: hard
+
+"mdast-util-gfm@npm:^3.0.0":
+ version: 3.1.0
+ resolution: "mdast-util-gfm@npm:3.1.0"
+ dependencies:
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-gfm-autolink-literal: "npm:^2.0.0"
+ mdast-util-gfm-footnote: "npm:^2.0.0"
+ mdast-util-gfm-strikethrough: "npm:^2.0.0"
+ mdast-util-gfm-table: "npm:^2.0.0"
+ mdast-util-gfm-task-list-item: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/4bedcfb6a20e39901c8772f0d2bb2d7a64ae87a54c13cbd92eec062cf470fbb68c2ad754e149af5b30794e2de61c978ab1de1ace03c0c40f443ca9b9b8044f81
+ languageName: node
+ linkType: hard
+
+"mdast-util-mdx-expression@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "mdast-util-mdx-expression@npm:2.0.1"
+ dependencies:
+ "@types/estree-jsx": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/9a1e57940f66431f10312fa239096efa7627f375e7933b5d3162c0b5c1712a72ac87447aff2b6838d2bbd5c1311b188718cc90b33b67dc67a88550e0a6ef6183
+ languageName: node
+ linkType: hard
+
+"mdast-util-mdx-jsx@npm:^3.0.0":
+ version: 3.2.0
+ resolution: "mdast-util-mdx-jsx@npm:3.2.0"
+ dependencies:
+ "@types/estree-jsx": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ "@types/unist": "npm:^3.0.0"
+ ccount: "npm:^2.0.0"
+ devlop: "npm:^1.1.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ parse-entities: "npm:^4.0.0"
+ stringify-entities: "npm:^4.0.0"
+ unist-util-stringify-position: "npm:^4.0.0"
+ vfile-message: "npm:^4.0.0"
+ checksum: 10c0/3acadaf3b962254f7ad2990fed4729961dc0217ca31fde9917986e880843f3ecf3392b1f22d569235cacd180d50894ad266db7af598aedca69d330d33c7ac613
+ languageName: node
+ linkType: hard
+
+"mdast-util-mdxjs-esm@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "mdast-util-mdxjs-esm@npm:2.0.1"
+ dependencies:
+ "@types/estree-jsx": "npm:^1.0.0"
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ checksum: 10c0/5bda92fc154141705af2b804a534d891f28dac6273186edf1a4c5e3f045d5b01dbcac7400d27aaf91b7e76e8dce007c7b2fdf136c11ea78206ad00bdf9db46bc
+ languageName: node
+ linkType: hard
+
+"mdast-util-phrasing@npm:^4.0.0":
+ version: 4.1.0
+ resolution: "mdast-util-phrasing@npm:4.1.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ unist-util-is: "npm:^6.0.0"
+ checksum: 10c0/bf6c31d51349aa3d74603d5e5a312f59f3f65662ed16c58017169a5fb0f84ca98578f626c5ee9e4aa3e0a81c996db8717096705521bddb4a0185f98c12c9b42f
+ languageName: node
+ linkType: hard
+
+"mdast-util-to-hast@npm:^13.0.0":
+ version: 13.2.1
+ resolution: "mdast-util-to-hast@npm:13.2.1"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ trim-lines: "npm:^3.0.0"
+ unist-util-position: "npm:^5.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/3eeaf28a5e84e1e08e6d54a1a8a06c0fca88cb5d36f4cf8086f0177248d1ce6e4e751f4ad0da19a3dea1c6ea61bd80784acc3ae021e44ceeb21aa5413a375e43
+ languageName: node
+ linkType: hard
+
+"mdast-util-to-markdown@npm:^2.0.0":
+ version: 2.1.2
+ resolution: "mdast-util-to-markdown@npm:2.1.2"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ "@types/unist": "npm:^3.0.0"
+ longest-streak: "npm:^3.0.0"
+ mdast-util-phrasing: "npm:^4.0.0"
+ mdast-util-to-string: "npm:^4.0.0"
+ micromark-util-classify-character: "npm:^2.0.0"
+ micromark-util-decode-string: "npm:^2.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ zwitch: "npm:^2.0.0"
+ checksum: 10c0/4649722a6099f12e797bd8d6469b2b43b44e526b5182862d9c7766a3431caad2c0112929c538a972f214e63c015395e5d3f54bd81d9ac1b16e6d8baaf582f749
+ languageName: node
+ linkType: hard
+
+"mdast-util-to-string@npm:^3.1.0":
+ version: 3.2.0
+ resolution: "mdast-util-to-string@npm:3.2.0"
+ dependencies:
+ "@types/mdast": "npm:^3.0.0"
+ checksum: 10c0/112f4bf0f6758dcb95deffdcf37afba7eaecdfe2ee13252de031723094d4d55220e147326690a8b91244758e2d678e7aeb1fdd0fa6ef3317c979bc42effd9a21
+ languageName: node
+ linkType: hard
+
+"mdast-util-to-string@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "mdast-util-to-string@npm:4.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ checksum: 10c0/2d3c1af29bf3fe9c20f552ee9685af308002488f3b04b12fa66652c9718f66f41a32f8362aa2d770c3ff464c034860b41715902ada2306bb0a055146cef064d7
+ languageName: node
+ linkType: hard
+
+"merge2@npm:^1.3.0":
+ version: 1.4.1
+ resolution: "merge2@npm:1.4.1"
+ checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb
+ languageName: node
+ linkType: hard
+
+"micromark-core-commonmark@npm:^1.0.1":
+ version: 1.1.0
+ resolution: "micromark-core-commonmark@npm:1.1.0"
+ dependencies:
+ decode-named-character-reference: "npm:^1.0.0"
+ micromark-factory-destination: "npm:^1.0.0"
+ micromark-factory-label: "npm:^1.0.0"
+ micromark-factory-space: "npm:^1.0.0"
+ micromark-factory-title: "npm:^1.0.0"
+ micromark-factory-whitespace: "npm:^1.0.0"
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-chunked: "npm:^1.0.0"
+ micromark-util-classify-character: "npm:^1.0.0"
+ micromark-util-html-tag-name: "npm:^1.0.0"
+ micromark-util-normalize-identifier: "npm:^1.0.0"
+ micromark-util-resolve-all: "npm:^1.0.0"
+ micromark-util-subtokenize: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.1"
+ uvu: "npm:^0.5.0"
+ checksum: 10c0/b3bf7b7004ce7dbb3ae151dcca4db1d12546f1b943affb2418da4b90b9ce59357373c433ee2eea4c868aee0791dafa355aeed19f5ef2b0acaf271f32f1ecbe6a
+ languageName: node
+ linkType: hard
+
+"micromark-core-commonmark@npm:^2.0.0":
+ version: 2.0.3
+ resolution: "micromark-core-commonmark@npm:2.0.3"
+ dependencies:
+ decode-named-character-reference: "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ micromark-factory-destination: "npm:^2.0.0"
+ micromark-factory-label: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-factory-title: "npm:^2.0.0"
+ micromark-factory-whitespace: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-classify-character: "npm:^2.0.0"
+ micromark-util-html-tag-name: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-resolve-all: "npm:^2.0.0"
+ micromark-util-subtokenize: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bd4a794fdc9e88dbdf59eaf1c507ddf26e5f7ddf4e52566c72239c0f1b66adbcd219ba2cd42350debbe24471434d5f5e50099d2b3f4e5762ca222ba8e5b549ee
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-autolink-literal@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-autolink-literal@npm:2.1.0"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/84e6fbb84ea7c161dfa179665dc90d51116de4c28f3e958260c0423e5a745372b7dcbc87d3cde98213b532e6812f847eef5ae561c9397d7f7da1e59872ef3efe
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-footnote@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-footnote@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-core-commonmark: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/d172e4218968b7371b9321af5cde8c77423f73b233b2b0fcf3ff6fd6f61d2e0d52c49123a9b7910612478bf1f0d5e88c75a3990dd68f70f3933fe812b9f77edc
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-strikethrough@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-strikethrough@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-classify-character: "npm:^2.0.0"
+ micromark-util-resolve-all: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/ef4f248b865bdda71303b494671b7487808a340b25552b11ca6814dff3fcfaab9be8d294643060bbdb50f79313e4a686ab18b99cbe4d3ee8a4170fcd134234fb
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-table@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "micromark-extension-gfm-table@npm:2.1.1"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/04bc00e19b435fa0add62cd029d8b7eb6137522f77832186b1d5ef34544a9bd030c9cf85e92ddfcc5c31f6f0a58a43d4b96dba4fc21316037c734630ee12c912
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-tagfilter@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "micromark-extension-gfm-tagfilter@npm:2.0.0"
+ dependencies:
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/995558843fff137ae4e46aecb878d8a4691cdf23527dcf1e2f0157d66786be9f7bea0109c52a8ef70e68e3f930af811828ba912239438e31a9cfb9981f44d34d
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm-task-list-item@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-extension-gfm-task-list-item@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/78aa537d929e9309f076ba41e5edc99f78d6decd754b6734519ccbbfca8abd52e1c62df68d41a6ae64d2a3fc1646cea955893c79680b0b4385ced4c52296181f
+ languageName: node
+ linkType: hard
+
+"micromark-extension-gfm@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "micromark-extension-gfm@npm:3.0.0"
+ dependencies:
+ micromark-extension-gfm-autolink-literal: "npm:^2.0.0"
+ micromark-extension-gfm-footnote: "npm:^2.0.0"
+ micromark-extension-gfm-strikethrough: "npm:^2.0.0"
+ micromark-extension-gfm-table: "npm:^2.0.0"
+ micromark-extension-gfm-tagfilter: "npm:^2.0.0"
+ micromark-extension-gfm-task-list-item: "npm:^2.0.0"
+ micromark-util-combine-extensions: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/970e28df6ebdd7c7249f52a0dda56e0566fbfa9ae56c8eeeb2445d77b6b89d44096880cd57a1c01e7821b1f4e31009109fbaca4e89731bff7b83b8519690e5d9
+ languageName: node
+ linkType: hard
+
+"micromark-factory-destination@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-factory-destination@npm:1.1.0"
+ dependencies:
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/71ebd9089bf0c9689b98ef42215c04032ae2701ae08c3546b663628553255dca18e5310dbdacddad3acd8de4f12a789835fff30dadc4da3c4e30387a75e6b488
+ languageName: node
+ linkType: hard
+
+"micromark-factory-destination@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-destination@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bbafcf869cee5bf511161354cb87d61c142592fbecea051000ff116068dc85216e6d48519d147890b9ea5d7e2864a6341c0c09d9948c203bff624a80a476023c
+ languageName: node
+ linkType: hard
+
+"micromark-factory-label@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-factory-label@npm:1.1.0"
+ dependencies:
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ uvu: "npm:^0.5.0"
+ checksum: 10c0/5e2cd2d8214bb92a34dfcedf9c7aecf565e3648650a3a6a0495ededf15f2318dd214dc069e3026402792cd5839d395313f8ef9c2e86ca34a8facaa0f75a77753
+ languageName: node
+ linkType: hard
+
+"micromark-factory-label@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-label@npm:2.0.1"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/0137716b4ecb428114165505e94a2f18855c8bbea21b07a8b5ce514b32a595ed789d2b967125718fc44c4197ceaa48f6609d58807a68e778138d2e6b91b824e8
+ languageName: node
+ linkType: hard
+
+"micromark-factory-space@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-factory-space@npm:1.1.0"
+ dependencies:
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/3da81187ce003dd4178c7adc4674052fb8befc8f1a700ae4c8227755f38581a4ae963866dc4857488d62d1dc9837606c9f2f435fa1332f62a0f1c49b83c6a822
+ languageName: node
+ linkType: hard
+
+"micromark-factory-space@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-space@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/f9ed43f1c0652d8d898de0ac2be3f77f776fffe7dd96bdbba1e02d7ce33d3853c6ff5daa52568fc4fa32cdf3a62d86b85ead9b9189f7211e1d69ff2163c450fb
+ languageName: node
+ linkType: hard
+
+"micromark-factory-title@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-factory-title@npm:1.1.0"
+ dependencies:
+ micromark-factory-space: "npm:^1.0.0"
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/cf8c687d1d5c3928846a4791d4a7e2f1d7bdd2397051e20d60f06b7565a48bf85198ab6f85735e997ab3f0cbb80b8b6391f4f7ebc0aae2f2f8c3a08541257bf6
+ languageName: node
+ linkType: hard
+
+"micromark-factory-title@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-title@npm:2.0.1"
+ dependencies:
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/e72fad8d6e88823514916890099a5af20b6a9178ccf78e7e5e05f4de99bb8797acb756257d7a3a57a53854cb0086bf8aab15b1a9e9db8982500dd2c9ff5948b6
+ languageName: node
+ linkType: hard
+
+"micromark-factory-whitespace@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-factory-whitespace@npm:1.1.0"
+ dependencies:
+ micromark-factory-space: "npm:^1.0.0"
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/7248cc4534f9befb38c6f398b6e38efd3199f1428fc214c9cb7ed5b6e9fa7a82c0d8cdfa9bcacde62887c9a7c8c46baf5c318b2ae8f701afbccc8ad702e92dce
+ languageName: node
+ linkType: hard
+
+"micromark-factory-whitespace@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-factory-whitespace@npm:2.0.1"
+ dependencies:
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/20a1ec58698f24b766510a309b23a10175034fcf1551eaa9da3adcbed3e00cd53d1ebe5f030cf873f76a1cec3c34eb8c50cc227be3344caa9ed25d56cf611224
+ languageName: node
+ linkType: hard
+
+"micromark-util-character@npm:^1.0.0":
+ version: 1.2.0
+ resolution: "micromark-util-character@npm:1.2.0"
+ dependencies:
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/3390a675a50731b58a8e5493cd802e190427f10fa782079b455b00f6b54e406e36882df7d4a3bd32b709f7a2c3735b4912597ebc1c0a99566a8d8d0b816e2cd4
+ languageName: node
+ linkType: hard
+
+"micromark-util-character@npm:^2.0.0":
+ version: 2.1.1
+ resolution: "micromark-util-character@npm:2.1.1"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/d3fe7a5e2c4060fc2a076f9ce699c82a2e87190a3946e1e5eea77f563869b504961f5668d9c9c014724db28ac32fa909070ea8b30c3a39bd0483cc6c04cc76a1
+ languageName: node
+ linkType: hard
+
+"micromark-util-chunked@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-chunked@npm:1.1.0"
+ dependencies:
+ micromark-util-symbol: "npm:^1.0.0"
+ checksum: 10c0/59534cf4aaf481ed58d65478d00eae0080df9b5816673f79b5ddb0cea263e5a9ee9cbb6cc565daf1eb3c8c4ff86fc4e25d38a0577539655cda823a4249efd358
+ languageName: node
+ linkType: hard
+
+"micromark-util-chunked@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-chunked@npm:2.0.1"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/b68c0c16fe8106949537bdcfe1be9cf36c0ccd3bc54c4007003cb0984c3750b6cdd0fd77d03f269a3382b85b0de58bde4f6eedbe7ecdf7244759112289b1ab56
+ languageName: node
+ linkType: hard
+
+"micromark-util-classify-character@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-classify-character@npm:1.1.0"
+ dependencies:
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/3266453dc0fdaf584e24c9b3c91d1ed180f76b5856699c51fd2549305814fcab7ec52afb4d3e83d002a9115cd2d2b2ffdc9c0b38ed85120822bf515cc00636ec
+ languageName: node
+ linkType: hard
+
+"micromark-util-classify-character@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-classify-character@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/8a02e59304005c475c332f581697e92e8c585bcd45d5d225a66c1c1b14ab5a8062705188c2ccec33cc998d33502514121478b2091feddbc751887fc9c290ed08
+ languageName: node
+ linkType: hard
+
+"micromark-util-combine-extensions@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-combine-extensions@npm:1.1.0"
+ dependencies:
+ micromark-util-chunked: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/0bc572fab3fe77f533c29aa1b75cb847b9fc9455f67a98623ef9740b925c0b0426ad9f09bbb56f1e844ea9ebada7873d1f06d27f7c979a917692b273c4b69e31
+ languageName: node
+ linkType: hard
+
+"micromark-util-combine-extensions@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-combine-extensions@npm:2.0.1"
+ dependencies:
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/f15e282af24c8372cbb10b9b0b3e2c0aa681fea0ca323a44d6bc537dc1d9382c819c3689f14eaa000118f5a163245358ce6276b2cda9a84439cdb221f5d86ae7
+ languageName: node
+ linkType: hard
+
+"micromark-util-decode-numeric-character-reference@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-decode-numeric-character-reference@npm:1.1.0"
+ dependencies:
+ micromark-util-symbol: "npm:^1.0.0"
+ checksum: 10c0/64ef2575e3fc2426976c19e16973348f20b59ddd5543f1467ac2e251f29e0a91f12089703d29ae985b0b9a408ee0d72f06d04ed3920811aa2402aabca3bdf9e4
+ languageName: node
+ linkType: hard
+
+"micromark-util-decode-numeric-character-reference@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "micromark-util-decode-numeric-character-reference@npm:2.0.2"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/9c8a9f2c790e5593ffe513901c3a110e9ec8882a08f466da014112a25e5059b51551ca0aeb7ff494657d86eceb2f02ee556c6558b8d66aadc61eae4a240da0df
+ languageName: node
+ linkType: hard
+
+"micromark-util-decode-string@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-decode-string@npm:1.1.0"
+ dependencies:
+ decode-named-character-reference: "npm:^1.0.0"
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ checksum: 10c0/757a0aaa5ad6c50c7480bd75371d407ac75f5022cd4404aba07adadf1448189502aea9bb7b2d09d25e18745e0abf72b95506b6beb184bcccabe919e48e3a5df7
+ languageName: node
+ linkType: hard
+
+"micromark-util-decode-string@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-decode-string@npm:2.0.1"
+ dependencies:
+ decode-named-character-reference: "npm:^1.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/f24d75b2e5310be6e7b6dee532e0d17d3bf46996841d6295f2a9c87a2046fff4ab603c52ab9d7a7a6430a8b787b1574ae895849c603d262d1b22eef71736b5cb
+ languageName: node
+ linkType: hard
+
+"micromark-util-encode@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-encode@npm:1.1.0"
+ checksum: 10c0/9878c9bc96999d45626a7597fffac85348ea842dce75d2417345cbf070a9941c62477bd0963bef37d4f0fd29f2982be6ddf416d62806f00ccb334af9d6ee87e7
+ languageName: node
+ linkType: hard
+
+"micromark-util-encode@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-encode@npm:2.0.1"
+ checksum: 10c0/b2b29f901093845da8a1bf997ea8b7f5e061ffdba85070dfe14b0197c48fda64ffcf82bfe53c90cf9dc185e69eef8c5d41cae3ba918b96bc279326921b59008a
+ languageName: node
+ linkType: hard
+
+"micromark-util-html-tag-name@npm:^1.0.0":
+ version: 1.2.0
+ resolution: "micromark-util-html-tag-name@npm:1.2.0"
+ checksum: 10c0/15421869678d36b4fe51df453921e8186bff514a14e9f79f32b7e1cdd67874e22a66ad34a7f048dd132cbbbfc7c382ae2f777a2bfd1f245a47705dc1c6d4f199
+ languageName: node
+ linkType: hard
+
+"micromark-util-html-tag-name@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-html-tag-name@npm:2.0.1"
+ checksum: 10c0/ae80444db786fde908e9295f19a27a4aa304171852c77414516418650097b8afb401961c9edb09d677b06e97e8370cfa65638dde8438ebd41d60c0a8678b85b9
+ languageName: node
+ linkType: hard
+
+"micromark-util-normalize-identifier@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-normalize-identifier@npm:1.1.0"
+ dependencies:
+ micromark-util-symbol: "npm:^1.0.0"
+ checksum: 10c0/a9657321a2392584e4d978061882117a84db7d2c2c1c052c0f5d25da089d463edb9f956d5beaf7f5768984b6f72d046d59b5972951ec7bf25397687a62b8278a
+ languageName: node
+ linkType: hard
+
+"micromark-util-normalize-identifier@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-normalize-identifier@npm:2.0.1"
+ dependencies:
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/5299265fa360769fc499a89f40142f10a9d4a5c3dd8e6eac8a8ef3c2e4a6570e4c009cf75ea46dce5ee31c01f25587bde2f4a5cc0a935584ae86dd857f2babbd
+ languageName: node
+ linkType: hard
+
+"micromark-util-resolve-all@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-resolve-all@npm:1.1.0"
+ dependencies:
+ micromark-util-types: "npm:^1.0.0"
+ checksum: 10c0/b5c95484c06e87bbbb60d8430eb030a458733a5270409f4c67892d1274737087ca6a7ca888987430e57cf1dcd44bb16390d3b3936a2bf07f7534ec8f52ce43c9
+ languageName: node
+ linkType: hard
+
+"micromark-util-resolve-all@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-resolve-all@npm:2.0.1"
+ dependencies:
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bb6ca28764696bb479dc44a2d5b5fe003e7177aeae1d6b0d43f24cc223bab90234092d9c3ce4a4d2b8df095ccfd820537b10eb96bb7044d635f385d65a4c984a
+ languageName: node
+ linkType: hard
+
+"micromark-util-sanitize-uri@npm:^1.0.0":
+ version: 1.2.0
+ resolution: "micromark-util-sanitize-uri@npm:1.2.0"
+ dependencies:
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-encode: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ checksum: 10c0/dbdb98248e9f0408c7a00f1c1cd805775b41d213defd659533835f34b38da38e8f990bf7b3f782e96bffbc549aec9c3ecdab197d4ad5adbfe08f814a70327b6e
+ languageName: node
+ linkType: hard
+
+"micromark-util-sanitize-uri@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-sanitize-uri@npm:2.0.1"
+ dependencies:
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-encode: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ checksum: 10c0/60e92166e1870fd4f1961468c2651013ff760617342918e0e0c3c4e872433aa2e60c1e5a672bfe5d89dc98f742d6b33897585cf86ae002cda23e905a3c02527c
+ languageName: node
+ linkType: hard
+
+"micromark-util-subtokenize@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-subtokenize@npm:1.1.0"
+ dependencies:
+ micromark-util-chunked: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.0"
+ uvu: "npm:^0.5.0"
+ checksum: 10c0/f292b1b162845db50d36255c9d4c4c6d47931fbca3ac98a80c7e536d2163233fd662f8ca0479ee2b80f145c66a1394c7ed17dfce801439741211015e77e3901e
+ languageName: node
+ linkType: hard
+
+"micromark-util-subtokenize@npm:^2.0.0":
+ version: 2.1.0
+ resolution: "micromark-util-subtokenize@npm:2.1.0"
+ dependencies:
+ devlop: "npm:^1.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/bee69eece4393308e657c293ba80d92ebcb637e5f55e21dcf9c3fa732b91a8eda8ac248d76ff375e675175bfadeae4712e5158ef97eef1111789da1ce7ab5067
+ languageName: node
+ linkType: hard
+
+"micromark-util-symbol@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "micromark-util-symbol@npm:1.1.0"
+ checksum: 10c0/10ceaed33a90e6bfd3a5d57053dbb53f437d4809cc11430b5a09479c0ba601577059be9286df4a7eae6e350a60a2575dc9fa9d9872b5b8d058c875e075c33803
+ languageName: node
+ linkType: hard
+
+"micromark-util-symbol@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "micromark-util-symbol@npm:2.0.1"
+ checksum: 10c0/f2d1b207771e573232436618e78c5e46cd4b5c560dd4a6d63863d58018abbf49cb96ec69f7007471e51434c60de3c9268ef2bf46852f26ff4aacd10f9da16fe9
+ languageName: node
+ linkType: hard
+
+"micromark-util-types@npm:^1.0.0, micromark-util-types@npm:^1.0.1":
+ version: 1.1.0
+ resolution: "micromark-util-types@npm:1.1.0"
+ checksum: 10c0/a9749cb0a12a252ff536baabcb7012421b6fad4d91a5fdd80d7b33dc7b4c22e2d0c4637dfe5b902d00247fe6c9b01f4a24fce6b572b16ccaa4da90e6ce2a11e4
+ languageName: node
+ linkType: hard
+
+"micromark-util-types@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "micromark-util-types@npm:2.0.2"
+ checksum: 10c0/c8c15b96c858db781c4393f55feec10004bf7df95487636c9a9f7209e51002a5cca6a047c5d2a5dc669ff92da20e57aaa881e81a268d9ccadb647f9dce305298
+ languageName: node
+ linkType: hard
+
+"micromark@npm:^3.0.0":
+ version: 3.2.0
+ resolution: "micromark@npm:3.2.0"
+ dependencies:
+ "@types/debug": "npm:^4.0.0"
+ debug: "npm:^4.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ micromark-core-commonmark: "npm:^1.0.1"
+ micromark-factory-space: "npm:^1.0.0"
+ micromark-util-character: "npm:^1.0.0"
+ micromark-util-chunked: "npm:^1.0.0"
+ micromark-util-combine-extensions: "npm:^1.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^1.0.0"
+ micromark-util-encode: "npm:^1.0.0"
+ micromark-util-normalize-identifier: "npm:^1.0.0"
+ micromark-util-resolve-all: "npm:^1.0.0"
+ micromark-util-sanitize-uri: "npm:^1.0.0"
+ micromark-util-subtokenize: "npm:^1.0.0"
+ micromark-util-symbol: "npm:^1.0.0"
+ micromark-util-types: "npm:^1.0.1"
+ uvu: "npm:^0.5.0"
+ checksum: 10c0/f243e805d1b3cc699fddae2de0b1492bc82462f1a709d7ae5c82039f88b1e009c959100184717e748be057b5f88603289d5681679a4e6fbabcd037beb34bc744
+ languageName: node
+ linkType: hard
+
+"micromark@npm:^4.0.0":
+ version: 4.0.2
+ resolution: "micromark@npm:4.0.2"
+ dependencies:
+ "@types/debug": "npm:^4.0.0"
+ debug: "npm:^4.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ devlop: "npm:^1.0.0"
+ micromark-core-commonmark: "npm:^2.0.0"
+ micromark-factory-space: "npm:^2.0.0"
+ micromark-util-character: "npm:^2.0.0"
+ micromark-util-chunked: "npm:^2.0.0"
+ micromark-util-combine-extensions: "npm:^2.0.0"
+ micromark-util-decode-numeric-character-reference: "npm:^2.0.0"
+ micromark-util-encode: "npm:^2.0.0"
+ micromark-util-normalize-identifier: "npm:^2.0.0"
+ micromark-util-resolve-all: "npm:^2.0.0"
+ micromark-util-sanitize-uri: "npm:^2.0.0"
+ micromark-util-subtokenize: "npm:^2.0.0"
+ micromark-util-symbol: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ checksum: 10c0/07462287254219d6eda6eac8a3cebaff2994e0575499e7088027b825105e096e4f51e466b14b2a81b71933a3b6c48ee069049d87bc2c2127eee50d9cc69e8af6
+ languageName: node
+ linkType: hard
+
+"micromatch@npm:^4.0.4, micromatch@npm:^4.0.8":
+ version: 4.0.8
+ resolution: "micromatch@npm:4.0.8"
+ dependencies:
+ braces: "npm:^3.0.3"
+ picomatch: "npm:^2.3.1"
+ checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^10.2.2":
+ version: 10.2.4
+ resolution: "minimatch@npm:10.2.4"
+ dependencies:
+ brace-expansion: "npm:^5.0.2"
+ checksum: 10c0/35f3dfb7b99b51efd46afd378486889f590e7efb10e0f6a10ba6800428cf65c9a8dedb74427d0570b318d749b543dc4e85f06d46d2858bc8cac7e1eb49a95945
+ languageName: node
+ linkType: hard
+
+"minimatch@npm:^3.1.2, minimatch@npm:^3.1.3":
+ version: 3.1.5
+ resolution: "minimatch@npm:3.1.5"
+ dependencies:
+ brace-expansion: "npm:^1.1.7"
+ checksum: 10c0/2ecbdc0d33f07bddb0315a8b5afbcb761307a8778b48f0b312418ccbced99f104a2d17d8aca7573433c70e8ccd1c56823a441897a45e384ea76ef401a26ace70
+ languageName: node
+ linkType: hard
+
+"minimist@npm:^1.2.0, minimist@npm:^1.2.6":
+ version: 1.2.8
+ resolution: "minimist@npm:1.2.8"
+ checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6
+ languageName: node
+ linkType: hard
+
+"minipass@npm:^7.0.4, minipass@npm:^7.1.2":
+ version: 7.1.3
+ resolution: "minipass@npm:7.1.3"
+ checksum: 10c0/539da88daca16533211ea5a9ee98dc62ff5742f531f54640dd34429e621955e91cc280a91a776026264b7f9f6735947629f920944e9c1558369e8bf22eb33fbb
+ languageName: node
+ linkType: hard
+
+"minisearch@npm:^7.2.0":
+ version: 7.2.0
+ resolution: "minisearch@npm:7.2.0"
+ checksum: 10c0/64efaf30ead2acb19eb8be49c78352c527812dd2927a0981c9d666339d5d206d132b83038d2bfa756f5161cae5d98f15b07cc7e7b7be6b8278d35d2ecdc2628c
+ languageName: node
+ linkType: hard
+
+"minizlib@npm:^3.1.0":
+ version: 3.1.0
+ resolution: "minizlib@npm:3.1.0"
+ dependencies:
+ minipass: "npm:^7.1.2"
+ checksum: 10c0/5aad75ab0090b8266069c9aabe582c021ae53eb33c6c691054a13a45db3b4f91a7fb1bd79151e6b4e9e9a86727b522527c0a06ec7d45206b745d54cd3097bcec
+ languageName: node
+ linkType: hard
+
+"motion-dom@npm:^12.35.0":
+ version: 12.35.0
+ resolution: "motion-dom@npm:12.35.0"
+ dependencies:
+ motion-utils: "npm:^12.29.2"
+ checksum: 10c0/0f9491bae66baf2d09c02b57208a45f9bd2bc9292726c8115b8196d2bf65c56f1dd97ac36d5be3f40a581dee815fb2a745ff06c559cee9d5d6d6929fb70b9856
+ languageName: node
+ linkType: hard
+
+"motion-utils@npm:^12.29.2":
+ version: 12.29.2
+ resolution: "motion-utils@npm:12.29.2"
+ checksum: 10c0/8058fbb3467602e8263a8a6df0e5d318d00d30d7148415d2ebc13c78a3c7a1b0cbec0808bb62e82c34714979ecbed15b9fffb91bde654dbf3602c84b7d66a5b6
+ languageName: node
+ linkType: hard
+
+"mri@npm:^1.1.0":
+ version: 1.2.0
+ resolution: "mri@npm:1.2.0"
+ checksum: 10c0/a3d32379c2554cf7351db6237ddc18dc9e54e4214953f3da105b97dc3babe0deb3ffe99cf409b38ea47cc29f9430561ba6b53b24ab8f9ce97a4b50409e4a50e7
+ languageName: node
+ linkType: hard
+
+"ms@npm:^2.1.1, ms@npm:^2.1.3":
+ version: 2.1.3
+ resolution: "ms@npm:2.1.3"
+ checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48
+ languageName: node
+ linkType: hard
+
+"mz@npm:^2.7.0":
+ version: 2.7.0
+ resolution: "mz@npm:2.7.0"
+ dependencies:
+ any-promise: "npm:^1.0.0"
+ object-assign: "npm:^4.0.1"
+ thenify-all: "npm:^1.0.0"
+ checksum: 10c0/103114e93f87362f0b56ab5b2e7245051ad0276b646e3902c98397d18bb8f4a77f2ea4a2c9d3ad516034ea3a56553b60d3f5f78220001ca4c404bd711bd0af39
+ languageName: node
+ linkType: hard
+
+"nanoid@npm:^3.3.11, nanoid@npm:^3.3.6":
+ version: 3.3.11
+ resolution: "nanoid@npm:3.3.11"
+ bin:
+ nanoid: bin/nanoid.cjs
+ checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b
+ languageName: node
+ linkType: hard
+
+"napi-postinstall@npm:^0.3.0":
+ version: 0.3.4
+ resolution: "napi-postinstall@npm:0.3.4"
+ bin:
+ napi-postinstall: lib/cli.js
+ checksum: 10c0/b33d64150828bdade3a5d07368a8b30da22ee393f8dd8432f1b9e5486867be21c84ec443dd875dd3ef3c7401a079a7ab7e2aa9d3538a889abbcd96495d5104fe
+ languageName: node
+ linkType: hard
+
+"natural-compare@npm:^1.4.0":
+ version: 1.4.0
+ resolution: "natural-compare@npm:1.4.0"
+ checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447
+ languageName: node
+ linkType: hard
+
+"next-themes@npm:^0.4.6":
+ version: 0.4.6
+ resolution: "next-themes@npm:0.4.6"
+ peerDependencies:
+ react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ checksum: 10c0/83590c11d359ce7e4ced14f6ea9dd7a691d5ce6843fe2dc520fc27e29ae1c535118478d03e7f172609c41b1ef1b8da6b8dd2d2acd6cd79cac1abbdbd5b99f2c4
+ languageName: node
+ linkType: hard
+
+"next@npm:15.1.6":
+ version: 15.1.6
+ resolution: "next@npm:15.1.6"
+ dependencies:
+ "@next/env": "npm:15.1.6"
+ "@next/swc-darwin-arm64": "npm:15.1.6"
+ "@next/swc-darwin-x64": "npm:15.1.6"
+ "@next/swc-linux-arm64-gnu": "npm:15.1.6"
+ "@next/swc-linux-arm64-musl": "npm:15.1.6"
+ "@next/swc-linux-x64-gnu": "npm:15.1.6"
+ "@next/swc-linux-x64-musl": "npm:15.1.6"
+ "@next/swc-win32-arm64-msvc": "npm:15.1.6"
+ "@next/swc-win32-x64-msvc": "npm:15.1.6"
+ "@swc/counter": "npm:0.1.3"
+ "@swc/helpers": "npm:0.5.15"
+ busboy: "npm:1.6.0"
+ caniuse-lite: "npm:^1.0.30001579"
+ postcss: "npm:8.4.31"
+ sharp: "npm:^0.33.5"
+ styled-jsx: "npm:5.1.6"
+ peerDependencies:
+ "@opentelemetry/api": ^1.1.0
+ "@playwright/test": ^1.41.2
+ babel-plugin-react-compiler: "*"
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ dependenciesMeta:
+ "@next/swc-darwin-arm64":
+ optional: true
+ "@next/swc-darwin-x64":
+ optional: true
+ "@next/swc-linux-arm64-gnu":
+ optional: true
+ "@next/swc-linux-arm64-musl":
+ optional: true
+ "@next/swc-linux-x64-gnu":
+ optional: true
+ "@next/swc-linux-x64-musl":
+ optional: true
+ "@next/swc-win32-arm64-msvc":
+ optional: true
+ "@next/swc-win32-x64-msvc":
+ optional: true
+ sharp:
+ optional: true
+ peerDependenciesMeta:
+ "@opentelemetry/api":
+ optional: true
+ "@playwright/test":
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+ bin:
+ next: dist/bin/next
+ checksum: 10c0/261d27589b159387700df5f40de7dee6edfc84525a090e2b29326084124fac87b033dea8b24ada2b6ade25ffc7e2169383b6e19c96ca0c33adb830f76a6d75be
+ languageName: node
+ linkType: hard
+
+"node-exports-info@npm:^1.6.0":
+ version: 1.6.0
+ resolution: "node-exports-info@npm:1.6.0"
+ dependencies:
+ array.prototype.flatmap: "npm:^1.3.3"
+ es-errors: "npm:^1.3.0"
+ object.entries: "npm:^1.1.9"
+ semver: "npm:^6.3.1"
+ checksum: 10c0/3613f21c60b047e66f168d3499a6be0060d89fb01ddceaa7032c2fb318aff12e4b9b111449c1a9aeb3b848bfdc1d4b6bc8fab327af692319597d21a1e7063692
+ languageName: node
+ linkType: hard
+
+"node-gyp@npm:latest":
+ version: 12.3.0
+ resolution: "node-gyp@npm:12.3.0"
+ dependencies:
+ env-paths: "npm:^2.2.0"
+ exponential-backoff: "npm:^3.1.1"
+ graceful-fs: "npm:^4.2.6"
+ nopt: "npm:^9.0.0"
+ proc-log: "npm:^6.0.0"
+ semver: "npm:^7.3.5"
+ tar: "npm:^7.5.4"
+ tinyglobby: "npm:^0.2.12"
+ undici: "npm:^6.25.0"
+ which: "npm:^6.0.0"
+ bin:
+ node-gyp: bin/node-gyp.js
+ checksum: 10c0/9d9032b405cbe42f72a105259d9eb679376470c102df4a2dbaa51e07d59bf741dcffb85897087ea9d8318b9cabb824a8978af51508ae142f0239ae1e6a3c2329
+ languageName: node
+ linkType: hard
+
+"nopt@npm:^9.0.0":
+ version: 9.0.0
+ resolution: "nopt@npm:9.0.0"
+ dependencies:
+ abbrev: "npm:^4.0.0"
+ bin:
+ nopt: bin/nopt.js
+ checksum: 10c0/1822eb6f9b020ef6f7a7516d7b64a8036e09666ea55ac40416c36e4b2b343122c3cff0e2f085675f53de1d2db99a2a89a60ccea1d120bcd6a5347bf6ceb4a7fd
+ languageName: node
+ linkType: hard
+
+"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0":
+ version: 3.0.0
+ resolution: "normalize-path@npm:3.0.0"
+ checksum: 10c0/e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046
+ languageName: node
+ linkType: hard
+
+"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1":
+ version: 4.1.1
+ resolution: "object-assign@npm:4.1.1"
+ checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414
+ languageName: node
+ linkType: hard
+
+"object-hash@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "object-hash@npm:3.0.0"
+ checksum: 10c0/a06844537107b960c1c8b96cd2ac8592a265186bfa0f6ccafe0d34eabdb526f6fa81da1f37c43df7ed13b12a4ae3457a16071603bcd39d8beddb5f08c37b0f47
+ languageName: node
+ linkType: hard
+
+"object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4":
+ version: 1.13.4
+ resolution: "object-inspect@npm:1.13.4"
+ checksum: 10c0/d7f8711e803b96ea3191c745d6f8056ce1f2496e530e6a19a0e92d89b0fa3c76d910c31f0aa270432db6bd3b2f85500a376a83aaba849a8d518c8845b3211692
+ languageName: node
+ linkType: hard
+
+"object-keys@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "object-keys@npm:1.1.1"
+ checksum: 10c0/b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d
+ languageName: node
+ linkType: hard
+
+"object.assign@npm:^4.1.4, object.assign@npm:^4.1.7":
+ version: 4.1.7
+ resolution: "object.assign@npm:4.1.7"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ has-symbols: "npm:^1.1.0"
+ object-keys: "npm:^1.1.1"
+ checksum: 10c0/3b2732bd860567ea2579d1567525168de925a8d852638612846bd8082b3a1602b7b89b67b09913cbb5b9bd6e95923b2ae73580baa9d99cb4e990564e8cbf5ddc
+ languageName: node
+ linkType: hard
+
+"object.entries@npm:^1.1.9":
+ version: 1.1.9
+ resolution: "object.entries@npm:1.1.9"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.1.1"
+ checksum: 10c0/d4b8c1e586650407da03370845f029aa14076caca4e4d4afadbc69cfb5b78035fd3ee7be417141abdb0258fa142e59b11923b4c44d8b1255b28f5ffcc50da7db
+ languageName: node
+ linkType: hard
+
+"object.fromentries@npm:^2.0.8":
+ version: 2.0.8
+ resolution: "object.fromentries@npm:2.0.8"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.2"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/cd4327e6c3369cfa805deb4cbbe919bfb7d3aeebf0bcaba291bb568ea7169f8f8cdbcabe2f00b40db0c20cd20f08e11b5f3a5a36fb7dd3fe04850c50db3bf83b
+ languageName: node
+ linkType: hard
+
+"object.groupby@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "object.groupby@npm:1.0.3"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.2"
+ checksum: 10c0/60d0455c85c736fbfeda0217d1a77525956f76f7b2495edeca9e9bbf8168a45783199e77b894d30638837c654d0cc410e0e02cbfcf445bc8de71c3da1ede6a9c
+ languageName: node
+ linkType: hard
+
+"object.values@npm:^1.1.6, object.values@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "object.values@npm:1.2.1"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/3c47814fdc64842ae3d5a74bc9d06bdd8d21563c04d9939bf6716a9c00596a4ebc342552f8934013d1ec991c74e3671b26710a0c51815f0b603795605ab6b2c9
+ languageName: node
+ linkType: hard
+
+"openprinting.github.io@workspace:.":
+ version: 0.0.0-use.local
+ resolution: "openprinting.github.io@workspace:."
+ dependencies:
+ "@eslint/eslintrc": "npm:^3"
+ "@giscus/react": "npm:^3.1.0"
+ "@radix-ui/react-slot": "npm:^1.1.1"
+ "@tailwindcss/typography": "npm:^0.5.16"
+ "@types/node": "npm:^20"
+ "@types/react": "npm:^19"
+ "@types/react-dom": "npm:^19"
+ class-variance-authority: "npm:^0.7.1"
+ clsx: "npm:^2.1.1"
+ eslint: "npm:^9"
+ eslint-config-next: "npm:15.1.6"
+ fast-xml-parser: "npm:^5.3.0"
+ framer-motion: "npm:^12.5.0"
+ github-slugger: "npm:^2.0.0"
+ gray-matter: "npm:^4.0.3"
+ highlight.js: "npm:^11.7.0"
+ lucide-react: "npm:^0.474.0"
+ mdast-util-to-string: "npm:^3.1.0"
+ minisearch: "npm:^7.2.0"
+ next: "npm:15.1.6"
+ next-themes: "npm:^0.4.6"
+ postcss: "npm:^8"
+ react: "npm:^19.0.0"
+ react-dom: "npm:^19.0.0"
+ react-markdown: "npm:^9.0.1"
+ reading-time: "npm:^1.5.0"
+ rehype-autolink-headings: "npm:^7.1.0"
+ rehype-highlight: "npm:^7.0.1"
+ rehype-raw: "npm:^7.0.0"
+ rehype-slug: "npm:^6.0.0"
+ remark-gfm: "npm:^4.0.0"
+ remark-parse: "npm:^10.0.1"
+ tailwind-merge: "npm:^3.0.1"
+ tailwindcss: "npm:^3.4.1"
+ tailwindcss-animate: "npm:^1.0.7"
+ tsx: "npm:^4.21.0"
+ typescript: "npm:^5"
+ unified: "npm:^10.1.0"
+ unist-util-visit: "npm:^4.1.0"
+ languageName: unknown
+ linkType: soft
+
+"optionator@npm:^0.9.3":
+ version: 0.9.4
+ resolution: "optionator@npm:0.9.4"
+ dependencies:
+ deep-is: "npm:^0.1.3"
+ fast-levenshtein: "npm:^2.0.6"
+ levn: "npm:^0.4.1"
+ prelude-ls: "npm:^1.2.1"
+ type-check: "npm:^0.4.0"
+ word-wrap: "npm:^1.2.5"
+ checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675
+ languageName: node
+ linkType: hard
+
+"own-keys@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "own-keys@npm:1.0.1"
+ dependencies:
+ get-intrinsic: "npm:^1.2.6"
+ object-keys: "npm:^1.1.1"
+ safe-push-apply: "npm:^1.0.0"
+ checksum: 10c0/6dfeb3455bff92ec3f16a982d4e3e65676345f6902d9f5ded1d8265a6318d0200ce461956d6d1c70053c7fe9f9fe65e552faac03f8140d37ef0fdd108e67013a
+ languageName: node
+ linkType: hard
+
+"p-limit@npm:^3.0.2":
+ version: 3.1.0
+ resolution: "p-limit@npm:3.1.0"
+ dependencies:
+ yocto-queue: "npm:^0.1.0"
+ checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a
+ languageName: node
+ linkType: hard
+
+"p-locate@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "p-locate@npm:5.0.0"
+ dependencies:
+ p-limit: "npm:^3.0.2"
+ checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a
+ languageName: node
+ linkType: hard
+
+"parent-module@npm:^1.0.0":
+ version: 1.0.1
+ resolution: "parent-module@npm:1.0.1"
+ dependencies:
+ callsites: "npm:^3.0.0"
+ checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556
+ languageName: node
+ linkType: hard
+
+"parse-entities@npm:^4.0.0":
+ version: 4.0.2
+ resolution: "parse-entities@npm:4.0.2"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ character-entities-legacy: "npm:^3.0.0"
+ character-reference-invalid: "npm:^2.0.0"
+ decode-named-character-reference: "npm:^1.0.0"
+ is-alphanumerical: "npm:^2.0.0"
+ is-decimal: "npm:^2.0.0"
+ is-hexadecimal: "npm:^2.0.0"
+ checksum: 10c0/a13906b1151750b78ed83d386294066daf5fb559e08c5af9591b2d98cc209123103016a01df776f65f8219ad26652d6d6b210d0974d452049cddfc53a8916c34
+ languageName: node
+ linkType: hard
+
+"parse5@npm:^7.0.0":
+ version: 7.3.0
+ resolution: "parse5@npm:7.3.0"
+ dependencies:
+ entities: "npm:^6.0.0"
+ checksum: 10c0/7fd2e4e247e85241d6f2a464d0085eed599a26d7b0a5233790c49f53473232eb85350e8133344d9b3fd58b89339e7ad7270fe1f89d28abe50674ec97b87f80b5
+ languageName: node
+ linkType: hard
+
+"path-exists@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "path-exists@npm:4.0.0"
+ checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b
+ languageName: node
+ linkType: hard
+
+"path-expression-matcher@npm:^1.1.3, path-expression-matcher@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "path-expression-matcher@npm:1.2.1"
+ checksum: 10c0/71fb20dc80995931cbbecfa6a425113521eb213afd63b91ec2aca4e6cd75f1838617e4cbf42e66722b72ec32e01eccecddbec85cec3e2b2cf2cf938ce8fc8680
+ languageName: node
+ linkType: hard
+
+"path-key@npm:^3.1.0":
+ version: 3.1.1
+ resolution: "path-key@npm:3.1.1"
+ checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c
+ languageName: node
+ linkType: hard
+
+"path-parse@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "path-parse@npm:1.0.7"
+ checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1
+ languageName: node
+ linkType: hard
+
+"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "picocolors@npm:1.1.1"
+ checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1":
+ version: 2.3.1
+ resolution: "picomatch@npm:2.3.1"
+ checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^4.0.3":
+ version: 4.0.3
+ resolution: "picomatch@npm:4.0.3"
+ checksum: 10c0/9582c951e95eebee5434f59e426cddd228a7b97a0161a375aed4be244bd3fe8e3a31b846808ea14ef2c8a2527a6eeab7b3946a67d5979e81694654f939473ae2
+ languageName: node
+ linkType: hard
+
+"picomatch@npm:^4.0.4":
+ version: 4.0.4
+ resolution: "picomatch@npm:4.0.4"
+ checksum: 10c0/e2c6023372cc7b5764719a5ffb9da0f8e781212fa7ca4bd0562db929df8e117460f00dff3cb7509dacfc06b86de924b247f504d0ce1806a37fac4633081466b0
+ languageName: node
+ linkType: hard
+
+"pify@npm:^2.3.0":
+ version: 2.3.0
+ resolution: "pify@npm:2.3.0"
+ checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc
+ languageName: node
+ linkType: hard
+
+"pirates@npm:^4.0.1":
+ version: 4.0.7
+ resolution: "pirates@npm:4.0.7"
+ checksum: 10c0/a51f108dd811beb779d58a76864bbd49e239fa40c7984cd11596c75a121a8cc789f1c8971d8bb15f0dbf9d48b76c05bb62fcbce840f89b688c0fa64b37e8478a
+ languageName: node
+ linkType: hard
+
+"possible-typed-array-names@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "possible-typed-array-names@npm:1.1.0"
+ checksum: 10c0/c810983414142071da1d644662ce4caebce890203eb2bc7bf119f37f3fe5796226e117e6cca146b521921fa6531072674174a3325066ac66fce089a53e1e5196
+ languageName: node
+ linkType: hard
+
+"postcss-import@npm:^15.1.0":
+ version: 15.1.0
+ resolution: "postcss-import@npm:15.1.0"
+ dependencies:
+ postcss-value-parser: "npm:^4.0.0"
+ read-cache: "npm:^1.0.0"
+ resolve: "npm:^1.1.7"
+ peerDependencies:
+ postcss: ^8.0.0
+ checksum: 10c0/518aee5c83ea6940e890b0be675a2588db68b2582319f48c3b4e06535a50ea6ee45f7e63e4309f8754473245c47a0372632378d1d73d901310f295a92f26f17b
+ languageName: node
+ linkType: hard
+
+"postcss-js@npm:^4.0.1":
+ version: 4.1.0
+ resolution: "postcss-js@npm:4.1.0"
+ dependencies:
+ camelcase-css: "npm:^2.0.1"
+ peerDependencies:
+ postcss: ^8.4.21
+ checksum: 10c0/a3cf6e725f3e9ecd7209732f8844a0063a1380b718ccbcf93832b6ec2cd7e63ff70dd2fed49eb2483c7482296860a0f7badd3115b5d0fa05ea648eb6d9dfc9c6
+ languageName: node
+ linkType: hard
+
+"postcss-load-config@npm:^4.0.2 || ^5.0 || ^6.0":
+ version: 6.0.1
+ resolution: "postcss-load-config@npm:6.0.1"
+ dependencies:
+ lilconfig: "npm:^3.1.1"
+ peerDependencies:
+ jiti: ">=1.21.0"
+ postcss: ">=8.0.9"
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ postcss:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+ checksum: 10c0/74173a58816dac84e44853f7afbd283f4ef13ca0b6baeba27701214beec33f9e309b128f8102e2b173e8d45ecba45d279a9be94b46bf48d219626aa9b5730848
+ languageName: node
+ linkType: hard
+
+"postcss-nested@npm:^6.2.0":
+ version: 6.2.0
+ resolution: "postcss-nested@npm:6.2.0"
+ dependencies:
+ postcss-selector-parser: "npm:^6.1.1"
+ peerDependencies:
+ postcss: ^8.2.14
+ checksum: 10c0/7f9c3f2d764191a39364cbdcec350f26a312431a569c9ef17408021424726b0d67995ff5288405e3724bb7152a4c92f73c027e580ec91e798800ed3c52e2bc6e
+ languageName: node
+ linkType: hard
+
+"postcss-selector-parser@npm:6.0.10":
+ version: 6.0.10
+ resolution: "postcss-selector-parser@npm:6.0.10"
+ dependencies:
+ cssesc: "npm:^3.0.0"
+ util-deprecate: "npm:^1.0.2"
+ checksum: 10c0/a0b27c5e3f7604c8dc7cd83f145fdd7b21448e0d86072da99e0d78e536ba27aa9db2d42024c50aa530408ee517c4bdc0260529e1afb56608f9a82e839c207e82
+ languageName: node
+ linkType: hard
+
+"postcss-selector-parser@npm:^6.1.1, postcss-selector-parser@npm:^6.1.2":
+ version: 6.1.2
+ resolution: "postcss-selector-parser@npm:6.1.2"
+ dependencies:
+ cssesc: "npm:^3.0.0"
+ util-deprecate: "npm:^1.0.2"
+ checksum: 10c0/523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e
+ languageName: node
+ linkType: hard
+
+"postcss-value-parser@npm:^4.0.0":
+ version: 4.2.0
+ resolution: "postcss-value-parser@npm:4.2.0"
+ checksum: 10c0/f4142a4f56565f77c1831168e04e3effd9ffcc5aebaf0f538eee4b2d465adfd4b85a44257bb48418202a63806a7da7fe9f56c330aebb3cac898e46b4cbf49161
+ languageName: node
+ linkType: hard
+
+"postcss@npm:8.4.31":
+ version: 8.4.31
+ resolution: "postcss@npm:8.4.31"
+ dependencies:
+ nanoid: "npm:^3.3.6"
+ picocolors: "npm:^1.0.0"
+ source-map-js: "npm:^1.0.2"
+ checksum: 10c0/748b82e6e5fc34034dcf2ae88ea3d11fd09f69b6c50ecdd3b4a875cfc7cdca435c958b211e2cb52355422ab6fccb7d8f2f2923161d7a1b281029e4a913d59acf
+ languageName: node
+ linkType: hard
+
+"postcss@npm:^8, postcss@npm:^8.4.47":
+ version: 8.5.8
+ resolution: "postcss@npm:8.5.8"
+ dependencies:
+ nanoid: "npm:^3.3.11"
+ picocolors: "npm:^1.1.1"
+ source-map-js: "npm:^1.2.1"
+ checksum: 10c0/dd918f7127ee7c60a0295bae2e72b3787892296e1d1c3c564d7a2a00c68d8df83cadc3178491259daa19ccc54804fb71ed8c937c6787e08d8bd4bedf8d17044c
+ languageName: node
+ linkType: hard
+
+"prelude-ls@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "prelude-ls@npm:1.2.1"
+ checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd
+ languageName: node
+ linkType: hard
+
+"proc-log@npm:^6.0.0":
+ version: 6.1.0
+ resolution: "proc-log@npm:6.1.0"
+ checksum: 10c0/4f178d4062733ead9d71a9b1ab24ebcecdfe2250916a5b1555f04fe2eda972a0ec76fbaa8df1ad9c02707add6749219d118a4fc46dc56bdfe4dde4b47d80bb82
+ languageName: node
+ linkType: hard
+
+"prop-types@npm:^15.8.1":
+ version: 15.8.1
+ resolution: "prop-types@npm:15.8.1"
+ dependencies:
+ loose-envify: "npm:^1.4.0"
+ object-assign: "npm:^4.1.1"
+ react-is: "npm:^16.13.1"
+ checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077
+ languageName: node
+ linkType: hard
+
+"property-information@npm:^7.0.0":
+ version: 7.1.0
+ resolution: "property-information@npm:7.1.0"
+ checksum: 10c0/e0fe22cff26103260ad0e82959229106563fa115a54c4d6c183f49d88054e489cc9f23452d3ad584179dc13a8b7b37411a5df873746b5e4086c865874bfa968e
+ languageName: node
+ linkType: hard
+
+"punycode@npm:^2.1.0":
+ version: 2.3.1
+ resolution: "punycode@npm:2.3.1"
+ checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9
+ languageName: node
+ linkType: hard
+
+"queue-microtask@npm:^1.2.2":
+ version: 1.2.3
+ resolution: "queue-microtask@npm:1.2.3"
+ checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102
+ languageName: node
+ linkType: hard
+
+"react-dom@npm:^19.0.0":
+ version: 19.2.4
+ resolution: "react-dom@npm:19.2.4"
+ dependencies:
+ scheduler: "npm:^0.27.0"
+ peerDependencies:
+ react: ^19.2.4
+ checksum: 10c0/f0c63f1794dedb154136d4d0f59af00b41907f4859571c155940296808f4b94bf9c0c20633db75b5b2112ec13d8d7dd4f9bf57362ed48782f317b11d05a44f35
+ languageName: node
+ linkType: hard
+
+"react-is@npm:^16.13.1":
+ version: 16.13.1
+ resolution: "react-is@npm:16.13.1"
+ checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1
+ languageName: node
+ linkType: hard
+
+"react-markdown@npm:^9.0.1":
+ version: 9.1.0
+ resolution: "react-markdown@npm:9.1.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ devlop: "npm:^1.0.0"
+ hast-util-to-jsx-runtime: "npm:^2.0.0"
+ html-url-attributes: "npm:^3.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ remark-parse: "npm:^11.0.0"
+ remark-rehype: "npm:^11.0.0"
+ unified: "npm:^11.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ peerDependencies:
+ "@types/react": ">=18"
+ react: ">=18"
+ checksum: 10c0/5bd645d39379f776d64588105f4060c390c3c8e4ff048552c9fa0ad31b756bb3ff7c11081542dc58d840ccf183a6dd4fd4d4edab44d8c24dee8b66551a5fd30d
+ languageName: node
+ linkType: hard
+
+"react@npm:^19.0.0":
+ version: 19.2.4
+ resolution: "react@npm:19.2.4"
+ checksum: 10c0/cd2c9ff67a720799cc3b38a516009986f7fc4cb8d3e15716c6211cf098d1357ee3e348ab05ad0600042bbb0fd888530ba92e329198c92eafa0994f5213396596
+ languageName: node
+ linkType: hard
+
+"read-cache@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "read-cache@npm:1.0.0"
+ dependencies:
+ pify: "npm:^2.3.0"
+ checksum: 10c0/90cb2750213c7dd7c80cb420654344a311fdec12944e81eb912cd82f1bc92aea21885fa6ce442e3336d9fccd663b8a7a19c46d9698e6ca55620848ab932da814
+ languageName: node
+ linkType: hard
+
+"readdirp@npm:~3.6.0":
+ version: 3.6.0
+ resolution: "readdirp@npm:3.6.0"
+ dependencies:
+ picomatch: "npm:^2.2.1"
+ checksum: 10c0/6fa848cf63d1b82ab4e985f4cf72bd55b7dcfd8e0a376905804e48c3634b7e749170940ba77b32804d5fe93b3cc521aa95a8d7e7d725f830da6d93f3669ce66b
+ languageName: node
+ linkType: hard
+
+"reading-time@npm:^1.5.0":
+ version: 1.5.0
+ resolution: "reading-time@npm:1.5.0"
+ checksum: 10c0/0f730852fd4fb99e5f78c5b0cf36ab8c3fa15db96f87d9563843f6fd07a47864273ade539ebb184b785b728cde81a70283aa2d9b80cba5ca03b81868be03cabc
+ languageName: node
+ linkType: hard
+
+"reflect.getprototypeof@npm:^1.0.6, reflect.getprototypeof@npm:^1.0.9":
+ version: 1.0.10
+ resolution: "reflect.getprototypeof@npm:1.0.10"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.9"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.0.0"
+ get-intrinsic: "npm:^1.2.7"
+ get-proto: "npm:^1.0.1"
+ which-builtin-type: "npm:^1.2.1"
+ checksum: 10c0/7facec28c8008876f8ab98e80b7b9cb4b1e9224353fd4756dda5f2a4ab0d30fa0a5074777c6df24e1e0af463a2697513b0a11e548d99cf52f21f7bc6ba48d3ac
+ languageName: node
+ linkType: hard
+
+"regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4":
+ version: 1.5.4
+ resolution: "regexp.prototype.flags@npm:1.5.4"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ define-properties: "npm:^1.2.1"
+ es-errors: "npm:^1.3.0"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ set-function-name: "npm:^2.0.2"
+ checksum: 10c0/83b88e6115b4af1c537f8dabf5c3744032cb875d63bc05c288b1b8c0ef37cbe55353f95d8ca817e8843806e3e150b118bc624e4279b24b4776b4198232735a77
+ languageName: node
+ linkType: hard
+
+"rehype-autolink-headings@npm:^7.1.0":
+ version: 7.1.0
+ resolution: "rehype-autolink-headings@npm:7.1.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@ungap/structured-clone": "npm:^1.0.0"
+ hast-util-heading-rank: "npm:^3.0.0"
+ hast-util-is-element: "npm:^3.0.0"
+ unified: "npm:^11.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ checksum: 10c0/3d6653047c83cf7f9455bc0f5483a40170aee211cc057b7541b491d31e54b08fda72ab5ec4caeacea63e8af130584f0e14d5c63f6ddb86b7f34584b9e3f92dcf
+ languageName: node
+ linkType: hard
+
+"rehype-highlight@npm:^7.0.1":
+ version: 7.0.2
+ resolution: "rehype-highlight@npm:7.0.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-to-text: "npm:^4.0.0"
+ lowlight: "npm:^3.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/b62effff554f9a3f2ad8688c675bc7580e6dcf20a6988f86a25e95f1adea2f4900f8a13f96ec7db6a543314aed28267e4057f8dbc71c02a76a9511a716e88da2
+ languageName: node
+ linkType: hard
+
+"rehype-raw@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "rehype-raw@npm:7.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ hast-util-raw: "npm:^9.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/1435b4b6640a5bc3abe3b2133885c4dbff5ef2190ef9cfe09d6a63f74dd7d7ffd0cede70603278560ccf1acbfb9da9faae4b68065a28bc5aa88ad18e40f32d52
+ languageName: node
+ linkType: hard
+
+"rehype-slug@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "rehype-slug@npm:6.0.0"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ github-slugger: "npm:^2.0.0"
+ hast-util-heading-rank: "npm:^3.0.0"
+ hast-util-to-string: "npm:^3.0.0"
+ unist-util-visit: "npm:^5.0.0"
+ checksum: 10c0/51303c33d039c271cabe62161b49fa737be488f70ced62f00c165e47a089a99de2060050385e5c00d0df83ed30c7fa1c79a51b78508702836aefa51f7e7a6760
+ languageName: node
+ linkType: hard
+
+"remark-gfm@npm:^4.0.0":
+ version: 4.0.1
+ resolution: "remark-gfm@npm:4.0.1"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-gfm: "npm:^3.0.0"
+ micromark-extension-gfm: "npm:^3.0.0"
+ remark-parse: "npm:^11.0.0"
+ remark-stringify: "npm:^11.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/427ecc6af3e76222662061a5f670a3e4e33ec5fffe2cabf04034da6a3f9a1bda1fc023e838a636385ba314e66e2bebbf017ca61ebea357eb0f5200fe0625a4b7
+ languageName: node
+ linkType: hard
+
+"remark-parse@npm:^10.0.1":
+ version: 10.0.2
+ resolution: "remark-parse@npm:10.0.2"
+ dependencies:
+ "@types/mdast": "npm:^3.0.0"
+ mdast-util-from-markdown: "npm:^1.0.0"
+ unified: "npm:^10.0.0"
+ checksum: 10c0/30cb8f2790380b1c7370a1c66cda41f33a7dc196b9e440a00e2675037bca55aea868165a8204e0cdbacc27ef4a3bdb7d45879826bd6efa07d9fdf328cb67a332
+ languageName: node
+ linkType: hard
+
+"remark-parse@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "remark-parse@npm:11.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-from-markdown: "npm:^2.0.0"
+ micromark-util-types: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/6eed15ddb8680eca93e04fcb2d1b8db65a743dcc0023f5007265dda558b09db595a087f622062ccad2630953cd5cddc1055ce491d25a81f3317c858348a8dd38
+ languageName: node
+ linkType: hard
+
+"remark-rehype@npm:^11.0.0":
+ version: 11.1.2
+ resolution: "remark-rehype@npm:11.1.2"
+ dependencies:
+ "@types/hast": "npm:^3.0.0"
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-to-hast: "npm:^13.0.0"
+ unified: "npm:^11.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/f9eccacfb596d9605581dc05bfad28635d6ded5dd0a18e88af5fd4df0d3fcf9612e1501d4513bc2164d833cfe9636dab20400080b09e53f155c6e1442a1231fb
+ languageName: node
+ linkType: hard
+
+"remark-stringify@npm:^11.0.0":
+ version: 11.0.0
+ resolution: "remark-stringify@npm:11.0.0"
+ dependencies:
+ "@types/mdast": "npm:^4.0.0"
+ mdast-util-to-markdown: "npm:^2.0.0"
+ unified: "npm:^11.0.0"
+ checksum: 10c0/0cdb37ce1217578f6f847c7ec9f50cbab35df5b9e3903d543e74b405404e67c07defcb23cd260a567b41b769400f6de03c2c3d9cd6ae7a6707d5c8d89ead489f
+ languageName: node
+ linkType: hard
+
+"resolve-from@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "resolve-from@npm:4.0.0"
+ checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190
+ languageName: node
+ linkType: hard
+
+"resolve-pkg-maps@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "resolve-pkg-maps@npm:1.0.0"
+ checksum: 10c0/fb8f7bbe2ca281a73b7ef423a1cbc786fb244bd7a95cbe5c3fba25b27d327150beca8ba02f622baea65919a57e061eb5005204daa5f93ed590d9b77463a567ab
+ languageName: node
+ linkType: hard
+
+"resolve@npm:^1.1.7, resolve@npm:^1.22.4, resolve@npm:^1.22.8":
+ version: 1.22.11
+ resolution: "resolve@npm:1.22.11"
+ dependencies:
+ is-core-module: "npm:^2.16.1"
+ path-parse: "npm:^1.0.7"
+ supports-preserve-symlinks-flag: "npm:^1.0.0"
+ bin:
+ resolve: bin/resolve
+ checksum: 10c0/f657191507530f2cbecb5815b1ee99b20741ea6ee02a59c57028e9ec4c2c8d7681afcc35febbd554ac0ded459db6f2d8153382c53a2f266cee2575e512674409
+ languageName: node
+ linkType: hard
+
+"resolve@npm:^2.0.0-next.5":
+ version: 2.0.0-next.6
+ resolution: "resolve@npm:2.0.0-next.6"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ is-core-module: "npm:^2.16.1"
+ node-exports-info: "npm:^1.6.0"
+ object-keys: "npm:^1.1.1"
+ path-parse: "npm:^1.0.7"
+ supports-preserve-symlinks-flag: "npm:^1.0.0"
+ bin:
+ resolve: bin/resolve
+ checksum: 10c0/4e44cb84aa9a3c7c82d4a98e8111879671150496160a53ca6cdbed6101bf239f19105f8b8b84e40c0b76d46b0d9626813510b19a80e01f4ae18692e9d0b47749
+ languageName: node
+ linkType: hard
+
+"resolve@patch:resolve@npm%3A^1.1.7#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A^1.22.8#optional!builtin":
+ version: 1.22.11
+ resolution: "resolve@patch:resolve@npm%3A1.22.11#optional!builtin::version=1.22.11&hash=c3c19d"
+ dependencies:
+ is-core-module: "npm:^2.16.1"
+ path-parse: "npm:^1.0.7"
+ supports-preserve-symlinks-flag: "npm:^1.0.0"
+ bin:
+ resolve: bin/resolve
+ checksum: 10c0/ee5b182f2e37cb1165465e58c6abc797fec0a80b5ba3231607beb4677db0c9291ac010c47cf092b6daa2b7f518d69a0e21888e7e2b633f68d501a874212a8c63
+ languageName: node
+ linkType: hard
+
+"resolve@patch:resolve@npm%3A^2.0.0-next.5#optional!builtin":
+ version: 2.0.0-next.6
+ resolution: "resolve@patch:resolve@npm%3A2.0.0-next.6#optional!builtin::version=2.0.0-next.6&hash=c3c19d"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ is-core-module: "npm:^2.16.1"
+ node-exports-info: "npm:^1.6.0"
+ object-keys: "npm:^1.1.1"
+ path-parse: "npm:^1.0.7"
+ supports-preserve-symlinks-flag: "npm:^1.0.0"
+ bin:
+ resolve: bin/resolve
+ checksum: 10c0/dca533e38820b0d8d636f269824cef3b7435802ab7401211c6f10af03be0e2f7e216047234e1623046c0a6791577079767e0c04f0d36e42c7f567b1bff7b0742
+ languageName: node
+ linkType: hard
+
+"reusify@npm:^1.0.4":
+ version: 1.1.0
+ resolution: "reusify@npm:1.1.0"
+ checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa
+ languageName: node
+ linkType: hard
+
+"run-parallel@npm:^1.1.9":
+ version: 1.2.0
+ resolution: "run-parallel@npm:1.2.0"
+ dependencies:
+ queue-microtask: "npm:^1.2.2"
+ checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39
+ languageName: node
+ linkType: hard
+
+"sade@npm:^1.7.3":
+ version: 1.8.1
+ resolution: "sade@npm:1.8.1"
+ dependencies:
+ mri: "npm:^1.1.0"
+ checksum: 10c0/da8a3a5d667ad5ce3bf6d4f054bbb9f711103e5df21003c5a5c1a8a77ce12b640ed4017dd423b13c2307ea7e645adee7c2ae3afe8051b9db16a6f6d3da3f90b1
+ languageName: node
+ linkType: hard
+
+"safe-array-concat@npm:^1.1.3":
+ version: 1.1.3
+ resolution: "safe-array-concat@npm:1.1.3"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.2"
+ get-intrinsic: "npm:^1.2.6"
+ has-symbols: "npm:^1.1.0"
+ isarray: "npm:^2.0.5"
+ checksum: 10c0/43c86ffdddc461fb17ff8a17c5324f392f4868f3c7dd2c6a5d9f5971713bc5fd755667212c80eab9567595f9a7509cc2f83e590ddaebd1bd19b780f9c79f9a8d
+ languageName: node
+ linkType: hard
+
+"safe-push-apply@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "safe-push-apply@npm:1.0.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ isarray: "npm:^2.0.5"
+ checksum: 10c0/831f1c9aae7436429e7862c7e46f847dfe490afac20d0ee61bae06108dbf5c745a0de3568ada30ccdd3eeb0864ca8331b2eef703abd69bfea0745b21fd320750
+ languageName: node
+ linkType: hard
+
+"safe-regex-test@npm:^1.0.3, safe-regex-test@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "safe-regex-test@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ is-regex: "npm:^1.2.1"
+ checksum: 10c0/f2c25281bbe5d39cddbbce7f86fca5ea9b3ce3354ea6cd7c81c31b006a5a9fff4286acc5450a3b9122c56c33eba69c56b9131ad751457b2b4a585825e6a10665
+ languageName: node
+ linkType: hard
+
+"scheduler@npm:^0.27.0":
+ version: 0.27.0
+ resolution: "scheduler@npm:0.27.0"
+ checksum: 10c0/4f03048cb05a3c8fddc45813052251eca00688f413a3cee236d984a161da28db28ba71bd11e7a3dd02f7af84ab28d39fb311431d3b3772fed557945beb00c452
+ languageName: node
+ linkType: hard
+
+"section-matter@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "section-matter@npm:1.0.0"
+ dependencies:
+ extend-shallow: "npm:^2.0.1"
+ kind-of: "npm:^6.0.0"
+ checksum: 10c0/8007f91780adc5aaa781a848eaae50b0f680bbf4043b90cf8a96778195b8fab690c87fe7a989e02394ce69890e330811ec8dab22397d384673ce59f7d750641d
+ languageName: node
+ linkType: hard
+
+"semver@npm:^6.3.1":
+ version: 6.3.1
+ resolution: "semver@npm:6.3.1"
+ bin:
+ semver: bin/semver.js
+ checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.3.5":
+ version: 7.8.1
+ resolution: "semver@npm:7.8.1"
+ bin:
+ semver: bin/semver.js
+ checksum: 10c0/92d6871d6347e1f99d0ba396a70f2545ccf2a032cda3d378fa0699edf7506b5c6d266aed55c8b88e72bd91a30d2351e4f39db479375374430fcdc4b58f4e3c1a
+ languageName: node
+ linkType: hard
+
+"semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.3":
+ version: 7.7.4
+ resolution: "semver@npm:7.7.4"
+ bin:
+ semver: bin/semver.js
+ checksum: 10c0/5215ad0234e2845d4ea5bb9d836d42b03499546ddafb12075566899fc617f68794bb6f146076b6881d755de17d6c6cc73372555879ec7dce2c2feee947866ad2
+ languageName: node
+ linkType: hard
+
+"set-function-length@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "set-function-length@npm:1.2.2"
+ dependencies:
+ define-data-property: "npm:^1.1.4"
+ es-errors: "npm:^1.3.0"
+ function-bind: "npm:^1.1.2"
+ get-intrinsic: "npm:^1.2.4"
+ gopd: "npm:^1.0.1"
+ has-property-descriptors: "npm:^1.0.2"
+ checksum: 10c0/82850e62f412a258b71e123d4ed3873fa9377c216809551192bb6769329340176f109c2eeae8c22a8d386c76739855f78e8716515c818bcaef384b51110f0f3c
+ languageName: node
+ linkType: hard
+
+"set-function-name@npm:^2.0.2":
+ version: 2.0.2
+ resolution: "set-function-name@npm:2.0.2"
+ dependencies:
+ define-data-property: "npm:^1.1.4"
+ es-errors: "npm:^1.3.0"
+ functions-have-names: "npm:^1.2.3"
+ has-property-descriptors: "npm:^1.0.2"
+ checksum: 10c0/fce59f90696c450a8523e754abb305e2b8c73586452619c2bad5f7bf38c7b6b4651895c9db895679c5bef9554339cf3ef1c329b66ece3eda7255785fbe299316
+ languageName: node
+ linkType: hard
+
+"set-proto@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "set-proto@npm:1.0.0"
+ dependencies:
+ dunder-proto: "npm:^1.0.1"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/ca5c3ccbba479d07c30460e367e66337cec825560b11e8ba9c5ebe13a2a0d6021ae34eddf94ff3dfe17a3104dc1f191519cb6c48378b503e5c3f36393938776a
+ languageName: node
+ linkType: hard
+
+"sharp@npm:^0.33.5":
+ version: 0.33.5
+ resolution: "sharp@npm:0.33.5"
+ dependencies:
+ "@img/sharp-darwin-arm64": "npm:0.33.5"
+ "@img/sharp-darwin-x64": "npm:0.33.5"
+ "@img/sharp-libvips-darwin-arm64": "npm:1.0.4"
+ "@img/sharp-libvips-darwin-x64": "npm:1.0.4"
+ "@img/sharp-libvips-linux-arm": "npm:1.0.5"
+ "@img/sharp-libvips-linux-arm64": "npm:1.0.4"
+ "@img/sharp-libvips-linux-s390x": "npm:1.0.4"
+ "@img/sharp-libvips-linux-x64": "npm:1.0.4"
+ "@img/sharp-libvips-linuxmusl-arm64": "npm:1.0.4"
+ "@img/sharp-libvips-linuxmusl-x64": "npm:1.0.4"
+ "@img/sharp-linux-arm": "npm:0.33.5"
+ "@img/sharp-linux-arm64": "npm:0.33.5"
+ "@img/sharp-linux-s390x": "npm:0.33.5"
+ "@img/sharp-linux-x64": "npm:0.33.5"
+ "@img/sharp-linuxmusl-arm64": "npm:0.33.5"
+ "@img/sharp-linuxmusl-x64": "npm:0.33.5"
+ "@img/sharp-wasm32": "npm:0.33.5"
+ "@img/sharp-win32-ia32": "npm:0.33.5"
+ "@img/sharp-win32-x64": "npm:0.33.5"
+ color: "npm:^4.2.3"
+ detect-libc: "npm:^2.0.3"
+ semver: "npm:^7.6.3"
+ dependenciesMeta:
+ "@img/sharp-darwin-arm64":
+ optional: true
+ "@img/sharp-darwin-x64":
+ optional: true
+ "@img/sharp-libvips-darwin-arm64":
+ optional: true
+ "@img/sharp-libvips-darwin-x64":
+ optional: true
+ "@img/sharp-libvips-linux-arm":
+ optional: true
+ "@img/sharp-libvips-linux-arm64":
+ optional: true
+ "@img/sharp-libvips-linux-s390x":
+ optional: true
+ "@img/sharp-libvips-linux-x64":
+ optional: true
+ "@img/sharp-libvips-linuxmusl-arm64":
+ optional: true
+ "@img/sharp-libvips-linuxmusl-x64":
+ optional: true
+ "@img/sharp-linux-arm":
+ optional: true
+ "@img/sharp-linux-arm64":
+ optional: true
+ "@img/sharp-linux-s390x":
+ optional: true
+ "@img/sharp-linux-x64":
+ optional: true
+ "@img/sharp-linuxmusl-arm64":
+ optional: true
+ "@img/sharp-linuxmusl-x64":
+ optional: true
+ "@img/sharp-wasm32":
+ optional: true
+ "@img/sharp-win32-ia32":
+ optional: true
+ "@img/sharp-win32-x64":
+ optional: true
+ checksum: 10c0/6b81421ddfe6ee524d8d77e325c5e147fef22884e1c7b1656dfd89a88d7025894115da02d5f984261bf2e6daa16f98cadd1721c4ba408b4212b1d2a60f233484
+ languageName: node
+ linkType: hard
+
+"shebang-command@npm:^2.0.0":
+ version: 2.0.0
+ resolution: "shebang-command@npm:2.0.0"
+ dependencies:
+ shebang-regex: "npm:^3.0.0"
+ checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e
+ languageName: node
+ linkType: hard
+
+"shebang-regex@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "shebang-regex@npm:3.0.0"
+ checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690
+ languageName: node
+ linkType: hard
+
+"side-channel-list@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "side-channel-list@npm:1.0.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ object-inspect: "npm:^1.13.3"
+ checksum: 10c0/644f4ac893456c9490ff388bf78aea9d333d5e5bfc64cfb84be8f04bf31ddc111a8d4b83b85d7e7e8a7b845bc185a9ad02c052d20e086983cf59f0be517d9b3d
+ languageName: node
+ linkType: hard
+
+"side-channel-map@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "side-channel-map@npm:1.0.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.5"
+ object-inspect: "npm:^1.13.3"
+ checksum: 10c0/010584e6444dd8a20b85bc926d934424bd809e1a3af941cace229f7fdcb751aada0fb7164f60c2e22292b7fa3c0ff0bce237081fd4cdbc80de1dc68e95430672
+ languageName: node
+ linkType: hard
+
+"side-channel-weakmap@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "side-channel-weakmap@npm:1.0.2"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ es-errors: "npm:^1.3.0"
+ get-intrinsic: "npm:^1.2.5"
+ object-inspect: "npm:^1.13.3"
+ side-channel-map: "npm:^1.0.1"
+ checksum: 10c0/71362709ac233e08807ccd980101c3e2d7efe849edc51455030327b059f6c4d292c237f94dc0685031dd11c07dd17a68afde235d6cf2102d949567f98ab58185
+ languageName: node
+ linkType: hard
+
+"side-channel@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "side-channel@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ object-inspect: "npm:^1.13.3"
+ side-channel-list: "npm:^1.0.0"
+ side-channel-map: "npm:^1.0.1"
+ side-channel-weakmap: "npm:^1.0.2"
+ checksum: 10c0/cb20dad41eb032e6c24c0982e1e5a24963a28aa6122b4f05b3f3d6bf8ae7fd5474ef382c8f54a6a3ab86e0cac4d41a23bd64ede3970e5bfb50326ba02a7996e6
+ languageName: node
+ linkType: hard
+
+"simple-swizzle@npm:^0.2.2":
+ version: 0.2.4
+ resolution: "simple-swizzle@npm:0.2.4"
+ dependencies:
+ is-arrayish: "npm:^0.3.1"
+ checksum: 10c0/846c3fdd1325318d5c71295cfbb99bfc9edc4c8dffdda5e6e9efe30482bbcd32cf360fc2806f46ac43ff7d09bcfaff20337bb79f826f0e6a8e366efd3cdd7868
+ languageName: node
+ linkType: hard
+
+"source-map-js@npm:^1.0.2, source-map-js@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "source-map-js@npm:1.2.1"
+ checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf
+ languageName: node
+ linkType: hard
+
+"space-separated-tokens@npm:^2.0.0":
+ version: 2.0.2
+ resolution: "space-separated-tokens@npm:2.0.2"
+ checksum: 10c0/6173e1d903dca41dcab6a2deed8b4caf61bd13b6d7af8374713500570aa929ff9414ae09a0519f4f8772df993300305a395d4871f35bc4ca72b6db57e1f30af8
+ languageName: node
+ linkType: hard
+
+"sprintf-js@npm:~1.0.2":
+ version: 1.0.3
+ resolution: "sprintf-js@npm:1.0.3"
+ checksum: 10c0/ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb
+ languageName: node
+ linkType: hard
+
+"stable-hash@npm:^0.0.5":
+ version: 0.0.5
+ resolution: "stable-hash@npm:0.0.5"
+ checksum: 10c0/ca670cb6d172f1c834950e4ec661e2055885df32fee3ebf3647c5df94993b7c2666a5dbc1c9a62ee11fc5c24928579ec5e81bb5ad31971d355d5a341aab493b3
+ languageName: node
+ linkType: hard
+
+"stop-iteration-iterator@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "stop-iteration-iterator@npm:1.1.0"
+ dependencies:
+ es-errors: "npm:^1.3.0"
+ internal-slot: "npm:^1.1.0"
+ checksum: 10c0/de4e45706bb4c0354a4b1122a2b8cc45a639e86206807ce0baf390ee9218d3ef181923fa4d2b67443367c491aa255c5fbaa64bb74648e3c5b48299928af86c09
+ languageName: node
+ linkType: hard
+
+"streamsearch@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "streamsearch@npm:1.1.0"
+ checksum: 10c0/fbd9aecc2621364384d157f7e59426f4bfd385e8b424b5aaa79c83a6f5a1c8fd2e4e3289e95de1eb3511cb96bb333d6281a9919fafce760e4edb35b2cd2facab
+ languageName: node
+ linkType: hard
+
+"string.prototype.includes@npm:^2.0.1":
+ version: 2.0.1
+ resolution: "string.prototype.includes@npm:2.0.1"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.3"
+ checksum: 10c0/25ce9c9b49128352a2618fbe8758b46f945817a58a4420f4799419e40a8d28f116e176c7590d767d5327a61e75c8f32c86171063f48e389b9fdd325f1bd04ee5
+ languageName: node
+ linkType: hard
+
+"string.prototype.matchall@npm:^4.0.12":
+ version: 4.0.12
+ resolution: "string.prototype.matchall@npm:4.0.12"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.3"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.6"
+ es-errors: "npm:^1.3.0"
+ es-object-atoms: "npm:^1.0.0"
+ get-intrinsic: "npm:^1.2.6"
+ gopd: "npm:^1.2.0"
+ has-symbols: "npm:^1.1.0"
+ internal-slot: "npm:^1.1.0"
+ regexp.prototype.flags: "npm:^1.5.3"
+ set-function-name: "npm:^2.0.2"
+ side-channel: "npm:^1.1.0"
+ checksum: 10c0/1a53328ada73f4a77f1fdf1c79414700cf718d0a8ef6672af5603e709d26a24f2181208144aed7e858b1bcc1a0d08567a570abfb45567db4ae47637ed2c2f85c
+ languageName: node
+ linkType: hard
+
+"string.prototype.repeat@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "string.prototype.repeat@npm:1.0.0"
+ dependencies:
+ define-properties: "npm:^1.1.3"
+ es-abstract: "npm:^1.17.5"
+ checksum: 10c0/94c7978566cffa1327d470fd924366438af9b04b497c43a9805e476e2e908aa37a1fd34cc0911156c17556dab62159d12c7b92b3cc304c3e1281fe4c8e668f40
+ languageName: node
+ linkType: hard
+
+"string.prototype.trim@npm:^1.2.10":
+ version: 1.2.10
+ resolution: "string.prototype.trim@npm:1.2.10"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.2"
+ define-data-property: "npm:^1.1.4"
+ define-properties: "npm:^1.2.1"
+ es-abstract: "npm:^1.23.5"
+ es-object-atoms: "npm:^1.0.0"
+ has-property-descriptors: "npm:^1.0.2"
+ checksum: 10c0/8a8854241c4b54a948e992eb7dd6b8b3a97185112deb0037a134f5ba57541d8248dd610c966311887b6c2fd1181a3877bffb14d873ce937a344535dabcc648f8
+ languageName: node
+ linkType: hard
+
+"string.prototype.trimend@npm:^1.0.9":
+ version: 1.0.9
+ resolution: "string.prototype.trimend@npm:1.0.9"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.2"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/59e1a70bf9414cb4c536a6e31bef5553c8ceb0cf44d8b4d0ed65c9653358d1c64dd0ec203b100df83d0413bbcde38b8c5d49e14bc4b86737d74adc593a0d35b6
+ languageName: node
+ linkType: hard
+
+"string.prototype.trimstart@npm:^1.0.8":
+ version: 1.0.8
+ resolution: "string.prototype.trimstart@npm:1.0.8"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ define-properties: "npm:^1.2.1"
+ es-object-atoms: "npm:^1.0.0"
+ checksum: 10c0/d53af1899959e53c83b64a5fd120be93e067da740e7e75acb433849aa640782fb6c7d4cd5b84c954c84413745a3764df135a8afeb22908b86a835290788d8366
+ languageName: node
+ linkType: hard
+
+"stringify-entities@npm:^4.0.0":
+ version: 4.0.4
+ resolution: "stringify-entities@npm:4.0.4"
+ dependencies:
+ character-entities-html4: "npm:^2.0.0"
+ character-entities-legacy: "npm:^3.0.0"
+ checksum: 10c0/537c7e656354192406bdd08157d759cd615724e9d0873602d2c9b2f6a5c0a8d0b1d73a0a08677848105c5eebac6db037b57c0b3a4ec86331117fa7319ed50448
+ languageName: node
+ linkType: hard
+
+"strip-bom-string@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "strip-bom-string@npm:1.0.0"
+ checksum: 10c0/5c5717e2643225aa6a6d659d34176ab2657037f1fe2423ac6fcdb488f135e14fef1022030e426d8b4d0989e09adbd5c3288d5d3b9c632abeefd2358dfc512bca
+ languageName: node
+ linkType: hard
+
+"strip-bom@npm:^3.0.0":
+ version: 3.0.0
+ resolution: "strip-bom@npm:3.0.0"
+ checksum: 10c0/51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1
+ languageName: node
+ linkType: hard
+
+"strip-json-comments@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "strip-json-comments@npm:3.1.1"
+ checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd
+ languageName: node
+ linkType: hard
+
+"strnum@npm:^2.2.2":
+ version: 2.2.2
+ resolution: "strnum@npm:2.2.2"
+ checksum: 10c0/89c456de32b9495ae34cd6e3b59cb9ef3406b66d1429bbc931afd70be87485dcd355200c42fd638a132adb3121762542346813098ab0c43e44aac303bf17965d
+ languageName: node
+ linkType: hard
+
+"style-to-js@npm:^1.0.0":
+ version: 1.1.21
+ resolution: "style-to-js@npm:1.1.21"
+ dependencies:
+ style-to-object: "npm:1.0.14"
+ checksum: 10c0/94231aa80f58f442c3a5ae01a21d10701e5d62f96b4b3e52eab3499077ee52df203cc0df4a1a870707f5e99470859136ea8657b782a5f4ca7934e0ffe662a588
+ languageName: node
+ linkType: hard
+
+"style-to-object@npm:1.0.14":
+ version: 1.0.14
+ resolution: "style-to-object@npm:1.0.14"
+ dependencies:
+ inline-style-parser: "npm:0.2.7"
+ checksum: 10c0/854d9e9b77afc336e6d7b09348e7939f2617b34eb0895824b066d8cd1790284cb6d8b2ba36be88025b2595d715dba14b299ae76e4628a366541106f639e13679
+ languageName: node
+ linkType: hard
+
+"styled-jsx@npm:5.1.6":
+ version: 5.1.6
+ resolution: "styled-jsx@npm:5.1.6"
+ dependencies:
+ client-only: "npm:0.0.1"
+ peerDependencies:
+ react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0"
+ peerDependenciesMeta:
+ "@babel/core":
+ optional: true
+ babel-plugin-macros:
+ optional: true
+ checksum: 10c0/ace50e7ea5ae5ae6a3b65a50994c51fca6ae7df9c7ecfd0104c36be0b4b3a9c5c1a2374d16e2a11e256d0b20be6d47256d768ecb4f91ab390f60752a075780f5
+ languageName: node
+ linkType: hard
+
+"sucrase@npm:^3.35.0":
+ version: 3.35.1
+ resolution: "sucrase@npm:3.35.1"
+ dependencies:
+ "@jridgewell/gen-mapping": "npm:^0.3.2"
+ commander: "npm:^4.0.0"
+ lines-and-columns: "npm:^1.1.6"
+ mz: "npm:^2.7.0"
+ pirates: "npm:^4.0.1"
+ tinyglobby: "npm:^0.2.11"
+ ts-interface-checker: "npm:^0.1.9"
+ bin:
+ sucrase: bin/sucrase
+ sucrase-node: bin/sucrase-node
+ checksum: 10c0/6fa22329c261371feb9560630d961ad0d0b9c87dce21ea74557c5f3ffbe5c1ee970ea8bcce9962ae9c90c3c47165ffa7dd41865c7414f5d8ea7a40755d612c5c
+ languageName: node
+ linkType: hard
+
+"supports-color@npm:^7.1.0":
+ version: 7.2.0
+ resolution: "supports-color@npm:7.2.0"
+ dependencies:
+ has-flag: "npm:^4.0.0"
+ checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124
+ languageName: node
+ linkType: hard
+
+"supports-preserve-symlinks-flag@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "supports-preserve-symlinks-flag@npm:1.0.0"
+ checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39
+ languageName: node
+ linkType: hard
+
+"tailwind-merge@npm:^3.0.1":
+ version: 3.5.0
+ resolution: "tailwind-merge@npm:3.5.0"
+ checksum: 10c0/4dc588f5b5296ba3f38e1ebb41f02b6d24a8c5bb45e44b33748c118fb4b5767dd0efc464431ca3e75404056b618b5f67bec3708158baa65fed8a2fc9201e0c53
+ languageName: node
+ linkType: hard
+
+"tailwindcss-animate@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "tailwindcss-animate@npm:1.0.7"
+ peerDependencies:
+ tailwindcss: "*"
+ checksum: 10c0/ec7dbd1631076b97d66a1fbaaa06e0725fccfa63119221e8d87a997b02dcede98ad88bb1ef6665b968f5d260fcefb10592e0299ca70208d365b37761edf5e19a
+ languageName: node
+ linkType: hard
+
+"tailwindcss@npm:^3.4.1":
+ version: 3.4.19
+ resolution: "tailwindcss@npm:3.4.19"
+ dependencies:
+ "@alloc/quick-lru": "npm:^5.2.0"
+ arg: "npm:^5.0.2"
+ chokidar: "npm:^3.6.0"
+ didyoumean: "npm:^1.2.2"
+ dlv: "npm:^1.1.3"
+ fast-glob: "npm:^3.3.2"
+ glob-parent: "npm:^6.0.2"
+ is-glob: "npm:^4.0.3"
+ jiti: "npm:^1.21.7"
+ lilconfig: "npm:^3.1.3"
+ micromatch: "npm:^4.0.8"
+ normalize-path: "npm:^3.0.0"
+ object-hash: "npm:^3.0.0"
+ picocolors: "npm:^1.1.1"
+ postcss: "npm:^8.4.47"
+ postcss-import: "npm:^15.1.0"
+ postcss-js: "npm:^4.0.1"
+ postcss-load-config: "npm:^4.0.2 || ^5.0 || ^6.0"
+ postcss-nested: "npm:^6.2.0"
+ postcss-selector-parser: "npm:^6.1.2"
+ resolve: "npm:^1.22.8"
+ sucrase: "npm:^3.35.0"
+ bin:
+ tailwind: lib/cli.js
+ tailwindcss: lib/cli.js
+ checksum: 10c0/e1063daccb9e5a508b357ec73b0011354204b2366b56496d6f0cc822733a55a0551502cb85856a2257ef9b676d0026616daaaa176d391f3216df57fbd693c581
+ languageName: node
+ linkType: hard
+
+"tar@npm:^7.5.4":
+ version: 7.5.16
+ resolution: "tar@npm:7.5.16"
+ dependencies:
+ "@isaacs/fs-minipass": "npm:^4.0.0"
+ chownr: "npm:^3.0.0"
+ minipass: "npm:^7.1.2"
+ minizlib: "npm:^3.1.0"
+ yallist: "npm:^5.0.0"
+ checksum: 10c0/4f37f3c4bd2ca2755fd736a5df1d573c1a868ec1b1e893346aeafa95ac510f9e2fd1469420bd866cc7904799e5bd4ac62b5d4f03fe27747d6e1e373b44505c5c
+ languageName: node
+ linkType: hard
+
+"thenify-all@npm:^1.0.0":
+ version: 1.6.0
+ resolution: "thenify-all@npm:1.6.0"
+ dependencies:
+ thenify: "npm:>= 3.1.0 < 4"
+ checksum: 10c0/9b896a22735e8122754fe70f1d65f7ee691c1d70b1f116fda04fea103d0f9b356e3676cb789506e3909ae0486a79a476e4914b0f92472c2e093d206aed4b7d6b
+ languageName: node
+ linkType: hard
+
+"thenify@npm:>= 3.1.0 < 4":
+ version: 3.3.1
+ resolution: "thenify@npm:3.3.1"
+ dependencies:
+ any-promise: "npm:^1.0.0"
+ checksum: 10c0/f375aeb2b05c100a456a30bc3ed07ef03a39cbdefe02e0403fb714b8c7e57eeaad1a2f5c4ecfb9ce554ce3db9c2b024eba144843cd9e344566d9fcee73b04767
+ languageName: node
+ linkType: hard
+
+"tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.15":
+ version: 0.2.15
+ resolution: "tinyglobby@npm:0.2.15"
+ dependencies:
+ fdir: "npm:^6.5.0"
+ picomatch: "npm:^4.0.3"
+ checksum: 10c0/869c31490d0d88eedb8305d178d4c75e7463e820df5a9b9d388291daf93e8b1eb5de1dad1c1e139767e4269fe75f3b10d5009b2cc14db96ff98986920a186844
+ languageName: node
+ linkType: hard
+
+"tinyglobby@npm:^0.2.12":
+ version: 0.2.17
+ resolution: "tinyglobby@npm:0.2.17"
+ dependencies:
+ fdir: "npm:^6.5.0"
+ picomatch: "npm:^4.0.4"
+ checksum: 10c0/7f7bb0f197c88bc4b20c231e0deca4240ca3bf313a88f5a7fee93a872b84966a4d50220947c0455ad07a60b3b360961c5b7fd979222aeb716a9f99b412002e4c
+ languageName: node
+ linkType: hard
+
+"to-regex-range@npm:^5.0.1":
+ version: 5.0.1
+ resolution: "to-regex-range@npm:5.0.1"
+ dependencies:
+ is-number: "npm:^7.0.0"
+ checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892
+ languageName: node
+ linkType: hard
+
+"trim-lines@npm:^3.0.0":
+ version: 3.0.1
+ resolution: "trim-lines@npm:3.0.1"
+ checksum: 10c0/3a1611fa9e52aa56a94c69951a9ea15b8aaad760eaa26c56a65330dc8adf99cb282fc07cc9d94968b7d4d88003beba220a7278bbe2063328eb23fb56f9509e94
+ languageName: node
+ linkType: hard
+
+"trough@npm:^2.0.0":
+ version: 2.2.0
+ resolution: "trough@npm:2.2.0"
+ checksum: 10c0/58b671fc970e7867a48514168894396dd94e6d9d6456aca427cc299c004fe67f35ed7172a36449086b2edde10e78a71a284ec0076809add6834fb8f857ccb9b0
+ languageName: node
+ linkType: hard
+
+"ts-api-utils@npm:^2.4.0":
+ version: 2.4.0
+ resolution: "ts-api-utils@npm:2.4.0"
+ peerDependencies:
+ typescript: ">=4.8.4"
+ checksum: 10c0/ed185861aef4e7124366a3f6561113557a57504267d4d452a51e0ba516a9b6e713b56b4aeaab9fa13de9db9ab755c65c8c13a777dba9133c214632cb7b65c083
+ languageName: node
+ linkType: hard
+
+"ts-interface-checker@npm:^0.1.9":
+ version: 0.1.13
+ resolution: "ts-interface-checker@npm:0.1.13"
+ checksum: 10c0/232509f1b84192d07b81d1e9b9677088e590ac1303436da1e92b296e9be8e31ea042e3e1fd3d29b1742ad2c959e95afe30f63117b8f1bc3a3850070a5142fea7
+ languageName: node
+ linkType: hard
+
+"tsconfig-paths@npm:^3.15.0":
+ version: 3.15.0
+ resolution: "tsconfig-paths@npm:3.15.0"
+ dependencies:
+ "@types/json5": "npm:^0.0.29"
+ json5: "npm:^1.0.2"
+ minimist: "npm:^1.2.6"
+ strip-bom: "npm:^3.0.0"
+ checksum: 10c0/5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5
+ languageName: node
+ linkType: hard
+
+"tslib@npm:^2.4.0, tslib@npm:^2.8.0":
+ version: 2.8.1
+ resolution: "tslib@npm:2.8.1"
+ checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62
+ languageName: node
+ linkType: hard
+
+"tsx@npm:^4.21.0":
+ version: 4.21.0
+ resolution: "tsx@npm:4.21.0"
+ dependencies:
+ esbuild: "npm:~0.27.0"
+ fsevents: "npm:~2.3.3"
+ get-tsconfig: "npm:^4.7.5"
+ dependenciesMeta:
+ fsevents:
+ optional: true
+ bin:
+ tsx: dist/cli.mjs
+ checksum: 10c0/f5072923cd8459a1f9a26df87823a2ab5754641739d69df2a20b415f61814322b751fa6be85db7c6ec73cf68ba8fac2fd1cfc76bdb0aa86ded984d84d5d2126b
+ languageName: node
+ linkType: hard
+
+"type-check@npm:^0.4.0, type-check@npm:~0.4.0":
+ version: 0.4.0
+ resolution: "type-check@npm:0.4.0"
+ dependencies:
+ prelude-ls: "npm:^1.2.1"
+ checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58
+ languageName: node
+ linkType: hard
+
+"typed-array-buffer@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "typed-array-buffer@npm:1.0.3"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ es-errors: "npm:^1.3.0"
+ is-typed-array: "npm:^1.1.14"
+ checksum: 10c0/1105071756eb248774bc71646bfe45b682efcad93b55532c6ffa4518969fb6241354e4aa62af679ae83899ec296d69ef88f1f3763657cdb3a4d29321f7b83079
+ languageName: node
+ linkType: hard
+
+"typed-array-byte-length@npm:^1.0.3":
+ version: 1.0.3
+ resolution: "typed-array-byte-length@npm:1.0.3"
+ dependencies:
+ call-bind: "npm:^1.0.8"
+ for-each: "npm:^0.3.3"
+ gopd: "npm:^1.2.0"
+ has-proto: "npm:^1.2.0"
+ is-typed-array: "npm:^1.1.14"
+ checksum: 10c0/6ae083c6f0354f1fce18b90b243343b9982affd8d839c57bbd2c174a5d5dc71be9eb7019ffd12628a96a4815e7afa85d718d6f1e758615151d5f35df841ffb3e
+ languageName: node
+ linkType: hard
+
+"typed-array-byte-offset@npm:^1.0.4":
+ version: 1.0.4
+ resolution: "typed-array-byte-offset@npm:1.0.4"
+ dependencies:
+ available-typed-arrays: "npm:^1.0.7"
+ call-bind: "npm:^1.0.8"
+ for-each: "npm:^0.3.3"
+ gopd: "npm:^1.2.0"
+ has-proto: "npm:^1.2.0"
+ is-typed-array: "npm:^1.1.15"
+ reflect.getprototypeof: "npm:^1.0.9"
+ checksum: 10c0/3d805b050c0c33b51719ee52de17c1cd8e6a571abdf0fffb110e45e8dd87a657e8b56eee94b776b13006d3d347a0c18a730b903cf05293ab6d92e99ff8f77e53
+ languageName: node
+ linkType: hard
+
+"typed-array-length@npm:^1.0.7":
+ version: 1.0.7
+ resolution: "typed-array-length@npm:1.0.7"
+ dependencies:
+ call-bind: "npm:^1.0.7"
+ for-each: "npm:^0.3.3"
+ gopd: "npm:^1.0.1"
+ is-typed-array: "npm:^1.1.13"
+ possible-typed-array-names: "npm:^1.0.0"
+ reflect.getprototypeof: "npm:^1.0.6"
+ checksum: 10c0/e38f2ae3779584c138a2d8adfa8ecf749f494af3cd3cdafe4e688ce51418c7d2c5c88df1bd6be2bbea099c3f7cea58c02ca02ed438119e91f162a9de23f61295
+ languageName: node
+ linkType: hard
+
+"typescript@npm:^5":
+ version: 5.9.3
+ resolution: "typescript@npm:5.9.3"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 10c0/6bd7552ce39f97e711db5aa048f6f9995b53f1c52f7d8667c1abdc1700c68a76a308f579cd309ce6b53646deb4e9a1be7c813a93baaf0a28ccd536a30270e1c5
+ languageName: node
+ linkType: hard
+
+"typescript@patch:typescript@npm%3A^5#optional!builtin":
+ version: 5.9.3
+ resolution: "typescript@patch:typescript@npm%3A5.9.3#optional!builtin::version=5.9.3&hash=5786d5"
+ bin:
+ tsc: bin/tsc
+ tsserver: bin/tsserver
+ checksum: 10c0/ad09fdf7a756814dce65bc60c1657b40d44451346858eea230e10f2e95a289d9183b6e32e5c11e95acc0ccc214b4f36289dcad4bf1886b0adb84d711d336a430
+ languageName: node
+ linkType: hard
+
+"unbox-primitive@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "unbox-primitive@npm:1.1.0"
+ dependencies:
+ call-bound: "npm:^1.0.3"
+ has-bigints: "npm:^1.0.2"
+ has-symbols: "npm:^1.1.0"
+ which-boxed-primitive: "npm:^1.1.1"
+ checksum: 10c0/7dbd35ab02b0e05fe07136c72cb9355091242455473ec15057c11430129bab38b7b3624019b8778d02a881c13de44d63cd02d122ee782fb519e1de7775b5b982
+ languageName: node
+ linkType: hard
+
+"undici-types@npm:~6.21.0":
+ version: 6.21.0
+ resolution: "undici-types@npm:6.21.0"
+ checksum: 10c0/c01ed51829b10aa72fc3ce64b747f8e74ae9b60eafa19a7b46ef624403508a54c526ffab06a14a26b3120d055e1104d7abe7c9017e83ced038ea5cf52f8d5e04
+ languageName: node
+ linkType: hard
+
+"undici@npm:^6.25.0":
+ version: 6.26.0
+ resolution: "undici@npm:6.26.0"
+ checksum: 10c0/cf2b4caf58c33d6582970991290cc7a6486d6e738845f25dcdd16952d708ec844815c6d30362919764fcaf30f719891289341f1ada496f003ce2700310453a47
+ languageName: node
+ linkType: hard
+
+"unified@npm:^10.0.0, unified@npm:^10.1.0":
+ version: 10.1.2
+ resolution: "unified@npm:10.1.2"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ bail: "npm:^2.0.0"
+ extend: "npm:^3.0.0"
+ is-buffer: "npm:^2.0.0"
+ is-plain-obj: "npm:^4.0.0"
+ trough: "npm:^2.0.0"
+ vfile: "npm:^5.0.0"
+ checksum: 10c0/da9195e3375a74ab861a65e1d7b0454225d17a61646697911eb6b3e97de41091930ed3d167eb11881d4097c51deac407091d39ddd1ee8bf1fde3f946844a17a7
+ languageName: node
+ linkType: hard
+
+"unified@npm:^11.0.0":
+ version: 11.0.5
+ resolution: "unified@npm:11.0.5"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ bail: "npm:^2.0.0"
+ devlop: "npm:^1.0.0"
+ extend: "npm:^3.0.0"
+ is-plain-obj: "npm:^4.0.0"
+ trough: "npm:^2.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/53c8e685f56d11d9d458a43e0e74328a4d6386af51c8ac37a3dcabec74ce5026da21250590d4aff6733ccd7dc203116aae2b0769abc18cdf9639a54ae528dfc9
+ languageName: node
+ linkType: hard
+
+"unist-util-find-after@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "unist-util-find-after@npm:5.0.0"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ unist-util-is: "npm:^6.0.0"
+ checksum: 10c0/a7cea473c4384df8de867c456b797ff1221b20f822e1af673ff5812ed505358b36f47f3b084ac14c3622cb879ed833b71b288e8aa71025352a2aab4c2925a6eb
+ languageName: node
+ linkType: hard
+
+"unist-util-is@npm:^5.0.0":
+ version: 5.2.1
+ resolution: "unist-util-is@npm:5.2.1"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ checksum: 10c0/a2376910b832bb10653d2167c3cd85b3610a5fd53f5169834c08b3c3a720fae9043d75ad32d727eedfc611491966c26a9501d428ec62467edc17f270feb5410b
+ languageName: node
+ linkType: hard
+
+"unist-util-is@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "unist-util-is@npm:6.0.1"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ checksum: 10c0/5a487d390193811d37a68264e204dbc7c15c40b8fc29b5515a535d921d071134f571d7b5cbd59bcd58d5ce1c0ab08f20fc4a1f0df2287a249c979267fc32ce06
+ languageName: node
+ linkType: hard
+
+"unist-util-position@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "unist-util-position@npm:5.0.0"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ checksum: 10c0/dde3b31e314c98f12b4dc6402f9722b2bf35e96a4f2d463233dd90d7cde2d4928074a7a11eff0a5eb1f4e200f27fc1557e0a64a7e8e4da6558542f251b1b7400
+ languageName: node
+ linkType: hard
+
+"unist-util-stringify-position@npm:^3.0.0":
+ version: 3.0.3
+ resolution: "unist-util-stringify-position@npm:3.0.3"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ checksum: 10c0/14550027825230528f6437dad7f2579a841780318569851291be6c8a970bae6f65a7feb24dabbcfce0e5e68cacae85bf12cbda3f360f7c873b4db602bdf7bb21
+ languageName: node
+ linkType: hard
+
+"unist-util-stringify-position@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "unist-util-stringify-position@npm:4.0.0"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ checksum: 10c0/dfe1dbe79ba31f589108cb35e523f14029b6675d741a79dea7e5f3d098785045d556d5650ec6a8338af11e9e78d2a30df12b1ee86529cded1098da3f17ee999e
+ languageName: node
+ linkType: hard
+
+"unist-util-visit-parents@npm:^5.1.1":
+ version: 5.1.3
+ resolution: "unist-util-visit-parents@npm:5.1.3"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ unist-util-is: "npm:^5.0.0"
+ checksum: 10c0/f6829bfd8f2eddf63a32e2c302cd50978ef0c194b792c6fe60c2b71dfd7232415a3c5941903972543e9d34e6a8ea69dee9ccd95811f4a795495ed2ae855d28d0
+ languageName: node
+ linkType: hard
+
+"unist-util-visit-parents@npm:^6.0.0":
+ version: 6.0.2
+ resolution: "unist-util-visit-parents@npm:6.0.2"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ unist-util-is: "npm:^6.0.0"
+ checksum: 10c0/f1e4019dbd930301825895e3737b1ee0cd682f7622ddd915062135cbb39f8c090aaece3a3b5eae1f2ea52ec33f0931abb8f8a8b5c48a511a4203e3d360a8cd49
+ languageName: node
+ linkType: hard
+
+"unist-util-visit@npm:^4.1.0":
+ version: 4.1.2
+ resolution: "unist-util-visit@npm:4.1.2"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ unist-util-is: "npm:^5.0.0"
+ unist-util-visit-parents: "npm:^5.1.1"
+ checksum: 10c0/56a1f49a4d8e321e75b3c7821d540a45165a031dd06324bb0e8c75e7737bc8d73bdddbf0b0ca82000f9708a4c36861c6ebe88d01f7cf00e925f5d75f13a3a017
+ languageName: node
+ linkType: hard
+
+"unist-util-visit@npm:^5.0.0":
+ version: 5.1.0
+ resolution: "unist-util-visit@npm:5.1.0"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ unist-util-is: "npm:^6.0.0"
+ unist-util-visit-parents: "npm:^6.0.0"
+ checksum: 10c0/a56e1bbbf63fcb55abe379e660b9a3367787e8be1e2473bdb7e86cfa6f32b6c1fa0092432d7040b8a30b2fc674bbbe024ffe6d03c3d6bf4839b064f584463a4e
+ languageName: node
+ linkType: hard
+
+"unrs-resolver@npm:^1.6.2":
+ version: 1.11.1
+ resolution: "unrs-resolver@npm:1.11.1"
+ dependencies:
+ "@unrs/resolver-binding-android-arm-eabi": "npm:1.11.1"
+ "@unrs/resolver-binding-android-arm64": "npm:1.11.1"
+ "@unrs/resolver-binding-darwin-arm64": "npm:1.11.1"
+ "@unrs/resolver-binding-darwin-x64": "npm:1.11.1"
+ "@unrs/resolver-binding-freebsd-x64": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-arm64-musl": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-riscv64-gnu": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-riscv64-musl": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-x64-gnu": "npm:1.11.1"
+ "@unrs/resolver-binding-linux-x64-musl": "npm:1.11.1"
+ "@unrs/resolver-binding-wasm32-wasi": "npm:1.11.1"
+ "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.11.1"
+ "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.11.1"
+ "@unrs/resolver-binding-win32-x64-msvc": "npm:1.11.1"
+ napi-postinstall: "npm:^0.3.0"
+ dependenciesMeta:
+ "@unrs/resolver-binding-android-arm-eabi":
+ optional: true
+ "@unrs/resolver-binding-android-arm64":
+ optional: true
+ "@unrs/resolver-binding-darwin-arm64":
+ optional: true
+ "@unrs/resolver-binding-darwin-x64":
+ optional: true
+ "@unrs/resolver-binding-freebsd-x64":
+ optional: true
+ "@unrs/resolver-binding-linux-arm-gnueabihf":
+ optional: true
+ "@unrs/resolver-binding-linux-arm-musleabihf":
+ optional: true
+ "@unrs/resolver-binding-linux-arm64-gnu":
+ optional: true
+ "@unrs/resolver-binding-linux-arm64-musl":
+ optional: true
+ "@unrs/resolver-binding-linux-ppc64-gnu":
+ optional: true
+ "@unrs/resolver-binding-linux-riscv64-gnu":
+ optional: true
+ "@unrs/resolver-binding-linux-riscv64-musl":
+ optional: true
+ "@unrs/resolver-binding-linux-s390x-gnu":
+ optional: true
+ "@unrs/resolver-binding-linux-x64-gnu":
+ optional: true
+ "@unrs/resolver-binding-linux-x64-musl":
+ optional: true
+ "@unrs/resolver-binding-wasm32-wasi":
+ optional: true
+ "@unrs/resolver-binding-win32-arm64-msvc":
+ optional: true
+ "@unrs/resolver-binding-win32-ia32-msvc":
+ optional: true
+ "@unrs/resolver-binding-win32-x64-msvc":
+ optional: true
+ checksum: 10c0/c91b112c71a33d6b24e5c708dab43ab80911f2df8ee65b87cd7a18fb5af446708e98c4b415ca262026ad8df326debcc7ca6a801b2935504d87fd6f0b9d70dce1
+ languageName: node
+ linkType: hard
+
+"uri-js@npm:^4.2.2":
+ version: 4.4.1
+ resolution: "uri-js@npm:4.4.1"
+ dependencies:
+ punycode: "npm:^2.1.0"
+ checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c
+ languageName: node
+ linkType: hard
+
+"util-deprecate@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "util-deprecate@npm:1.0.2"
+ checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942
+ languageName: node
+ linkType: hard
+
+"uvu@npm:^0.5.0":
+ version: 0.5.6
+ resolution: "uvu@npm:0.5.6"
+ dependencies:
+ dequal: "npm:^2.0.0"
+ diff: "npm:^5.0.0"
+ kleur: "npm:^4.0.3"
+ sade: "npm:^1.7.3"
+ bin:
+ uvu: bin.js
+ checksum: 10c0/ad32eb5f7d94bdeb71f80d073003f0138e24f61ed68cecc8e15d2f30838f44c9670577bb1775c8fac894bf93d1bc1583d470a9195e49bfa6efa14cc6f4942bff
+ languageName: node
+ linkType: hard
+
+"vfile-location@npm:^5.0.0":
+ version: 5.0.3
+ resolution: "vfile-location@npm:5.0.3"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ vfile: "npm:^6.0.0"
+ checksum: 10c0/1711f67802a5bc175ea69750d59863343ed43d1b1bb25c0a9063e4c70595e673e53e2ed5cdbb6dcdc370059b31605144d95e8c061b9361bcc2b036b8f63a4966
+ languageName: node
+ linkType: hard
+
+"vfile-message@npm:^3.0.0":
+ version: 3.1.4
+ resolution: "vfile-message@npm:3.1.4"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ unist-util-stringify-position: "npm:^3.0.0"
+ checksum: 10c0/c4ccf9c0ced92d657846fd067fefcf91c5832cdbe2ecc431bb67886e8c959bf7fc05a9dbbca5551bc34c9c87a0a73854b4249f65c64ddfebc4d59ea24a18b996
+ languageName: node
+ linkType: hard
+
+"vfile-message@npm:^4.0.0":
+ version: 4.0.3
+ resolution: "vfile-message@npm:4.0.3"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ unist-util-stringify-position: "npm:^4.0.0"
+ checksum: 10c0/33d9f219610d27987689bb14fa5573d2daa146941d1a05416dd7702c4215b23f44ed81d059e70d0e4e24f9a57d5f4dc9f18d35a993f04cf9446a7abe6d72d0c0
+ languageName: node
+ linkType: hard
+
+"vfile@npm:^5.0.0":
+ version: 5.3.7
+ resolution: "vfile@npm:5.3.7"
+ dependencies:
+ "@types/unist": "npm:^2.0.0"
+ is-buffer: "npm:^2.0.0"
+ unist-util-stringify-position: "npm:^3.0.0"
+ vfile-message: "npm:^3.0.0"
+ checksum: 10c0/c36bd4c3f16ec0c6cbad0711ca99200316bbf849d6b07aa4cb5d9062cc18ae89249fe62af9521926e9659c0e6bc5c2c1da0fe26b41fb71e757438297e1a41da4
+ languageName: node
+ linkType: hard
+
+"vfile@npm:^6.0.0":
+ version: 6.0.3
+ resolution: "vfile@npm:6.0.3"
+ dependencies:
+ "@types/unist": "npm:^3.0.0"
+ vfile-message: "npm:^4.0.0"
+ checksum: 10c0/e5d9eb4810623f23758cfc2205323e33552fb5972e5c2e6587babe08fe4d24859866277404fb9e2a20afb71013860d96ec806cb257536ae463c87d70022ab9ef
+ languageName: node
+ linkType: hard
+
+"web-namespaces@npm:^2.0.0":
+ version: 2.0.1
+ resolution: "web-namespaces@npm:2.0.1"
+ checksum: 10c0/df245f466ad83bd5cd80bfffc1674c7f64b7b84d1de0e4d2c0934fb0782e0a599164e7197a4bce310ee3342fd61817b8047ff04f076a1ce12dd470584142a4bd
+ languageName: node
+ linkType: hard
+
+"which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "which-boxed-primitive@npm:1.1.1"
+ dependencies:
+ is-bigint: "npm:^1.1.0"
+ is-boolean-object: "npm:^1.2.1"
+ is-number-object: "npm:^1.1.1"
+ is-string: "npm:^1.1.1"
+ is-symbol: "npm:^1.1.1"
+ checksum: 10c0/aceea8ede3b08dede7dce168f3883323f7c62272b49801716e8332ff750e7ae59a511ae088840bc6874f16c1b7fd296c05c949b0e5b357bfe3c431b98c417abe
+ languageName: node
+ linkType: hard
+
+"which-builtin-type@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "which-builtin-type@npm:1.2.1"
+ dependencies:
+ call-bound: "npm:^1.0.2"
+ function.prototype.name: "npm:^1.1.6"
+ has-tostringtag: "npm:^1.0.2"
+ is-async-function: "npm:^2.0.0"
+ is-date-object: "npm:^1.1.0"
+ is-finalizationregistry: "npm:^1.1.0"
+ is-generator-function: "npm:^1.0.10"
+ is-regex: "npm:^1.2.1"
+ is-weakref: "npm:^1.0.2"
+ isarray: "npm:^2.0.5"
+ which-boxed-primitive: "npm:^1.1.0"
+ which-collection: "npm:^1.0.2"
+ which-typed-array: "npm:^1.1.16"
+ checksum: 10c0/8dcf323c45e5c27887800df42fbe0431d0b66b1163849bb7d46b5a730ad6a96ee8bfe827d078303f825537844ebf20c02459de41239a0a9805e2fcb3cae0d471
+ languageName: node
+ linkType: hard
+
+"which-collection@npm:^1.0.2":
+ version: 1.0.2
+ resolution: "which-collection@npm:1.0.2"
+ dependencies:
+ is-map: "npm:^2.0.3"
+ is-set: "npm:^2.0.3"
+ is-weakmap: "npm:^2.0.2"
+ is-weakset: "npm:^2.0.3"
+ checksum: 10c0/3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2
+ languageName: node
+ linkType: hard
+
+"which-typed-array@npm:^1.1.16, which-typed-array@npm:^1.1.19":
+ version: 1.1.20
+ resolution: "which-typed-array@npm:1.1.20"
+ dependencies:
+ available-typed-arrays: "npm:^1.0.7"
+ call-bind: "npm:^1.0.8"
+ call-bound: "npm:^1.0.4"
+ for-each: "npm:^0.3.5"
+ get-proto: "npm:^1.0.1"
+ gopd: "npm:^1.2.0"
+ has-tostringtag: "npm:^1.0.2"
+ checksum: 10c0/16fcdada95c8afb821cd1117f0ab50b4d8551677ac08187f21d4e444530913c9ffd2dac634f0c1183345f96344b69280f40f9a8bc52164ef409e555567c2604b
+ languageName: node
+ linkType: hard
+
+"which@npm:^2.0.1":
+ version: 2.0.2
+ resolution: "which@npm:2.0.2"
+ dependencies:
+ isexe: "npm:^2.0.0"
+ bin:
+ node-which: ./bin/node-which
+ checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f
+ languageName: node
+ linkType: hard
+
+"which@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "which@npm:6.0.1"
+ dependencies:
+ isexe: "npm:^4.0.0"
+ bin:
+ node-which: bin/which.js
+ checksum: 10c0/7e710e54ea36d2d6183bee2f9caa27a3b47b9baf8dee55a199b736fcf85eab3b9df7556fca3d02b50af7f3dfba5ea3a45644189836df06267df457e354da66d5
+ languageName: node
+ linkType: hard
+
+"word-wrap@npm:^1.2.5":
+ version: 1.2.5
+ resolution: "word-wrap@npm:1.2.5"
+ checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20
+ languageName: node
+ linkType: hard
+
+"yallist@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "yallist@npm:5.0.0"
+ checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416
+ languageName: node
+ linkType: hard
+
+"yocto-queue@npm:^0.1.0":
+ version: 0.1.0
+ resolution: "yocto-queue@npm:0.1.0"
+ checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f
+ languageName: node
+ linkType: hard
+
+"zwitch@npm:^2.0.0":
+ version: 2.0.4
+ resolution: "zwitch@npm:2.0.4"
+ checksum: 10c0/3c7830cdd3378667e058ffdb4cf2bb78ac5711214e2725900873accb23f3dfe5f9e7e5a06dcdc5f29605da976fc45c26d9a13ca334d6eea2245a15e77b8fc06e
+ languageName: node
+ linkType: hard