<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Jenny from the blog</title>
    <description>Software Engineer | MSc in Information Security</description>
    <link>https://xheni.me/</link>
    <atom:link href="https://xheni.me/feed.xml" rel="self" type="application/rss+xml" />
    <pubDate>Thu, 28 Oct 2021 15:58:30 +0000</pubDate>
    <lastBuildDate>Thu, 28 Oct 2021 15:58:30 +0000</lastBuildDate>
    <generator>Jekyll v3.9.0</generator>
    
      <item>
        <title>Insecure Zendesk SSO implementation by generating JWT client-side</title>
        <description>&lt;h2 id=&quot;belle-of-the-ball&quot;&gt;Belle of the Ball&lt;/h2&gt;

&lt;p&gt;Two months ago I submitted a security bug report to &lt;a href=&quot;https://trint.com/&quot;&gt;Trint Ltd.&lt;/a&gt; on &lt;a href=&quot;https://hackerone.com/&quot;&gt;HackerOne&lt;/a&gt;. It got disclosed today and managed to get ranked on top of hacktivity feed ;)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/hackerone-top.png&quot; alt=&quot;Belle o the Ball&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Below you can find the report originally submitted &lt;a href=&quot;https://hackerone.com/reports/638635&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;/h2&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app.trint.com&lt;/code&gt; implements SSO to Zendesk, it does this by using JWT as described at https://support.zendesk.com/hc/en-us/articles/203663816-Enabling-JWT-JSON-Web-Token-single-sign-on&lt;/p&gt;

&lt;p&gt;This functionality has not been implemented securely because the JWT generation happens in the client-side. This is done by the Zendesk secret being hardcoded in the JavaScript code.
The secret is used to create JSON Web Tokens and then you can use the generated token to impersonate any customer in Zendesk. (therefore potentially getting access to their support tickets)&lt;/p&gt;

&lt;p&gt;Whilst &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;support.trint.com&lt;/code&gt; is marked as out of scope for the program, the described vulnerability isn’t caused by Zendesk. The vulnerable component is in &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;app.trint.com&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;assessment&quot;&gt;Assessment&lt;/h2&gt;

&lt;p&gt;The JavaScript source map files are available next to the minified production files. This significantly makes analysing this issue easier.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;JavaScript file: https://app.trint.com/static/js/app.e984c9df.js&lt;/li&gt;
  &lt;li&gt;Sourcemap file: https://app.trint.com/static/js/app.e984c9df.js.map&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Looking at some of the UI views, I stumbled upon &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;static/js/modules/auth/pages/ZendeskLoadingPage.jsz&lt;/code&gt; I’ve attached a stripped version which shows the JWT generation:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import { ZENDESK_DOMAIN } from 'modules/core/constants/index';

const { REACT_APP_ZENDESK_SECRET } = process.env;


function RedirectToZendesk(props) {
  const { user, history } = props;

  function generateZendeskTokenAndRedirect() {
    const TIME_NOW_OBJECT = moment(Date.now());
    try {
      const payload = {
        iat: TIME_NOW_OBJECT.unix(),
        jti: uuid.v4(),
        name: `${user.profile.firstName} ${user.profile.lastName}`,
        email: user.username,
      };

      // encode zendesk token
      const zendeskToken = jwt.sign(payload, REACT_APP_ZENDESK_SECRET);
      window.location = `${ZENDESK_DOMAIN}/access/jwt?jwt=${zendeskToken}`;
    } catch (err) {
      history.push('/error');
    }
  }

  useEffect(
    () =&amp;gt; {
      generateZendeskTokenAndRedirect(user);
    },
    [user],
  );

  return &amp;lt;Loader /&amp;gt;;
}


export default ZendeskLoadingPage;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Searching for &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;REACT_APP_ZENDESK_SECRET&lt;/code&gt; in the sourcemap will show the JWT secret:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;var REACT_APP_ZENDESK_SECRET = &quot;oq1HJ4jXo99Wt41bwvLh9BXBVdgpi52CjkXbThow7UhWQGtJ&quot;;&lt;/code&gt;
`
Generating the JWT on the client-side like this allows anyone to mint an arbitrary JWT. It would probably be better to generate this on the server-side.&lt;/p&gt;

&lt;h2 id=&quot;reproduction-steps&quot;&gt;Reproduction steps&lt;/h2&gt;

&lt;p&gt;As logged-in user press “Support” on https://app.trint.com
Intercept the traffic and see the call to https://trintsupport.zendesk.com/access/jwt?jwt=[JWT_TOKEN]
Logout of Zendesk
Put the JWT token from above URI into https://jwt.io and decode it.
Example:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NjI3MDk2NTksImp0a
SI6IjIxZDAyOTg3LWU3YWItNDQ5MC05N2Q3LTc2YTBmMzJhOTVjOCIsIm5hbWUiOiJUZ
XN0IFRlc3QiLCJlbWFpbCI6ImIzODcxNjk0QHVyaGVuLmNvbSJ9.mnnx7dbpXbvU7xr
5Bp5pad2eHVN01mSsXApmZoFj73c
{
  &quot;iat&quot;: 1562709659,
  &quot;jti&quot;: &quot;21d02987-e7ab-4490-97d7-76a0f32a95c8&quot;,
  &quot;name&quot;: &quot;Test Test&quot;,
  &quot;email&quot;: &quot;b3871694@urhen.com&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now we can continue with tampering the JWT
Change IAT to the current Unix timestamp
Change JTI to a random UUID v4
Change email to the victim email address
Insert &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;oq1HJ4jXo99Wt41bwvLh9BXBVdgpi52CjkXbThow7UhWQGtJ&lt;/code&gt; as HMAC secret.
Use the resulting JWT in a call to &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://trintsupport.zendesk.com/access/jwt?jwt=[JWT_TOKEN]&lt;/code&gt;. You will be logged in as the victim.&lt;/p&gt;

&lt;h2 id=&quot;impact&quot;&gt;Impact&lt;/h2&gt;

&lt;p&gt;Access to the Zendesk account of Trint customers. This includes potentially the support history of said user.&lt;/p&gt;

&lt;p&gt;I haven’t verified whether the same SSO flow can also be used against Zendesk administrators. If so, the risk would be higher.&lt;/p&gt;
</description>
        <pubDate>Sun, 08 Sep 2019 12:20:23 +0000</pubDate>
        <link>https://xheni.me/2019/Insecure-Zendesk-SSO-implementation-by-generating-JWT-client-side/</link>
        <guid isPermaLink="true">https://xheni.me/2019/Insecure-Zendesk-SSO-implementation-by-generating-JWT-client-side/</guid>
        
        <category>security</category>
        
        <category>HackerOne</category>
        
        
        <category>security</category>
        
        <category>report</category>
        
      </item>
    
      <item>
        <title>A security review of phpList REST API</title>
        <description>&lt;p&gt;APIs are essential for building applications that are open and can integrate with other applications and services, yet with the openness of APIs comes a challenge: APIs can create additional security risks, as they increase the number of ways in which malicious actors could get into applications. Therefore, when developing APIs, careful design and security are important. As part of my internship at phpList, I had the opportunity to work on performing a risk assessment for the REST API.&lt;/p&gt;

&lt;p&gt;On a personal note, it has been a challenging and exciting experience. I would like to share the research with the community as a learning opportunity for readers and myself. Please note that all high severity risks have been addressed and resolved already in the various related code repositories.&lt;/p&gt;

&lt;h2 id=&quot;recap-on-the-phplist-rest-api&quot;&gt;Recap on the phpList REST API&lt;/h2&gt;

&lt;p&gt;The phpList &lt;a href=&quot;https://github.com/phpList/rest-api&quot;&gt;REST API&lt;/a&gt; provides functions for superusers to manage lists and subscribers. It uses functionality from the phpList &lt;a href=&quot;https://github.com/phpList/core&quot;&gt;core&lt;/a&gt; module .&lt;/p&gt;

&lt;p&gt;This new REST API can also be used to provide REST access to an existing phpList 3 installation. For this, &lt;a href=&quot;https://github.com/phpList/phplist3&quot;&gt;phpList 3&lt;/a&gt; installation and the phpList 4 installation with the REST API need to share the same database.&lt;/p&gt;

&lt;h3 id=&quot;local-demo-with-postman&quot;&gt;Local demo with Postman&lt;/h3&gt;

&lt;p&gt;You can try out the REST API by using pre-prepared requests and the Postman GUI tool. Install Postman as a browser extension or stand-alone app, open the phpList 4 &lt;a href=&quot;https://documenter.getpostman.com/view/3293511/phplist-4-rest-api-demo/RVftkC9t#4710e871-973d-46fa-94b7-727fdc292cd5&quot;&gt;REST API Demo collection&lt;/a&gt; and click “Run in Postman”.
For more information on how to install and try phpList REST API , please read the &lt;a href=&quot;https://github.com/phpList/rest-api/blob/master/README.md&quot;&gt;documentation&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;tools-used&quot;&gt;Tools used&lt;/h3&gt;

&lt;p&gt;Reading “&lt;a href=&quot;https://www.amazon.com/Web-Application-Hackers-Handbook-Exploiting/dp/1118026470&quot;&gt;The Web Application Hacker’s Handbook&lt;/a&gt;”, helped me quite a lot in the process of reviewing the security of phpList REST API.
Curl
Another tool that I used was &lt;strong&gt;BurpSuite Community Edition&lt;/strong&gt;, which was also mentioned in the book. Burp is widely used by security professionals to find security vulnerabilities in web applications and I had the opportunity to play around with it for this risk assessment.
&lt;strong&gt;Burp&lt;/strong&gt; can test any HTTP endpoint. The process is to proxy the client’s traffic through Burp and then test it in the normal way.
&lt;img src=&quot;/images/burp.png&quot; alt=&quot;Burp&quot; title=&quot;Burp&quot; /&gt;
 &lt;em&gt;Burp interface&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I also used &lt;strong&gt;cURL&lt;/strong&gt; to consume the API calls. It is an open source software command line tool that is used to transfer data with URLs.&lt;/p&gt;

&lt;p&gt;The REST API topic has been also covered in several sites such as OWASP (The Open Web Application Security Project) &lt;a href=&quot;https://www.owasp.org/index.php/REST_Security_Cheat_Sheet&quot;&gt;REST Security&lt;/a&gt;, which is a good starter reference to learn about the main security challenges of REST.&lt;/p&gt;

&lt;p&gt;On a personal note, it has been a challenging and exciting experience. I would like to share the research with the community since the found high severity risks have been &lt;strong&gt;resolved&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;implementation-of-the-api-during-testing&quot;&gt;Implementation of the API during testing&lt;/h2&gt;

&lt;p&gt;Here is a technical overview of how the REST API was implemented during my testing.&lt;/p&gt;

&lt;h3 id=&quot;session-creation&quot;&gt;Session creation&lt;/h3&gt;
&lt;p&gt;For authentication a user has to call the /api/v2/sessions route and provide username and password within the POST body:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;POST /app.php/api/v2/sessions HTTP/1.1
Host: 10.211.55.4:82
User-Agent: curl/7.54.0
Accept: */*
Content-Type: application/json
Content-Length: 58
Connection: close

{
    &quot;login_name&quot;: &quot;admin&quot;,
    &quot;password&quot;: &quot;admin1234&quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The controller then queries the existing phpList database for an administrator and user with this password:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public function postAction(Request $request): View
{
   $this-&amp;gt;validateCreateRequest($request);
   $administrator = $this-&amp;gt;administratorRepository-&amp;gt;findOneByLoginCredentials(
       $request-&amp;gt;get('login_name'),
       $request-&amp;gt;get('password')
   );
   if ($administrator === null) {
       throw new UnauthorizedHttpException('', 'Not authorized', null, 1500567098);
   }

   $token = $this-&amp;gt;createAndPersistToken($administrator);

   return View::create()-&amp;gt;setStatusCode(Response::HTTP_CREATED)-&amp;gt;setData($token);
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The controller is creating a new session key of 256 bytes and returning the MD5 representation of it. The user can then use those credentials for authentication.&lt;/p&gt;

&lt;h3 id=&quot;session-verification&quot;&gt;Session verification&lt;/h3&gt;

&lt;p&gt;For authentication purposes a trait AuthenticationTrait is implemented, this trait implements a function requireAuthentication:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;private function requireAuthentication(Request $request): Administrator
{
   $administrator = $this-&amp;gt;authentication-&amp;gt;authenticateByApiKey($request);
   if ($administrator === null) {
       throw new AccessDeniedHttpException(
           'No valid session key was provided as basic auth password.',
           null,
           1512749701
       );
   }

   return $administrator;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;When this function is invoked, it calls &lt;em&gt;\PhpList\Core\Security\Authentication::authenticateByApiKey&lt;/em&gt;, this function is implemented as following.&lt;/p&gt;

&lt;p&gt;As one can see, it searches the AdministratorTokenRepository for an unexpired key and then verifies whether the token belongs to an administrator:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public function authenticateByApiKey(Request $request)
{
   $apiKey = $request-&amp;gt;headers-&amp;gt;get('php-auth-pw');
   if (empty($apiKey)) {
       return null;
   }

   $token = $this-&amp;gt;tokenRepository-&amp;gt;findOneUnexpiredByKey($apiKey);
   if ($token === null) {
       return null;
   }

   /** @var Administrator|null $administrator */
   $administrator = $token-&amp;gt;getAdministrator();
   if ($administrator === null) {
       return null;
   }

   try {
       // This checks for cases where a super user created a session key and then got their super user
       // privileges removed during the lifetime of the session key.
     // In addition, this will load the lazy-loaded model from the database,
       // which will check that the model really exists in the database (i.e., it has not been deleted).
       if (!$administrator-&amp;gt;isSuperUser()) {
           $administrator = null;
       }
   } catch (EntityNotFoundException $exception) {
       $administrator = null;
   }

   return $administrator;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;This is done by querying the table phplist_admintoken for the current session key.&lt;/p&gt;

&lt;p&gt;In the controllers, authentication is enforced by calling &lt;em&gt;\PhpList\RestBundle\Controller\SessionController::validateCreateRequest&lt;/em&gt; in every function such as the following:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;public function cgetAction(Request $request): View
{
   $this-&amp;gt;requireAuthentication($request);

   return View::create()-&amp;gt;setData($this-&amp;gt;subscriberListRepository-&amp;gt;findAll());
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;lists-route&quot;&gt;Lists Route&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;\PhpList\RestBundle\Controller\ListController&lt;/em&gt; implements cgetAction, getAction and deleteAction. Those functions allow an administrator to:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Get a collection of lists&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Get information about a single list&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Delete a list&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The information is returned to the user as a JSON string with a Content-Type of application/json:&lt;/p&gt;
&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HTTP/1.1 200 OK
Date: Thu, 21 Jun 2018 14:45:33 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: no-cache, private
Content-Length: 210
Connection: close
Content-Type: application/json

{&quot;name&quot;:&quot;newsletter&quot;,&quot;description&quot;:&quot;Sign up to our newsletter&amp;lt;h1&amp;gt;&amp;lt;script&amp;gt;alert(1)&amp;lt;\/script&amp;gt;&quot;,&quot;creation_date&quot;:&quot;2018-06-20T13:29:07+02:00&quot;,&quot;list_position&quot;:0,&quot;subject_prefix&quot;:&quot;&quot;,
&quot;public&quot;:true,&quot;category&quot;:&quot;&quot;,&quot;id&quot;:2}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;h3 id=&quot;subscribers-route&quot;&gt;Subscribers route&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;\PhpList\RestBundle\Controller\SubscriberController&lt;/em&gt;
implements postAction. This function allows an administrator to:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a subscriber&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The information is returned to the user as a JSON string with a Content-Type of application/json:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HTTP/1.1 201 Created
Date: Thu, 21 Jun 2018 15:05:17 GMT
Server: Apache/2.4.18 (Ubuntu)
Cache-Control: no-cache, private
Content-Length: 219
Connection: close
Content-Type: application/json

{&quot;creation_date&quot;:&quot;2018-06-21T17:05:17+02:00&quot;,&quot;email&quot;:&quot;xhenitest@xheni.me&quot;,
&quot;confirmed&quot;:false,&quot;blacklisted&quot;:false,&quot;bounce_count&quot;:0,
&quot;unique_id&quot;:&quot;498f3de0e0b033665f58bb4b3c3f3c21&quot;,
&quot;html_email&quot;:false,&quot;disabled&quot;:false,&quot;id&quot;:7}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;The controller performs the required authentication checks and doesn’t expose any functionalities not yet available to superusers. The security level is thus adequate.&lt;/p&gt;

&lt;h2 id=&quot;security-concerns-and-mitigation&quot;&gt;Security concerns and mitigation&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Note&lt;/em&gt;: High severity risks have already been &lt;em&gt;mitigated&lt;/em&gt;; the other risks identified have been addressed by hardening the pertinent code.&lt;/p&gt;

&lt;h3 id=&quot;disabled-admins-can-still-use-rest-api&quot;&gt;Disabled admins can still use REST API&lt;/h3&gt;

&lt;p&gt;Administrators that are disabled in phpList are still able to login using the REST API.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Adjust the authenticateByApiKey to check if the user is disabled.
Note: This issue has already been &lt;a href=&quot;https://github.com/phpList/core/pull/293&quot;&gt;fixed&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;invalid-login-attempts-are-not-logged&quot;&gt;Invalid login attempts are not logged&lt;/h3&gt;

&lt;p&gt;Invalid login attempts using the REST API are not logged. The regular web interface is logging those in the event log.
From these logs you can monitor activity and potentially discover any patterns or excessive usage activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Add logging of login events to REST API.&lt;/p&gt;

&lt;h3 id=&quot;insecure-storage-of-sensitive-information&quot;&gt;Insecure storage of sensitive information&lt;/h3&gt;

&lt;p&gt;As the session tokens are stored unencrypted, a leak of the phplist_admintoken table will allow a malicious actor to authenticate as phpList administrator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: Adjust the login logic to use a strong and expensive hashing algorithm such as bcrypt or scrypt.&lt;/p&gt;

&lt;h3 id=&quot;insecure-querying-of-a-secret-timing-attack&quot;&gt;Insecure querying of a secret (“Timing attack”)&lt;/h3&gt;

&lt;p&gt;As the session token is stored in a VARCHAR(255) field in the database this may be vulnerable to timing attacks.
An attacker may be able to infer a correct session token based on the responses. This risk is however quite a bit mitigated, as timing attacks require a close proximity to the server as well as a lot of session tokens. (due to detecting timing differences in milliseconds).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;: This would be addressed as well by using an hashing algorithm with a salt (e.g. bcrypt).&lt;/p&gt;

&lt;h3 id=&quot;stored-cross-site-scripting&quot;&gt;Stored Cross-Site Scripting&lt;/h3&gt;

&lt;p&gt;Some browsers such as Internet Explorer require the ​nosniff header to be set and potentially dangerous characters to be encoded. Otherwise other websites embedding this resource could trigger a XSS vulnerability.
According to wikipedia (link )&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;MIME sniffing was, and still is, used by some web browsers, including notably Microsoft’s Internet Explorer, in an attempt to help web sites which do not correctly signal the MIME type of web content display correctly.[1] However, doing this opens up a serious security vulnerability,[2] in which, by confusing the MIME sniffing algorithm, the browser can be manipulated into interpreting data in a way that allows an attacker to carry out operations that are not expected by either the site operator or user, such as cross-site scripting.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So when Internet Explorer sees HTML in a page it can be tricked to execute such. That’s why the nosniff header is required, this tells the browser “do not try to magically interpret what this could be”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Add a &lt;strong&gt;X-Content-Type-Options&lt;/strong&gt; header with nosniff option.&lt;/li&gt;
  &lt;li&gt;Add a &lt;strong&gt;Content-Security-Policy&lt;/strong&gt; header disabling all script execution.&lt;/li&gt;
  &lt;li&gt;Add &lt;strong&gt;X-Frame-Options’&lt;/strong&gt; header and set it to DENY.&lt;/li&gt;
  &lt;li&gt;Use &lt;strong&gt;JSON_HEX_TAG&lt;/strong&gt; when using json_encode. This also encoded characters such as &amp;lt; and ​&amp;gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The security headers have been &lt;a href=&quot;https://github.com/phpList/rest-api/pull/110&quot;&gt;added&lt;/a&gt; and the fourth one is another hardening that I’m working on.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/burp-response.png&quot; alt=&quot;Burp&quot; title=&quot;Burp response&quot; /&gt;
 &lt;em&gt;Security headers added to response&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;future-development&quot;&gt;Future Development&lt;/h2&gt;

&lt;p&gt;Some additional fixes remain a work in progress and I will submit them soon. Meanwhile, everyone should feel free to open their Pull Requests and report any issues identified. Check out the &lt;a href=&quot;https://github.com/phpList/rest-api/blob/master/.github/CONTRIBUTING.md&quot;&gt;contributor guidelines&lt;/a&gt; on GitHub to get started!&lt;/p&gt;
</description>
        <pubDate>Thu, 20 Sep 2018 12:20:23 +0000</pubDate>
        <link>https://xheni.me/2018/phpList-Rest-Api-Security-Review/</link>
        <guid isPermaLink="true">https://xheni.me/2018/phpList-Rest-Api-Security-Review/</guid>
        
        <category>security</category>
        
        <category>phpList</category>
        
        
        <category>security</category>
        
        <category>phpList</category>
        
      </item>
    
      <item>
        <title>DOKU.TECH and the young spirit of Prishtina</title>
        <description>&lt;p&gt;DOKU.TECH is an annual conference in Kosova and one of the leading tech events in the Balkans that is devoted to idea sharing, igniting discussions, interactive workshops, DIY sessions, fun-filled days and musical evenings. During the past four editions, DOKU.TECH has welcomed over 5,000 attendees who came from the Balkans, Europe, and United States.
This year’s DOKU.TECH motto was: “One person’s craziness, is another one’s reality.”&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/dokutech2018.jpg&quot; alt=&quot;dokutech&quot; title=&quot;DOKU.TECH&quot; /&gt;
 &lt;em&gt;Official DOKU.TECH poster&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;DOKU.TECH in collaboration with Open Labs offered 15 participants the opportunity to take part at DOKU.TECH with cover travel and accommodation.
I was very excited about going there, because I had never been in Prishtina before (Shame on me). The trip from Tirana to Prishtina was nice, not only because I read 100 pages of “A pragmatic programmer” book, but also because of stunning views of beautiful mountains, rivers and lakes and of course funny people in the bus.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/kukes-albania.jpg&quot; alt=&quot;dokutech&quot; title=&quot;Kukes Albania&quot; /&gt;
 &lt;em&gt;Stunnning view in Kukes, Albania&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/open-labs-girls.jpg&quot; alt=&quot;open labs girls at dokutech&quot; title=&quot;Open Labs Girls at DOKU.TECH&quot; /&gt;
 &lt;em&gt;Open Labs Girls at DOKU.TECH&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The conference itself was good, some of the presentations were very interesting and the main hall was always full of people interested in Tech. Also, young people outside sitting and chilling out with their friends, playing games etc.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/dokutech.jpg&quot; alt=&quot;dokutech&quot; title=&quot;DOKU.TECH&quot; /&gt;
 &lt;em&gt;One of the interesting talks at DOKU.TECH&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I had the chance to visit Prishtina Hackerspace. Do you that they even produce their own beer? I was very impressed by the nerdy space, artistically nice rooms, hacker tools and “vishnjet”( something like wild cherries).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/prishtina hackerspace.jpg&quot; alt=&quot;prishtina hackerspace&quot; /&gt;
&lt;img src=&quot;/images/prishtina-hackerspace-beer.jpg&quot; alt=&quot;prishtina&quot; /&gt;
&lt;img src=&quot;/images/prishtina-hackerspace.jpg&quot; alt=&quot;prishtina&quot; /&gt;
 &lt;em&gt;Prishtina Hackerspace&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I have to say though that it lacks diversity a bit, but it is something that it can be improved in the future.
The capital city of Kosovo was smaller than I expected and a bit chaotic urban-wise, but it’s a city with a positive vibe, friendly and warm people with young spirit.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/prishtina view.jpg&quot; alt=&quot;prishtina&quot; title=&quot;Prishtina&quot; /&gt;
 &lt;em&gt;The view from Cathedral of Saint Mother Teresa, Pristina&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It has a lively night life, a lovely boulevard and people who like to drink beer. All in all, I had a pleasant experience and will visit it again.&lt;/p&gt;
</description>
        <pubDate>Thu, 28 Jun 2018 21:20:23 +0000</pubDate>
        <link>https://xheni.me/2018/dokutech-prishtina/</link>
        <guid isPermaLink="true">https://xheni.me/2018/dokutech-prishtina/</guid>
        
        <category>conference</category>
        
        <category>tech</category>
        
        <category>hackerspace</category>
        
        
        <category>conference</category>
        
      </item>
    
      <item>
        <title>Starting my journey as a Pragmatic Programmer</title>
        <description>&lt;p&gt;I recently started reading The Pragmatic Programmer: From Journeyman to Master, by Andrew Hunt and David Thomas, which was published in 1999. The book is well organized in short and self-contained chapters. Each chapter has tips that offer advice on several subjects such as  testing, prototyping, debugging, how to communicate effectively, exception handling, best practices and challenges.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/pragmatic.png&quot; alt=&quot;pragmatic&quot; title=&quot;the pragmatic programmer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This book is highly recommended and it’s amazing to see how a  software development book could remain influential and a-must-read for this long(two decades).
I have read only two chapters until now and the reason why I am writing this blog post is that I find it very useful and want to memorise as much as I can by writing and sharing some tips. I intend to do so in every two weeks. I like to challenge myself sometimes :wink: .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a Pragmatic Programmer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They say it’s a style, an attitude, and a philosophy of approaching problems and their solutions. They think beyond the immediate problem, always trying to place it in its larger context and to be aware of the bigger picture. After all, without this bigger picture, how can a programmer be pragmatic? How can they make intelligent compromises and smart decisions?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Are you a pragmatic programmer?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are some characteristics that make you a pragmatic programmer according to the authors:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;strong&gt;Early adopter/ fast adapter.&lt;/strong&gt;
When you have an instinct for techniques and technologies and you also like to try things out.
When you grasp new things quickly and integrate it with the rest of your knowledge.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Inquisitive.&lt;/strong&gt;
When you always tend to ask questions.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Critical thinker.&lt;/strong&gt;
When you rarely take things as given and you always smell a challenge.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Realistic.&lt;/strong&gt;
When you try to understand the underlying nature of each problem you face.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Jack of all trades.&lt;/strong&gt;
When you try to be familiar with a broad range of technologies and you are able to move to new areas and challenges.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;First tips&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip #1  Care about your craft&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;-There is no point in developing software unless you care about it doing it well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip #2  Think about your work&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Think about what you’re doing while you’re doing it, Constantly be thinking, critiquing your work in real time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip #3  Provide options, don’t make lame excuses&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t say “The Cat ate my Source Code”, but take responsibility for everything you do. Don’t say it cannot be done, but explain what it can be done to salvage the situation. Also don’t be afraid to ask or that you need help.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cat-source-code.jpg&quot; alt=&quot;cat&quot; title=&quot;the cat ate my source code&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip #4 Don’t live with broken windows&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don’t leave “broken windows” (aka bad design, poor code or wrong decisions) unrepaired.&lt;/p&gt;
</description>
        <pubDate>Mon, 28 May 2018 15:20:23 +0000</pubDate>
        <link>https://xheni.me/2018/the-pragmatic-programmer/</link>
        <guid isPermaLink="true">https://xheni.me/2018/the-pragmatic-programmer/</guid>
        
        <category>books</category>
        
        <category>programmer</category>
        
        
        <category>books</category>
        
      </item>
    
      <item>
        <title>Ready for Nextcloud hackweek</title>
        <description>&lt;p&gt;After attending the &lt;a href=&quot;https://nextcloud.com/blog/significant-growth-at-nextcloud-conference-brought-150-customers-colleagues-and-friends-together/&quot;&gt;Nextcloud Conference 2017&lt;/a&gt;  and helping out at the Fosdem 2018 Nextcloud booth,
 I look forward to joining the other Nextclouders again, this time for a hackweek. I’m always up for some hacking.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/nextcloud-chocolate.jpg&quot; alt=&quot;nextcloud choco&quot; /&gt;
 &lt;em&gt;Fosdem 2018&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nextcloud contributors from all over the world will gather in Stuttgart for a hackweek
from the 9th of April to the 13th of April.
During Nextcloud hackweeks, nextclouders focus on coding: going through issues,
discussing and fixing them, and so on.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/jonatoni&quot;&gt;Jona Azizaj&lt;/a&gt; and I were Rails Girls Summer of Code students working on Nextcloud during the summer 2017. RGSoC is a dedicated scholarship program that aims to foster diversity in Open Source since 2013. This scholarship offered us a great opportunity to shape and develop our programming skills more.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/codeaholics_nextcloud_conference.jpg&quot; alt=&quot;image&quot; /&gt;
&lt;em&gt;Team Codeaholics at Nextcloud Conference. (Photo: Christoph Wurst, Creative Commons Attribution-Share Alike 4.0 International.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nextcloud will be one of the &lt;a href=&quot;https://teams.railsgirlssummerofcode.org/projects/200-nextcloud&quot;&gt;RGSoC projects&lt;/a&gt;
again this year and I am delighted to see there are so many applications submitted to this project. I’m looking forward to the Hackweek, especially because I will meet Jessica and Arati, the Rails Girls Summer of Code 2018 students, and I will share my experience from last year with them, but also work together to fix some issues.
I’m planning to contribute again to &lt;a href=&quot;https://github.com/nextcloud/contacts&quot;&gt;Contacts App&lt;/a&gt; as I know it better
than the other applications, &lt;a href=&quot;https://github.com/nextcloud/gallery&quot;&gt;Gallery App&lt;/a&gt; because it has some good starter
issues and I would like to challenge myself a bit with also working
on the &lt;a href=&quot;https://github.com/nextcloud/fulltextsearch&quot;&gt;Full-Text Search&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;#HappyHacking :blush:&lt;/p&gt;
</description>
        <pubDate>Wed, 04 Apr 2018 20:20:23 +0000</pubDate>
        <link>https://xheni.me/2018/Nextcloud-hackweek/</link>
        <guid isPermaLink="true">https://xheni.me/2018/Nextcloud-hackweek/</guid>
        
        <category>opensource</category>
        
        <category>nextcloud</category>
        
        <category>rgsoc</category>
        
        <category>hackweek</category>
        
        
        <category>opensource</category>
        
        <category>nextcloud</category>
        
      </item>
    
      <item>
        <title>Learning advanced PHP with phpList and Treehouse</title>
        <description>&lt;p&gt;The transition from being a student to the world of real work can be quite challenging. But if you are just starting out in the tech industry, combining online learning with contributing to Open Source allows you to develop your skills and gain experience in collaborative software development and management. I am a student and Open Source enthusiast who has contributed to several projects in recent years. During the last two months, I have combined online classrooms and workshops with an internship at phpList to develop my skills and practices. This has been my journey.&lt;/p&gt;

&lt;h2 id=&quot;enterprise-skills-with-online-learning&quot;&gt;&lt;strong&gt;Enterprise skills with online learning&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Two months ago my most daunting question was which training platform to use to sharpen my PHP skills. It needed to fit my skill level and learning style. There is no single “best” course that fits everyone’s needs; we needed to find a platform which met the criteria. I was looking to extend my existing programming skills with newer and more sophisticated PHP systems and techniques. The courses needed to suit my &lt;strong&gt;intermediate level&lt;/strong&gt; and include coding exercises, as I like to learn ‘by doing’. While I found many PHP courses for beginners, intermediate and advanced courses were very difficult to find. &lt;a href=&quot;https://teamtreehouse.com/library/topic:php&quot;&gt;Team Treehouse&lt;/a&gt; was the only offering that convinced me because it covered more advanced topics such as &lt;strong&gt;Object Oriented&lt;/strong&gt; PHP and &lt;strong&gt;testing frameworks&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;how-treehouse-works&quot;&gt;&lt;strong&gt;How Treehouse works&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Treehouse has a library which is a complete catalog of all the content that they offer. You can browse by &lt;a href=&quot;https://teamtreehouse.com/library/type:workshop&quot;&gt;type&lt;/a&gt;, topic or &lt;a href=&quot;https://teamtreehouse.com/library/sort:difficulty&quot;&gt;difficulty&lt;/a&gt;. Furthermore, there are different &lt;strong&gt;&lt;a href=&quot;https://teamtreehouse.com/tracks/objectoriented-php-2&quot;&gt;tracks&lt;/a&gt;&lt;/strong&gt; to choose from. Each track is a selection of courses with a common theme, like a certain programming language or a aspect of web development. The track acts as a roadmap so you know what to learn next, those are more of a guidance though and you are not forced to pick the courses in a specific order, allowing for a modular mix of topics. A course in Team Treehouse usually consists of &lt;strong&gt;video lectures&lt;/strong&gt;, &lt;strong&gt;project code&lt;/strong&gt;, &lt;strong&gt;code challenges&lt;/strong&gt; and &lt;strong&gt;quizzes&lt;/strong&gt;. The combination of these methods of delivering content is a good means for ensuring that students will retain the knowledge of each course. I absolutely like the Treehouse’s approach to their videos. Most of them are are very short with good pacing.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/treehouse1.jpg&quot; alt=&quot;php coding demonstration&quot; /&gt;
&lt;em&gt;PHP coding demonstration in a Treehouse video lecture&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Each individual lesson within a course has a video lecture, project code to experiment with, and a “&lt;strong&gt;workspace&lt;/strong&gt;” where you can make changes to the project code and see the results right away. If you have an active pro account, you can &lt;strong&gt;download course files&lt;/strong&gt; such as videos and video transcript for offline learning. Over the last two months, I completed 9 Treehouse courses in all, each chosen for their real-world usefulness and relevance to phpList &lt;a href=&quot;https://github.com/phplist/phplist3&quot;&gt;3&lt;/a&gt; and &lt;a href=&quot;https://github.com/phpList/phplist4-core&quot;&gt;4&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;PHP Basics&lt;/li&gt;
  &lt;li&gt;Object-oriented PHP basics&lt;/li&gt;
  &lt;li&gt;Extending object-oriented PHP&lt;/li&gt;
  &lt;li&gt;PHP standards and best practices&lt;/li&gt;
  &lt;li&gt;PHP databases with PDO&lt;/li&gt;
  &lt;li&gt;PHP standards and best practices&lt;/li&gt;
  &lt;li&gt;PHP user authentication&lt;/li&gt;
  &lt;li&gt;Integrating PHP with databases&lt;/li&gt;
  &lt;li&gt;PHP testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also attended the following &lt;strong&gt;workshops&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dependency Management with Composer&lt;/li&gt;
  &lt;li&gt;Basic Error Handling with PHP&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;teachers-notes&quot;&gt;&lt;strong&gt;Teacher’s Notes&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;The Teacher’s Notes for each video appear on the left-most tab below the video player. There you can find notes such as a summary of the lesson and useful links provided by the teacher. In my opinion, the links in the teacher’s notes worth the time to read because all knowledge that can improve your understanding is worth your time to read.&lt;/p&gt;

&lt;h4 id=&quot;quizzes-and-code-challenges&quot;&gt;&lt;strong&gt;Quizzes and Code Challenges&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/challenges.jpg&quot; alt=&quot;A code challenge question on Treehouse&quot; /&gt;
&lt;em&gt;A code challenge question on Treehouse&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The quizzes require a certain number of correct answers to pass. The only thing that I don’t like about them is that I’m not told why my answer is wrong, especially for the fill in the blank questions. The code challenges require writing some real code to test your knowledge and skill. There are two components involved in the Code Challenge. One component is the editor interface that you interact with and this is the only component you really see and touch. The other is the component that actually evaluates the code you write to see if it is correct. The code challenges and the quizzes help you to solidify your understanding. If you pay attention to the videos and write down concepts, it makes passing the code challenges and quizzes much easier.&lt;/p&gt;

&lt;h4 id=&quot;workspaces&quot;&gt;&lt;strong&gt;Workspaces&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;Workspace is a fully browser-based code editor. You can use it to work alongside a Treehouse course. Each Workspace has a total storage limit of 50 MB. Currently, students are allowed to have up to 100 Workspaces created at a time.&lt;/p&gt;

&lt;h4 id=&quot;motivational-tracking-tools&quot;&gt;&lt;strong&gt;Motivational tracking tools&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;&lt;img src=&quot;/images/badge.jpg&quot; alt=&quot;I earned +30 points for unlocking this badge&quot; /&gt;
&lt;em&gt;I earned +30 points for unlocking this badge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Team Treehouse really knows how to motivate students to complete their courses. First of all, there are &lt;strong&gt;badges&lt;/strong&gt;. Everybody loves badges. Students get badges for reaching certain goals. There are always new badges being added to accompany new lessons and new courses. Another incentive tool is the &lt;strong&gt;motivational email&lt;/strong&gt; you get from the teacher when you complete the course. Next is the &lt;strong&gt;points system&lt;/strong&gt;. You get points in each area of Team Treehouse by completing courses and lessons. The more lessons you complete in, for example, PHP, the more points in the PHP area you get. Team Treehouse tracks both your points in each area and your total points. You also get points by posting on the Team Treehouse forum. Furthermore, it &lt;strong&gt;tracks your progress&lt;/strong&gt; in percentage system. You can see what percent of the total amount of content in a given track you have completed. This is a really good measure of your progress, and it feels great to see how far you have come. These incentive methods are very good for keeping the student focused.&lt;/p&gt;

&lt;h4 id=&quot;treehouse-community&quot;&gt;&lt;strong&gt;Treehouse community&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;Treehouse community is the best place to talk with your fellow students, asking questions, getting your questions answered, answering your fellow students’ questions and making it easier to make connections with like-minded folks going through the same journey as you are.  &lt;/p&gt;

&lt;h4 id=&quot;cons&quot;&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;The course quality varies from teacher to teacher and the PHP courses are taught by different teachers. Some teachers may be skilled in their profession, but don’t manage to communicate well with students. Also, some of them did not offer coding challenges, but only quizzes. Furthermore, not all teachers sent out motivational emails at the end of the course which would have made for a nicer learning experience.&lt;/p&gt;

&lt;h2 id=&quot;getting-familiar-with-phplist&quot;&gt;&lt;strong&gt;Getting familiar with phpList&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;It wasn’t the first time I took an online course, but it’s the first time I’ve been really enjoying it. But during the training time I felt like the coding exercises were not enough for me, so I asked my phpList mentor to assign me some real-world bugs to fix. The phpList source code was easy to find on on GitHub and I registered an account for myself on the project’s Mantis bug tracker. I started off with issues tagged as ‘quick-fix’ – these ones were well described and easy to fix. Soon I was working on the source code and submitting my first pull requests. This way I put my Treehouse knowledge to immediate use and my motivation got quite a boost once I saw my first &lt;a href=&quot;https://github.com/phpList/phplist3/pulls?q=is%3Apr+author%3Axh3n1+is%3Aclosed&quot;&gt;PRs&lt;/a&gt; being merged.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer: This article was originally published on phpList blog.&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 02 Feb 2018 10:04:23 +0000</pubDate>
        <link>https://xheni.me/2018/Learning-advanced-php-with-phplist-and-treehouse/</link>
        <guid isPermaLink="true">https://xheni.me/2018/Learning-advanced-php-with-phplist-and-treehouse/</guid>
        
        <category>opensource</category>
        
        <category>course</category>
        
        <category>phpList</category>
        
        
        <category>opensource</category>
        
        <category>phplist</category>
        
      </item>
    
      <item>
        <title>34c3 - Endlich, normale Leute...</title>
        <description>&lt;p&gt;The Chaos Communication Congress is an annual conference organized by the Chaos Computer Club. The congress features a variety of lectures and workshops on technical and political issues related to Security, Cryptography, Privacy and online Freedom of Speech. The event takes place regularly at the end of the year since 1984, with the current date and duration (December 27–30) established in 2005. It is considered one of the largest events of this kind, alongside the DEF CON in Las Vegas.
&lt;em&gt;This is what I read on Wikipedia before I decided to go there.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Chaos Communication Congress has been running for 34 years, and this was the first year that Congress was hosted in Leipzig.
Around 15,000 people took part in this remarkable event. No doubt, it’s the biggest hacker conference in Europe.
Apart from the official conference program, the CCC also offers space for assemblies, lightning talks, developer meetings, art installations, workshops, and special places for kids to play.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;tuwat!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/logo-tuwat.png&quot; alt=&quot;tuwat&quot; title=&quot;tuwat&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This year’s motto, “tuwat!”, which is a slang-dialect for “do something!”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My first Congress&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A security professional told me how cool this conference is and convinced me to go there. But I went there with Jona, my RGSoC teammate. We arrived in Berlin one night before the CCC, and we almost missed our flixbus to Leipzig, because I wanted to see the Brandenburger Tor. What a night !!&lt;/p&gt;

&lt;p&gt;CCC is more than a ‘hacker’ conference. It’s a community get-together and the community consists of all creatures of the web who share the common vision for an open and free technological society: hackers, programmers,hactivists, artists, philosophers, engineers, trollers, robots, aliens etc.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/leipzig.jpg&quot; alt=&quot;pool&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I have never been in other Congress Centers, but The Congress Center Leipzig (CCL) was huge and stunning.
 There was one huge hall (Hall 2), which was filled with all the assemblies and two halls filled with the big lecture halls.
The coolest hall to hang out was the one with the  Assemblies where hackerspaces and interest groups get together and bring their computers and coolest toys, doing what they do best —hacking.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/rockets.jpg&quot; alt=&quot;rocket&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;There was also this “pool area” which was very outstanding and they played very good music. Nerds know how to party ;).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-pool.jpeg&quot; alt=&quot;pool&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;The big glass hall allowed daylight consumption and made it obvious when that was missing.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/lights.jpg&quot; alt=&quot;pool&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I was very amazed, especially at night, by all those neon lights, art decorations, nerdy atmosphere.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-rocket.jpg&quot; alt=&quot;rocket&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I obviously saw some talks about security, and even about open source satellites.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-talk.jpg&quot; alt=&quot;talk&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I visited assemblies, played some games, listened to robotic music, met some old friends and of course grabbed a lot of stickers. Totally enjoyable experience!
I spend most of the time at Nextcloud assembly, together with other Nextclouders.
  By the way, on the third day, I was wearing the Nextcloud T-shirt and guess what? People came to me and asked about Nextcloud or just said: “I love Nextcloud, awesome software”.
   The real soul of the Congress is people getting together, making something crazy and temporary, learning new things, and simply having fun.
  I have seen strange things.
  What really got my attention was an impressive 3D zoetrope.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-robot.jpg&quot; alt=&quot;robot&quot; title=&quot;34c3&quot; /&gt;
   Also the pneumatic robot-dog-horse-with-gasmask, which is driven by an Arduino.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-face.jpg&quot; alt=&quot;face&quot; title=&quot;34c3&quot; /&gt;
   This one scared me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Make Mate, not War&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do you know that Mate is geeks’ favourite drink?&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/floramate.jpg&quot; alt=&quot;mate&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Back in the “Real World”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that I have been to a Chaos Communication Congress, I know that feeling, the strange realization after it’s all over and that you’re back in the “real world”. It’s somehow alienating in comparison to being surrounded by computer geeks, artists, hackers, coders and other like-minded individuals over the four days of the Congress. There was this hand-written poster “Endlich, normale Leute” — “At last, normal people” — which is irony piled on irony but the sentiment is still right for certain strange values of “normal”. :rocket:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Random photos taken with my Samsung Galaxy Note 3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/alien.jpg&quot; alt=&quot;alien&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-ihavenoidea.jpg&quot; alt=&quot;ihavenoidea&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-unix.jpg&quot; alt=&quot;unix&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-more.jpg&quot; alt=&quot;more&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-chaos.jpg&quot; alt=&quot;chaos&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/events/34c3-chaos2017.jpg&quot; alt=&quot;chaos&quot; title=&quot;34c3&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Sun, 31 Dec 2017 15:04:23 +0000</pubDate>
        <link>https://xheni.me/2017/34c3-chaos-communication-congress/</link>
        <guid isPermaLink="true">https://xheni.me/2017/34c3-chaos-communication-congress/</guid>
        
        <category>34c3</category>
        
        <category>ccc</category>
        
        <category>conference</category>
        
        
        <category>conference</category>
        
      </item>
    
      <item>
        <title> Git Workshop at Open Labs </title>
        <description>&lt;p&gt;Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. It is the most popular VCS used by thousand developers.&lt;/p&gt;

&lt;p&gt;Before the  Rails Girls Summer of Code,  I barely had any experience with Git and I knew only some concepts. 
Thanks to the Git documentation and the very friendly community over at Nextcloud, I learned many new Git commands.:).&lt;/p&gt;

&lt;p&gt;I am a member at Open Labs Hackerspace and I have noticed that many members of our community are interested in learning Git. Thus, I decided to organize a workshop about Git. Why not? Knowledge sharing is very important to me  and it is the main reason why I advocate Open Source. It’s not tham I am a Git expert, not at all, but still I think that If know something that others don’t, share it with them.
I talked with Sidorela, another open source enthusiast member of Open Labs about it and together we decided to host the first Git workshop at Open Labs. We proposed the idea of organizing a workshop at Open Labs Forum and as I expected they were interested in learning some commands.
The workshop went very good. We talked a bit about Git history and Git design in general and then we explained some concepts to them. We practiced and run the most useful git commands.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/mergeconflict.jpg&quot; alt=&quot;merge&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A link of the &lt;a href=&quot;https://github.com/xh3n1/Personal/blob/master/presentation/introductiontoGit.pdf&quot;&gt;presentation&lt;/a&gt; can be found on my Personal GitHub repo. 
The feedback that they gave us after the event was really good, and it encourages me to continue with Git workshops and not only.&lt;/p&gt;
</description>
        <pubDate>Wed, 08 Nov 2017 10:04:23 +0000</pubDate>
        <link>https://xheni.me/2017/Git-Workshop-At-OpenLabs/</link>
        <guid isPermaLink="true">https://xheni.me/2017/Git-Workshop-At-OpenLabs/</guid>
        
        <category>opensource</category>
        
        <category>openlabs</category>
        
        
        <category>opensource</category>
        
      </item>
    
      <item>
        <title>LibOCon and libre Ladies...</title>
        <description>&lt;p&gt;LibOCon is the annual gathering of the LibreOffice community. At LibOCon, LibreOffice users gather to network and meet key LibreOffice developers, designers, localizers, documenters, supporters and marketers, and to learn about the latest in LibreOffice development.
I have been a LibreOffice user for many years and this year I joined the &lt;a href=&quot;https://conference.libreoffice.org/&quot;&gt;LibreOffice Conference&lt;/a&gt; from 11-13 October in Rome, Italy.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/icontributed.jpg&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;
&lt;em&gt;Suela and Xheni during their presentation. Credits: Redon Skikuli CC-BY-SA 4.0&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;LibOCon 2017 was hosted inside historical buildings, the property of the City of Rome. 
&lt;a href=&quot;https://twitter.com/Suela_Palushi&quot;&gt;Suela&lt;/a&gt; and I talked  about “How to retain new contributors?”,
“Our experience as newcomers” and “Contributions to open source” - survey. Here are some of the results of the survey:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/libocon.png&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/libocon2.png&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/libocon6.png&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/libocon5.png&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/libocon7.png&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;&lt;/p&gt;

&lt;p&gt;We had some interesting answers when  we asked them “How do community activities affect your experience as a contributor?”&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;“It makes me feel that I am doing the things right. Each time I generate a contribution, I feel
happiness because I am spending time of my life for the benefit of projects that will useful for other people around the world while I sharing this experience with other human beings”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Gain experience and new friends ”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;“In 1:1/groups brainstorming is much faster and enjoyable”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Get to know more people in the same field of interests as mine”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Community gives you outside connections, adds purpose and enjoyment to the work we’re all doing”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;During LibOCon and HackFest I had the opportunity to meet other open source ladies who contribute to LibreOffice and we took this picture &amp;lt;3. 
&lt;img src=&quot;/images/librecon.jpg&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;
&lt;em&gt;LibreLadies CC-BY-SA 4.0&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I had a great time in Rome. Beautiful city and good friends.&lt;/p&gt;

&lt;p&gt;Ps: The next LibOCon will be held in Tirana. See you there!
&lt;img src=&quot;/images/romanforum.jpg&quot; alt=&quot;liboCon&quot; title=&quot;LibOCOn CC-BY-SA 4.0&quot; /&gt;
&lt;em&gt;Roman Forum CC-BY-SA 4.0&lt;/em&gt;&lt;/p&gt;

</description>
        <pubDate>Thu, 12 Oct 2017 15:04:23 +0000</pubDate>
        <link>https://xheni.me/2017/liboconandlibreladies/</link>
        <guid isPermaLink="true">https://xheni.me/2017/liboconandlibreladies/</guid>
        
        <category>opensource</category>
        
        <category>girlsintech</category>
        
        <category>conference</category>
        
        
        <category>opensource</category>
        
      </item>
    
      <item>
        <title>CryptoParty in Tirana</title>
        <description>&lt;p&gt;Privacy is the space in which ideas are developed, to retreat into whenever you want. This space is not only physical but digital as well.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a CryptoParty?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CryptoParties are free and open for everyone, but especially ​those without prior knowledge, who haven’t yet attended one.
CryptoParty is a decentralized movement with constantly happening activities in the entire world. The goal of this movement is sharing as much knowledge to as many individuals as possible on how to protect ourselves in the digital world. This worldwide effort introduces the basis of cryptography both in theory and practice, such as encrypted communication, prevention of espionage when navigating on the internet, anonymity on Tor netwyork, cryptography with public key, storage encryption, Virtual Private Networks (VPN) etc. The project consists of a series of workshops free and open for everyone .&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first CryptoParty in Albania&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To join this worldwide effort and to inform about the dangers of the digital world, the importance of online privacy and exchange of practical knowledge to protect our privacy, Open Labs with the support of Arjen Kamphuis and Ardian Haxha have organized CryptoParty Tirana.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cryptoparty1.jpg&quot; alt=&quot;CryptoParty&quot; title=&quot;Cryptoparty&quot; /&gt;
&lt;em&gt;CryptoParty Albania. Credits: CC-BY-4.0 Andis Rado&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The CryptoParty  took place at Innovation Hub Tirana  and  gathered  many technology enthusiasts , developers, students, academics, journalists  and people who are concerned about privacy and information security.
It was the first CryptoParty in Albania and  it  was really well-organized, with multiple talks and  workshops like:  private browsing, file-encryption, email-encryption, debian installation etc.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/cryptoparty2.jpg&quot; alt=&quot;CryptoParty&quot; title=&quot;Cryptoparty&quot; /&gt;
&lt;em&gt;Data encryption workshop. Credits: CC-BY-4.0 Andis Rado&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;However, there were people who come down on the side of the government: “I have nothing to hide”…
The nothing to hide argument states that government surveillance programs do not threaten privacy unless they uncover illegal activities, and that if they do uncover illegal activities, the person committing these activities does not have the right to keep them private. Hence, a person who favors this argument may state “I’ve got nothing to hide” and therefore does not express opposition to government surveillance.An individual using this argument may say that a person should not have worries about government or surveillance if he/she has “nothing to hide.”-Wikipedia.&lt;/p&gt;

&lt;p&gt;My point is:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;“Arguing that you don’t care about the right to privacy because you have nothing to hide, is no different than saying you don’t care about free speech because you have nothing to say.” – E. Snowden.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Emilio Mordini, philosopher and psychoanalyst, argued that the “nothing to hide” argument is inherently paradoxical. People do not need to have “something to hide” in order to hide “something”. What is relevant is not what is hidden, rather the experience that there is an intimate area, which could be hidden, whose access could be restricted. Psychologically speaking, we become individuals through the discovery that we could hide something to others.&lt;/p&gt;
</description>
        <pubDate>Sun, 01 Oct 2017 15:04:23 +0000</pubDate>
        <link>https://xheni.me/2017/CryptoParty-in-Tirana/</link>
        <guid isPermaLink="true">https://xheni.me/2017/CryptoParty-in-Tirana/</guid>
        
        <category>cryptoparty</category>
        
        <category>privacy</category>
        
        
        <category>crypto</category>
        
      </item>
    
  </channel>
</rss>
