<table><tr><td style="">dvratil requested changes to this revision.<br />dvratil added a comment.<br />This revision now requires changes to proceed.
</td><a style="text-decoration: none; padding: 4px 8px; margin: 0 8px 8px; float: right; color: #464C5C; font-weight: bold; border-radius: 3px; background-color: #F7F7F9; background-image: linear-gradient(to bottom,#fff,#f1f0f1); display: inline-block; border: 1px solid rgba(71,87,120,.2);" href="https://phabricator.kde.org/D9885" rel="noreferrer">View Revision</a></tr></table><br /><div><div><p>Generally looks good. I tested it locally and it works nicely. Thanks a lot for the patch! The new user-facing strings are a bit unfortunate since that means we can't land this in Applications/17.12 branch, but I'd like to get this to users before 18.04. Probably we will have to ship the <tt style="background: #ebebeb; font-size: 13px;">QStringLiteral</tt> version to stable branch and make it only translatable in master.</p></div></div><br /><div><strong>INLINE COMMENTS</strong><div><div style="margin: 6px 0 12px 0;"><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45440" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget.cpp:112</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">d</span><span style="color: #aa2211">-></span><span class="n">connection</span><span style="color: #aa2211">-></span><span class="n">setParent</span><span class="p">(</span><span style="color: #aa4000">this</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">connect</span><span class="p">(</span><span class="n">d</span><span style="color: #aa2211">-></span><span class="n">connection</span><span class="p">,</span> <span style="color: #aa2211">&</span><span class="n">QTcpSocket</span><span style="color: #aa2211">::</span><span class="n">readyRead</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span style="color: #aa2211">&</span><span class="n">AuthWidgetPrivate</span><span style="color: #aa2211">::</span><span class="n">socketReady</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">d</span><span style="color: #aa2211">-></span><span class="n">server</span><span style="color: #aa2211">-></span><span class="n">close</span><span class="p">();</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">You may want to handle the <tt style="background: #ebebeb; font-size: 13px;">QTcpSocket::error()</tt> signal in case there's some problem, in which case <tt style="background: #ebebeb; font-size: 13px;">readyRead</tt> would not be emitted, so that the OAuth flow does not get stuck but shows an error instead.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45436" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget.cpp:114</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">d</span><span style="color: #aa2211">-></span><span class="n">server</span><span style="color: #aa2211">-></span><span class="n">close</span><span class="p">();</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span style="color: #aa4000">delete</span> <span class="n">d</span><span style="color: #aa2211">-></span><span class="n">server</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span class="p">});</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">You may want to use <tt style="background: #ebebeb; font-size: 13px;">deleteLater()</tt> here instead of <tt style="background: #ebebeb; font-size: 13px;">delete</tt> - it's not ideal to delete the emitter from its signal handler, since when code execution returns back to the emitter, it might try to access its <tt style="background: #ebebeb; font-size: 13px;">this</tt> pointer which would be deleted at this point.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45430" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">davidk</span> wrote in <span style="color: #4b4d51; font-weight: bold;">authwidget_p.cpp:259</span></div>
<div style="margin: 8px 0; padding: 0 12px; color: #74777D;"><p style="padding: 0; margin: 8px;">I don't think it will crash. If line.size() is unequal 3, the remaining checks will be skipped (lazy evaluation). Those will only be checked, if line.size() == 3.<br />
Or did I missunderstand your comment?</p></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">You are correct, I think Laurent just didn't notice the initial size check.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45433" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget_p.cpp:259</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">    <span class="bright"></span><span style="color: #aa4000"><span class="bright">if</span></span><span class="bright"> </span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span style="color: #aa2211"><span class="bright">!</span></span><span class="bright"></span><span class="n"><span class="bright">isGoogleHost</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span class="n"><span class="bright">url</span></span><span class="bright"></span><span class="p"><span class="bright">))</span></span><span class="bright"> </span><span class="p"><span class="bright">{</span></span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span class="bright"></span><span style="color: #aa4000"><span class="bright">const</span></span><span class="bright"> </span><span class="n"><span class="bright">QStringList</span></span><span class="bright"> </span><span class="n"><span class="bright">line</span></span><span class="bright"> </span><span style="color: #aa2211"><span class="bright">=</span></span><span class="bright"> </span><span class="n"><span class="bright">QString</span></span><span class="bright"></span><span style="color: #aa2211"><span class="bright">::</span></span><span class="bright"></span><span class="n"><span class="bright">fromLatin1</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span class="n"><span class="bright">data</span></span><span class="bright"></span><span class="p"><span class="bright">).</span></span><span class="bright"></span><span class="n"><span class="bright">split</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span class="n"><span class="bright">QLatin1Char</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span style="color: #766510"><span class="bright">' '</span></span><span class="bright"></span><span class="p"><span class="bright">));</span></span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span style="color: #aa2211">!=</span> <span style="color: #601200">3</span> <span style="color: #aa2211">||</span> <span class="n">line</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span style="color: #601200">0</span><span class="p">)</span> <span style="color: #aa2211">!=</span> <span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"GET"</span><span class="p">)</span> <span style="color: #aa2211">||</span> <span style="color: #aa2211">!</span><span class="n">line</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span style="color: #601200">2</span><span class="p">).</span><span class="n">startsWith</span><span class="p">(</span><span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"HTTP/1.1"</span><span class="p">)))</span> <span class="p">{</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">You can use <tt style="background: #ebebeb; font-size: 13px;">QByteArray::split()</tt> and continue operating on <tt style="background: #ebebeb; font-size: 13px;">QByteArray</tt> below and only convert the value on <tt style="background: #ebebeb; font-size: 13px;">line.at(1)</tt> to <tt style="background: #ebebeb; font-size: 13px;">QString</tt> when building the <tt style="background: #ebebeb; font-size: 13px;">QUrl</tt></p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45434" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget_p.cpp:261</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">line</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span style="color: #aa2211">!=</span> <span style="color: #601200">3</span> <span style="color: #aa2211">||</span> <span class="n">line</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span style="color: #601200">0</span><span class="p">)</span> <span style="color: #aa2211">!=</span> <span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"GET"</span><span class="p">)</span> <span style="color: #aa2211">||</span> <span style="color: #aa2211">!</span><span class="n">line</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span style="color: #601200">2</span><span class="p">).</span><span class="n">startsWith</span><span class="p">(</span><span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"HTTP/1.1"</span><span class="p">)))</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">qCDebug</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"Token response invalid"</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">emitError</span><span class="p">(</span><span class="n">InvalidResponse</span><span class="p">,</span> <span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"Token response invalid"</span><span class="p">));</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Please add <tt style="background: #ebebeb; font-size: 13px;">qCDebug(KGAPIRaw)</tt> that logs the content of the received data for easier debugging in case there's an error.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45431" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget_p.cpp:262</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">qCDebug</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"Token response invalid"</span><span class="p">);</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="n">emitError</span><span class="p">(</span><span class="n">InvalidResponse</span><span class="p">,</span> <span class="n">QStringLiteral</span><span class="p">(</span><span style="color: #766510">"Token response invalid"</span><span class="p">));</span>
</div><div style="padding: 0 8px; margin: 0 4px; ">        <span style="color: #aa4000">return</span><span class="p">;</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Please use <tt style="background: #ebebeb; font-size: 13px;">tr()</tt> instead of <tt style="background: #ebebeb; font-size: 13px;">QStringLiteral</tt> here, this is a user-facing message so it needs to be localized.</p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45432" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget_p.cpp:277</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">            <span class="n">qC<span class="bright">Warnin</span>g</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span class="bright"></span><span style="color: #766510"><span class="bright">"Failed to parse</span> token from <span class="bright">URL, peaking into HTML..."</span></span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">            <span class="bright"></span><span class="n"><span class="bright">webview</span></span><span class="bright"></span><span style="color: #aa2211"><span class="bright">-></span></span><span class="bright"></span><span class="n"><span class="bright">page</span></span><span class="bright"></span><span class="p"><span class="bright">()</span></span><span class="bright"></span><span style="color: #aa2211"><span class="bright">-></span></span><span class="bright"></span><span class="n"><span class="bright">runJavaScript</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">        <span class="bright">        </span><span class="n"><span class="bright">QStringLiteral</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span style="color: #766510"><span class="bright">"document.getElementById(</span></span><span class="bright"></span><span style="color: #bb6622"><span class="bright">\"</span></span><span class="bright"></span><span style="color: #766510"><span class="bright">code</span></span><span class="bright"></span><span style="color: #bb6622"><span class="bright">\"</span></span><span class="bright"></span><span style="color: #766510"><span class="bright">).value;"</span></span><span class="bright"></span><span class="p"><span class="bright">),</span></span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                <span class="p">[</span><span style="color: #aa4000">this</span><span class="p">](</span><span style="color: #aa4000">const</span> <span class="n">QVariant</span> <span style="color: #aa2211">&</span><span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                    <span style="color: #aa4000">const</span> <span style="color: #aa4000">auto</span> <span class="n">token</span> <span style="color: #aa2211">=</span> <span class="n">result</span><span class="p">.</span><span class="n">toString</span><span class="p">();</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                    <span style="color: #aa4000">if</span> <span class="p">(</span><span class="n">token</span><span class="p">.</span><span class="n">isEmpty</span><span class="p">())</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                        <span class="n">qCWarning</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span style="color: #766510">"Peaked into HTML, but cound not find token :("</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                        <span class="n">webview</span><span style="color: #aa2211">-></span><span class="n">page</span><span class="p">()</span><span style="color: #aa2211">-></span><span class="n">toHtml</span><span class="p">([](</span><span style="color: #aa4000">const</span> <span class="n">QString</span> <span style="color: #aa2211">&</span><span class="n">html</span><span class="p">)</span> <span class="p">{</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                            <span class="n">qCDebug</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span style="color: #766510">"Parsing token page failed"</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                            <span class="n">qCDebug</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span class="n">html</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                        <span class="p">});</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(251, 175, 175, .7);">                        <span class="n">emitError</span><span class="p">(</span><span class="n">AuthError</span><span class="p">,</span> <span class="n">tr</span><span class="p">(</span><span style="color: #766510">"Parsing token page failed."</span><span class="p">));</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">            <span class="n">qC<span class="bright">Debu</span>g</span><span class="p">(</span><span class="n">KGAPIDebug</span><span class="p">)</span> <span style="color: #aa2211"><<</span> <span class="bright"></span><span class="n"><span class="bright">QStringLiteral</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span style="color: #766510"><span class="bright">"Could not extract</span> token from <span class="bright">HTTP answer"</span></span><span class="bright"></span><span class="p"><span class="bright">)</span>;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">            <span class="bright"></span><span class="n"><span class="bright">emitError</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span class="n"><span class="bright">InvalidResponse</span></span><span class="bright"></span><span class="p"><span class="bright">,</span></span><span class="bright"> </span><span class="n"><span class="bright">QStringLiteral</span></span><span class="bright"></span><span class="p"><span class="bright">(</span></span><span class="bright"></span><span style="color: #766510"><span class="bright">"Could not extract token from HTTP answer"</span></span><span class="bright"></span><span class="p"><span class="bright">));</span></span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">        <span class="bright"></span><span class="p"><span class="bright">}</span></span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;"><tt style="background: #ebebeb; font-size: 13px;">tr()</tt> instead of <tt style="background: #ebebeb; font-size: 13px;">QStringLiteral</tt></p></div></div><br /><div style="border: 1px solid #C7CCD9; border-radius: 3px;"><div style="padding: 0; background: #F7F7F7; border-color: #e3e4e8; border-style: solid; border-width: 0 0 1px 0; margin: 0;"><div style="color: #74777d; background: #eff2f4; padding: 6px 8px; overflow: hidden;"><a style="float: right; text-decoration: none;" href="https://phabricator.kde.org/D9885#inline-45438" rel="noreferrer">View Inline</a><span style="color: #4b4d51; font-weight: bold;">authwidget_p.h:67-69</span></div>
<div style="font: 11px/15px "Menlo", "Consolas", "Monaco", monospace; white-space: pre-wrap; clear: both; padding: 4px 0; margin: 0;"><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span class="n">QTcpServer</span> <span style="color: #aa2211">*</span><span class="n">server</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span style="color: #aa4000">int</span> <span class="n">serverPort</span><span class="p">;</span>
</div><div style="padding: 0 8px; margin: 0 4px; background: rgba(151, 234, 151, .6);">    <span class="n">QTcpSocket</span> <span style="color: #aa2211">*</span><span class="n">connection</span><span class="p">;</span>
</div></div></div>
<div style="margin: 8px 0; padding: 0 12px;"><p style="padding: 0; margin: 8px;">Initialize the new members here to default values</p></div></div></div></div></div><br /><div><strong>REPOSITORY</strong><div><div>R477 KGAPI Library</div></div></div><br /><div><strong>REVISION DETAIL</strong><div><a href="https://phabricator.kde.org/D9885" rel="noreferrer">https://phabricator.kde.org/D9885</a></div></div><br /><div><strong>To: </strong>davidk, mlaurent, dvratil, KDE PIM<br /><strong>Cc: </strong>dvasin, winterz, vkrause, mlaurent, knauss, dvratil<br /></div>