 Good morning everybody. For the lightning talks, our next speaker is Jelle van der Waar, who's going to tell us about Campano. Jelle, big hand for Jelle, please. Can you hear me now? Yeah, okay, that's better. So it's collaboration, communication and sharing platform. Let's talk a little bit about what Campano is. It's an architecture and a little bit about our programming API. First I want to introduce myself. So I'm Jelle van der Waar. I work at Campano as a developer. I work on our main web client called WebApp. I also do some work on the back end on our continuous integration stack. In my spare time, I'm an R&D developer. And if you want to contact me or check out my github, it's all there. So what's Campano? Campano, as I said, is a communication sharing and collaboration platform. So you can share your tasks, email, notes, calendaring with your colleagues, with externals. And we want to unite and you can do video conferencing. We want to unite that in one single interface. We've got our main web client built for that. And Campano is a fork of Surafa. As you may know, Surafa implemented the MAPI certification. So we also use MAPI and Surafa Campano is fully a GPL feature. So I'll talk a little bit about our clients. We have a lot of clients supported. We have our main web client, which is called WebApp. It has a plug-in infrastructure. So you can have false integration, for example, with oncloud to attach a file on cloud on an email easily. We have a desktop-native client called the DeskApp, which integrates more with your desktop. So if you want to have mail to functionality, you can use that. We have Zephous, which is used for connectivity with mobile devices. So, for example, Android, Windows Phone, and even Outlook. I'll talk more about that later. We also support IMAP and POP3 and Keldove, if you rather use Thunderbird. All these clients need somewhere to get their data. And they have to get that from the Campano server, which is in the middle of here. And we at Campano would like to integrate our solution in your existing Linux server. So, for example, you can use any MTA with Campano. We also have a plug-able infrastructure for user management. So if you want to get your user information and password authentication from LDAP, that's possible. You can also use AD. You can also store your user info in a MySQL server. The MySQL server is the only way to restore data. Let's see, what else? Attachments, you can also store them almost anywhere you like. So, on disk or in the database or on any S3-based protocol. And we want Campano to scale. So, for example, you can use it on your own server. Or you can create a high availability setup with multiple Campano servers where you charge your users. So, for example, users want a 10 or 1 server. Users 10 to 20 on another server. And we can also do failover. But that requires some more tweaking. So, as I said, everything is stored in MySQL. We store everything as a MAPI object. Which means, if you first look at the MySQL database, you're like, what? But if you didn't know more about MAPI, it gets more clear. This also means that we have to do a lot of conversion. So we convert, if you get an email, we convert it to a MAPI item. If we send an email, we convert it back. And we don't implement the wire protocol, which Outlook uses to connect to exchange. We use, because MAPI is a bit RPC-like. So you need some interface to talk to the server. As transport layer, we're using soap for that. So you can't use it as a drop-in replacement to connect to Outlook. But that's where Zapoosh comes in. Zapoosh is our active sync implementation. It's been around for a while. It's known to work. It's written in PHP. It also supports multiple backends. So you're not tied to Copano. You can also use Mildir or IMAP. And you can, since Outlook 2013, you can also connect to Zapoosh from Outlook. But you can only get your data from your own store. Normally in Outlook, you can open, for example, a colleague store or shared calendars or the global address book. And that's not possible with the implementation of active sync in Outlook. But we provide a plugin for Outlook called the Copano Outlook Extension. You can use that to get more functionality. It's also fully open source. So now I'll talk a little bit about MAPI. Because later we'll talk a little bit about boring API. And then it's nice to know how the data is stored, how it looks like. So this is only the MAPI objects. So there's a lot more about MAPI. So all your user data is from your user. It's stored in a store. And a store is a MAPI object. It contains folders, for example, your inbox folder, your Outbox folder. All these folders contain items. And an item can have an attachment. Or an item can actually also attach an item, which is rather rare as possible. And all these objects have in common that they have a set of properties. And these properties have a unique identifier. For example, the subject, which is called peer subject in MAPI. From that prop tag, you can derive the type it is. So is it a string? Or is it a boolean? Is it a time step? And it has a value. So it's a bit like a key value store. Which means that you can create your own properties quite easily. So it's easy to extend. And with these two operations, you can set a property or you can get a property. So we've worked for a long time with MAPI. And for example, this extensibility is something we really like. But MAPI, it's not only these objects. MAPI also provides more of a framework. And one of these frameworks is the incremental change synchronization. This means that if you have your phone switched off from the internet, for example, for a day and you want to sync up all your items during the time period, you can ask the server, hey, give me all the changes for this timeframe and it will sync them to your client. And that's one of the things that MAPI also contains. But there are also, of course, some less fun parts. At this base, it's hard to grasp. It's very low level. So you have to write a lot of code to get things done. And there is some documentation actually provided by Microsoft. But there are also parts of it, parts of the puzzle. So they tell you this is an identifier, but you don't get the whole picture. So you have to do a lot of research. And there's a lot of legacy stuff in MAPI. So because it's from the 80s, if you, for example, want to get your body, that property is called to be your body, you call gap props, and then you get eight kilobytes of your body. If you want to get more, you need to stream it, and you need to write more code. Also, these unique identifiers, they ran out of it because there are only 8,000 defined. So they added something called name properties, which actually is more like a namespacing, which means you also have to detect if it's a normal property or a name property. So that's a lot of work. And because of all that work, we wanted to abstract it. We wanted to make it easier for new developers, for externals, who wants to interface with us to work with Copano and to program against it. And because almost every application in our stack is a client of the server, we also made this connector client. It's called Python Copano. And the idea is that you don't have to know what MAPI is about to use it. And we've built some tools on top of it. For example, our search engine. We've used Xapien with it, and we can easily put those things together with Python to create the search engine. We also created the backup solution for it with it and some tooling. So I'll now show some example of how you would write some code in MAPI and how you would write it in our new API. So first off, you have to connect to the server. You open a session to the server with your news user, name your passwords. Then you have to get the store where your data is. You ask the session, give me the store. Then you want to go to the Outbox folder. Oh, yeah, we're sending an email, by the way. And the Outbox folder has a unique identifier. So you have to ask the store, where's the Outbox folder? Because once you have the ID, so you get the property, you open the Outbox folder, then you can create a message. Oh, that was quite easy. But then you need to set recipients. And that's a lot of code. And this is only for the receiver's recipient. So if you want to add a CC or BCC, you have to write even more code. And then you have to set your subjects and your body. And then you can submit the message. And what it does, it just sets a special flag on the message and then our spooler picks it up and sends it out of the wire. If you want to do this in Python Copano, it's far easier. So you connect to the server, again, with your username and your password. You select the user you're logged into. You create the item with the subject and body and the receiver. Oh, hey, just send it. Hey, you're done. We're also in the process, because Copano is quite real. We're around now for, I guess, a year or more. We're also in the process of getting into downstream. We're working together with Debian into getting it packaged. You can see the check out the status on the wiki. We're also now taxed for open source factory, so you can already use there. We also provide an open-busy build service repository, which you can already use. So this is a talk about Copano. I would like to show the introduction. If you want to get some more information, you can visit our website. You can even download our packages and try them out. We package for almost every distribution. Or you can compile it yourself with a provided Git repository with a booth in building K. So if you want to talk with us, you can go there. Questions? So big hand for Jelle. We have a couple of minutes for questions. Just raise your hand and I'll get the mic right over to you. I see from your website you're based in both Germany and the Netherlands. What's the story behind that? Oh, that's... Well, we already started in Delft, and I think it was... Yeah, I'm really not sure about the details, but we partnered up with the German, with some German people a long time ago. And yeah, we have two offices, because we have a lot of customers in Germany. And so we have a separate support department there. So that's why we have also an office there. Any other questions? I think out of curiosity in your opinion, how does it compare to Zimbabwe through open source solutions? Can you repeat the question for us? Okay, so the question was how does it compare to Zimbabwe? And that's... Yeah, I don't know. I actually have never used Zimbabwe. I think it was fully written in Java. And it's more takes... From what I've heard, it takes over your system while we try to integrate with, for example, allowing you to use PostFix, allowing you to use LDAP already.