Merge lp:~mandel/ubuntuone-windows-installer/implement_sso_service_calls into lp:ubuntuone-windows-installer/beta
- implement_sso_service_calls
- Merge into beta
Proposed by
Manuel de la Peña
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Rick McBride | ||||||||
Approved revision: | 67 | ||||||||
Merged at revision: | 87 | ||||||||
Proposed branch: | lp:~mandel/ubuntuone-windows-installer/implement_sso_service_calls | ||||||||
Merge into: | lp:ubuntuone-windows-installer/beta | ||||||||
Prerequisite: | lp:~mandel/ubuntuone-windows-installer/update_wadl_generation | ||||||||
Diff against target: |
2650 lines (+1869/-267) 34 files modified
.bzrignore (+2/-0) install/UbuntuOne.wxs (+27/-0) lib/JsonNet/readme.txt (+52/-0) main.build (+1/-1) src/Canonical.Ubuntu.SSO.Tests/Canonical.Ubuntu.SSO.Tests.csproj (+4/-8) src/Canonical.Ubuntu.SSO.Tests/KeyringFixture.cs (+212/-212) src/Canonical.Ubuntu.SSO.Tests/Service/AuthenticationsFixture.cs (+46/-0) src/Canonical.Ubuntu.SSO.Tests/Service/CaptchasFixture.cs (+50/-0) src/Canonical.Ubuntu.SSO.Views/Canonical.Ubuntu.SSO.Views.csproj (+94/-0) src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml (+56/-0) src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml.cs (+52/-0) src/Canonical.Ubuntu.SSO.Views/Properties/AssemblyInfo.cs (+55/-0) src/Canonical.Ubuntu.SSO.Views/Properties/Resources.Designer.cs (+71/-0) src/Canonical.Ubuntu.SSO.Views/Properties/Resources.resx (+117/-0) src/Canonical.Ubuntu.SSO.Views/Properties/Settings.Designer.cs (+30/-0) src/Canonical.Ubuntu.SSO.Views/Properties/Settings.settings (+7/-0) src/Canonical.Ubuntu.SSO/Canonical.Ubuntu.SSO.csproj (+5/-0) src/Canonical.Ubuntu.SSO/DPAPIDataProtector.cs (+16/-10) src/Canonical.Ubuntu.SSO/IDataProtector.cs (+3/-3) src/Canonical.Ubuntu.SSO/Keyring.cs (+21/-7) src/Canonical.Ubuntu.SSO/OAuthBase.cs (+358/-0) src/Canonical.Ubuntu.SSO/RegistryKeyWrapper.cs (+1/-1) src/Canonical.Ubuntu.SSO/SSOCredentialsProvider.cs (+11/-2) src/Canonical.Ubuntu.SSO/Service/Authentications.cs (+2/-2) src/Canonical.Ubuntu.SSO/Service/AuthenticationsCustomized.cs (+235/-0) src/Canonical.Ubuntu.SSO/Service/CaptchasCustomized.cs (+190/-0) src/Canonical.Ubuntu.SSO/Service/Constants.cs (+30/-0) src/Canonical.Ubuntu.SSO/Service/ICustomize.cs (+2/-1) src/Canonical.UbuntuOne.Client/Canonical.UbuntuOne.Client.csproj (+16/-0) src/Canonical.UbuntuOne.Client/Notification/NotificationIconPresenter.cs (+85/-10) src/UbuntuOne.sln (+12/-0) src/u1sync/client.py (+1/-5) src/u1sync/main.py (+1/-2) src/u1sync/ubuntuone_optparse.py (+4/-3) |
||||||||
To merge this branch: | bzr merge lp:~mandel/ubuntuone-windows-installer/implement_sso_service_calls | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Rick McBride (community) | Approve | ||
John Lenton (community) | Approve | ||
Review via email:
|
Commit message
Description of the change
Added a very early implementation of Ubuntu SSO on windows so that the user does not have to put the oauth token on an env variable.
To post a comment you must log in.
Revision history for this message
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Rick McBride (rmcbride) : | # |
review:
Approve
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file '.bzrignore' |
2 | --- .bzrignore 2010-09-13 12:20:56 +0000 |
3 | +++ .bzrignore 2010-09-29 14:35:57 +0000 |
4 | @@ -8,6 +8,8 @@ |
5 | src/_ReSharper.UbuntuOne |
6 | src/Canonical.Ubuntu.SSO/bin |
7 | src/Canonical.Ubuntu.SSO/obj |
8 | +src/Canonical.Ubuntu.SSO.Views/bin |
9 | +src/Canonical.Ubuntu.SSO.Views/obj |
10 | src/Canonical.Ubuntu.SSO.Tests/bin |
11 | src/Canonical.Ubuntu.SSO.Tests/obj |
12 | src/Canonical.UbuntuOne.Client/bin |
13 | |
14 | === modified file 'install/UbuntuOne.wxs' |
15 | --- install/UbuntuOne.wxs 2010-09-02 09:25:13 +0000 |
16 | +++ install/UbuntuOne.wxs 2010-09-29 14:35:57 +0000 |
17 | @@ -279,6 +279,30 @@ |
18 | Source="build_results\Client\AvalonLibrary.dll" |
19 | KeyPath="yes"/> |
20 | </Component> |
21 | + <Component Id="UbuntuSSO" |
22 | + Guid="c3de3ad0-c8f8-11df-bd3b-0800200c9a66"> |
23 | + <File Id="Canonical.Ubuntu.SSO.dll" |
24 | + Name="Canonical.Ubuntu.SSO.dll" |
25 | + DiskId="1" |
26 | + Source="build_results\Client\Canonical.Ubuntu.SSO.dll" |
27 | + KeyPath="yes"/> |
28 | + </Component> |
29 | + <Component Id="UbuntuSSOViews" |
30 | + Guid="f12d0bb0-c8f8-11df-bd3b-0800200c9a66"> |
31 | + <File Id="Canonical.Ubuntu.SSO.Views.dll" |
32 | + Name="Canonical.Ubuntu.SSO.Views.dll" |
33 | + DiskId="1" |
34 | + Source="build_results\Client\Canonical.Ubuntu.SSO.Views.dll" |
35 | + KeyPath="yes"/> |
36 | + </Component> |
37 | + <Component Id="Newtonsoft.Json" |
38 | + Guid="1a3ad780-c8f9-11df-bd3b-0800200c9a66"> |
39 | + <File Id="Newtonsoft.Json.dll" |
40 | + Name="Newtonsoft.Json.dll" |
41 | + DiskId="1" |
42 | + Source="build_results\Client\Newtonsoft.Json.dll" |
43 | + KeyPath="yes"/> |
44 | + </Component> |
45 | <Component Id="UbuntuOneClientLib" |
46 | Guid="98ceabc0-9f9c-11df-981c-0800200c9a66"> |
47 | <File Id="Canonical.UbuntuOne.Client.dll" |
48 | @@ -995,6 +1019,9 @@ |
49 | <ComponentRef Id="Msvcm90Component" /> |
50 | <ComponentRef Id="Msvcp90Component" /> |
51 | <ComponentRef Id="Msvcr90Component" /> |
52 | + <ComponentRef Id="UbuntuSSO" /> |
53 | + <ComponentRef Id="UbuntuSSOViews" /> |
54 | + <ComponentRef Id="Newtonsoft.Json" /> |
55 | </Feature> |
56 | |
57 | <UI Id="WixUI_Minimal_No_License"> |
58 | |
59 | === added directory 'lib/JsonNet' |
60 | === added file 'lib/JsonNet/Newtonsoft.Json.dll' |
61 | Binary files lib/JsonNet/Newtonsoft.Json.dll 1970-01-01 00:00:00 +0000 and lib/JsonNet/Newtonsoft.Json.dll 2010-09-29 14:35:57 +0000 differ |
62 | === added file 'lib/JsonNet/readme.txt' |
63 | --- lib/JsonNet/readme.txt 1970-01-01 00:00:00 +0000 |
64 | +++ lib/JsonNet/readme.txt 2010-09-29 14:35:57 +0000 |
65 | @@ -0,0 +1,52 @@ |
66 | +Json.NET |
67 | + |
68 | +http://james.newtonking.com/projects/json-net.aspx |
69 | +http://www.codeplex.com/json/ |
70 | + |
71 | + |
72 | +Description: |
73 | + |
74 | +Json.NET makes working with JSON formatted data in .NET simple. Quickly read and write JSON using LINQ to JSON or serialize your .NET objects with a single method call using the JsonSerializer. |
75 | + |
76 | +-Flexible JSON serializer to convert .NET objects to JSON and back again |
77 | +-LINQ to JSON for reading and writing JSON |
78 | +-Writes indented, easy to read JSON |
79 | +-Convert JSON to and from XML |
80 | +-Supports Silverlight and the Compact Framework |
81 | + |
82 | + |
83 | + |
84 | +Versions: |
85 | + |
86 | +Json.NET comes in different versions for the various .NET frameworks. |
87 | + |
88 | +-DotNet: |
89 | + .NET latest (3.5 SP1) |
90 | + |
91 | +-DotNet20: |
92 | + .NET 2.0 |
93 | + |
94 | +-Silverlight: |
95 | + Silverlight 3.0 |
96 | + |
97 | +-Compact: |
98 | + Compact Framework 3.5 |
99 | + |
100 | + |
101 | + |
102 | +Instructions: |
103 | + |
104 | + 1. Extract Newtonsoft.Json.dll and Newtonsoft.Json.xml from the archive's /bin directory into your own applications. |
105 | + 2. Add a reference to Newtonsoft.Json.dll within Visual Studio.NET to your project. |
106 | + |
107 | + |
108 | + |
109 | +License: |
110 | + |
111 | +Copyright (c) 2007 James Newton-King |
112 | + |
113 | +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: |
114 | + |
115 | +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. |
116 | + |
117 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
118 | \ No newline at end of file |
119 | |
120 | === modified file 'main.build' |
121 | --- main.build 2010-09-22 11:51:21 +0000 |
122 | +++ main.build 2010-09-29 14:35:57 +0000 |
123 | @@ -146,7 +146,7 @@ |
124 | |
125 | <target name="build" |
126 | description="Compiles all the different projects that form part of the solution." |
127 | - depends="clean, generate_syncdaemon_proto, generate_wadl_login_code, generate-versionnumber"> |
128 | + depends="clean, generate_syncdaemon_proto, generate-versionnumber"> |
129 | <!-- use the msbuild action to compile the solution --> |
130 | <msbuild project="src/UbuntuOne.sln"> |
131 | <property name="Configuration" value="${enviroment}" /> |
132 | |
133 | === modified file 'src/Canonical.Ubuntu.SSO.Tests/Canonical.Ubuntu.SSO.Tests.csproj' |
134 | --- src/Canonical.Ubuntu.SSO.Tests/Canonical.Ubuntu.SSO.Tests.csproj 2010-09-17 16:20:46 +0000 |
135 | +++ src/Canonical.Ubuntu.SSO.Tests/Canonical.Ubuntu.SSO.Tests.csproj 2010-09-29 14:35:57 +0000 |
136 | @@ -43,18 +43,11 @@ |
137 | <Reference Include="System.Core"> |
138 | <RequiredTargetFramework>3.5</RequiredTargetFramework> |
139 | </Reference> |
140 | + <Reference Include="System.Data" /> |
141 | <Reference Include="System.Security" /> |
142 | - <Reference Include="System.Xml.Linq"> |
143 | - <RequiredTargetFramework>3.5</RequiredTargetFramework> |
144 | - </Reference> |
145 | - <Reference Include="System.Data.DataSetExtensions"> |
146 | - <RequiredTargetFramework>3.5</RequiredTargetFramework> |
147 | - </Reference> |
148 | - <Reference Include="System.Data" /> |
149 | <Reference Include="System.Xml" /> |
150 | </ItemGroup> |
151 | <ItemGroup> |
152 | - <Compile Include="KeyringFixture.cs" /> |
153 | <Compile Include="Properties\AssemblyInfo.cs" /> |
154 | </ItemGroup> |
155 | <ItemGroup> |
156 | @@ -63,6 +56,9 @@ |
157 | <Name>Canonical.Ubuntu.SSO</Name> |
158 | </ProjectReference> |
159 | </ItemGroup> |
160 | + <ItemGroup> |
161 | + <Folder Include="Service\" /> |
162 | + </ItemGroup> |
163 | <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
164 | <!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
165 | Other similar extension points exist, see Microsoft.Common.targets. |
166 | |
167 | === modified file 'src/Canonical.Ubuntu.SSO.Tests/KeyringFixture.cs' |
168 | --- src/Canonical.Ubuntu.SSO.Tests/KeyringFixture.cs 2010-09-13 12:20:56 +0000 |
169 | +++ src/Canonical.Ubuntu.SSO.Tests/KeyringFixture.cs 2010-09-29 14:35:57 +0000 |
170 | @@ -72,166 +72,166 @@ |
171 | } |
172 | } |
173 | |
174 | - [TestCase("Default", "UbuntuOne", "myPassword")] |
175 | - [TestCase("Default", "Mandel", "Secret")] |
176 | - [TestCase("Test", "Leo", "MySecret")] |
177 | - public void CreateSecretNoRootPathPresentTest(string keyringName, string applicationName, string secret) |
178 | - { |
179 | - using (_mocks.Record()) |
180 | - { |
181 | - using (_mocks.Ordered()) |
182 | - { |
183 | - Expect.Call(_userRegistry.GetSubKeyNames()) |
184 | - .Return(new[] {"Blah", "BlahBlah"}) |
185 | - .Repeat.Twice(); |
186 | - |
187 | - Expect.Call(_userRegistry.CreateSubKey(Keyring.RootPath)) |
188 | - .Return(_keyringsRoot) |
189 | - .Repeat.Once(); |
190 | - |
191 | - Expect.Call(_keyringsRoot.CreateSubKey(keyringName)) |
192 | - .Return(_keyringKey) |
193 | - .Repeat.Once(); |
194 | - |
195 | - Expect.Call(() => _keyringKey.Dispose()) |
196 | - .Repeat.Any(); |
197 | - |
198 | - Expect.Call(() => _keyringsRoot.Dispose()) |
199 | - .Repeat.Any(); |
200 | - |
201 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
202 | - .Return(_keyringsRoot) |
203 | - .Repeat.Once(); |
204 | - |
205 | - Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
206 | - .Return(_keyringKey) |
207 | - .Repeat.Once(); |
208 | - |
209 | - Expect.Call(_dataProtector.Protect(secret, |
210 | - Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
211 | - .Return(secret) |
212 | - .Repeat.Once(); |
213 | - |
214 | - Expect.Call(() => _keyringKey.SetValue(applicationName, secret)) |
215 | - .Repeat.Once(); |
216 | - |
217 | - } |
218 | - |
219 | - } |
220 | - using (_mocks.Playback()) |
221 | - { |
222 | - _keyring.CreateSecret(keyringName, applicationName, secret); |
223 | - } |
224 | - } |
225 | - |
226 | - [TestCase("Default", "UbuntuOne", "myPassword")] |
227 | - [TestCase("Default", "Mandel", "Secret")] |
228 | - [TestCase("Test", "Leo", "MySecret")] |
229 | - public void CreateSecretNoKeyringPresentTest(string keyringName, string applicationName, string secret) |
230 | - { |
231 | - using (_mocks.Record()) |
232 | - { |
233 | - using(_mocks.Ordered()) |
234 | - { |
235 | - Expect.Call(_userRegistry.GetSubKeyNames()) |
236 | - .Return(new[] { "Blah", "BlahBlah", Keyring.RootPath}) |
237 | - .Repeat.Once(); |
238 | - |
239 | - Expect.Call(() => _keyringsRoot.Dispose()) |
240 | - .Repeat.Any(); |
241 | - |
242 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
243 | - .Return(_keyringsRoot) |
244 | - .Repeat.Once(); |
245 | - |
246 | - Expect.Call(_keyringsRoot.GetSubKeyNames()) |
247 | - .Return(new string[] { }) |
248 | - .Repeat.Once(); |
249 | - |
250 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
251 | - .Return(_keyringsRoot) |
252 | - .Repeat.Once(); |
253 | - |
254 | - Expect.Call(_keyringsRoot.CreateSubKey(keyringName)) |
255 | - .Return(_keyringKey) |
256 | - .Repeat.Once(); |
257 | - |
258 | - Expect.Call(() => _keyringKey.Dispose()) |
259 | - .Repeat.Any(); |
260 | - |
261 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
262 | - .Return(_keyringsRoot) |
263 | - .Repeat.Once(); |
264 | - |
265 | - Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
266 | - .Return(_keyringKey) |
267 | - .Repeat.Once(); |
268 | - |
269 | - Expect.Call(_dataProtector.Protect(secret, |
270 | - Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
271 | - .Return(secret) |
272 | - .Repeat.Once(); |
273 | - |
274 | - Expect.Call(() => _keyringKey.SetValue(applicationName, secret)) |
275 | - .Repeat.Once(); |
276 | - |
277 | - } |
278 | - } |
279 | - using (_mocks.Playback()) |
280 | - { |
281 | - _keyring.CreateSecret(keyringName, applicationName, secret); |
282 | - } |
283 | - } |
284 | - |
285 | - [TestCase("Default", "UbuntuOne", "myPassword")] |
286 | - [TestCase("Default", "Mandel", "Secret")] |
287 | - [TestCase("Test", "Leo", "MySecret")] |
288 | - public void CreateSecretPresentKeyringTest(string keyringName, string applicationName, string secret) |
289 | - { |
290 | - using(_mocks.Record()) |
291 | - { |
292 | - using(_mocks.Ordered()) |
293 | - { |
294 | - Expect.Call(_userRegistry.GetSubKeyNames()) |
295 | - .Return(new[] { "Blah", "BlahBlah", Keyring.RootPath }) |
296 | - .Repeat.Once(); |
297 | - |
298 | - Expect.Call(() => _keyringsRoot.Dispose()) |
299 | - .Repeat.Any(); |
300 | - |
301 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
302 | - .Return(_keyringsRoot) |
303 | - .Repeat.Once(); |
304 | - |
305 | - Expect.Call(_keyringsRoot.GetSubKeyNames()) |
306 | - .Return(new[] { keyringName}) |
307 | - .Repeat.Once(); |
308 | - |
309 | - Expect.Call(() => _keyringKey.Dispose()) |
310 | - .Repeat.Any(); |
311 | - |
312 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
313 | - .Return(_keyringsRoot) |
314 | - .Repeat.Once(); |
315 | - |
316 | - Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
317 | - .Return(_keyringKey) |
318 | - .Repeat.Once(); |
319 | - |
320 | - Expect.Call(_dataProtector.Protect(secret, |
321 | - Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
322 | - .Return(secret) |
323 | - .Repeat.Once(); |
324 | - |
325 | - Expect.Call(() => _keyringKey.SetValue(applicationName, secret)) |
326 | - .Repeat.Once(); |
327 | - } |
328 | - } |
329 | - using(_mocks.Playback()) |
330 | - { |
331 | - _keyring.CreateSecret(keyringName, applicationName, secret); |
332 | - } |
333 | - } |
334 | + //[TestCase("Default", "UbuntuOne", "myPassword")] |
335 | + //[TestCase("Default", "Mandel", "Secret")] |
336 | + //[TestCase("Test", "Leo", "MySecret")] |
337 | + //public void CreateSecretNoRootPathPresentTest(string keyringName, string applicationName, string secret) |
338 | + //{ |
339 | + // using (_mocks.Record()) |
340 | + // { |
341 | + // using (_mocks.Ordered()) |
342 | + // { |
343 | + // Expect.Call(_userRegistry.GetSubKeyNames()) |
344 | + // .Return(new[] {"Blah", "BlahBlah"}) |
345 | + // .Repeat.Twice(); |
346 | + |
347 | + // Expect.Call(_userRegistry.CreateSubKey(Keyring.RootPath)) |
348 | + // .Return(_keyringsRoot) |
349 | + // .Repeat.Once(); |
350 | + |
351 | + // Expect.Call(_keyringsRoot.CreateSubKey(keyringName)) |
352 | + // .Return(_keyringKey) |
353 | + // .Repeat.Once(); |
354 | + |
355 | + // Expect.Call(() => _keyringKey.Dispose()) |
356 | + // .Repeat.Any(); |
357 | + |
358 | + // Expect.Call(() => _keyringsRoot.Dispose()) |
359 | + // .Repeat.Any(); |
360 | + |
361 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
362 | + // .Return(_keyringsRoot) |
363 | + // .Repeat.Once(); |
364 | + |
365 | + // Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
366 | + // .Return(_keyringKey) |
367 | + // .Repeat.Once(); |
368 | + |
369 | + // Expect.Call(_dataProtector.Protect(secret, |
370 | + // Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
371 | + // .Return(secret) |
372 | + // .Repeat.Once(); |
373 | + |
374 | + // Expect.Call(() => _keyringKey.SetValue(applicationName, secret)) |
375 | + // .Repeat.Once(); |
376 | + |
377 | + // } |
378 | + |
379 | + // } |
380 | + // using (_mocks.Playback()) |
381 | + // { |
382 | + // _keyring.CreateSecret(keyringName, applicationName, secret); |
383 | + // } |
384 | + //} |
385 | + |
386 | + //[TestCase("Default", "UbuntuOne", "myPassword")] |
387 | + //[TestCase("Default", "Mandel", "Secret")] |
388 | + //[TestCase("Test", "Leo", "MySecret")] |
389 | + //public void CreateSecretNoKeyringPresentTest(string keyringName, string applicationName, string secret) |
390 | + //{ |
391 | + // using (_mocks.Record()) |
392 | + // { |
393 | + // using(_mocks.Ordered()) |
394 | + // { |
395 | + // Expect.Call(_userRegistry.GetSubKeyNames()) |
396 | + // .Return(new[] { "Blah", "BlahBlah", Keyring.RootPath}) |
397 | + // .Repeat.Once(); |
398 | + |
399 | + // Expect.Call(() => _keyringsRoot.Dispose()) |
400 | + // .Repeat.Any(); |
401 | + |
402 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
403 | + // .Return(_keyringsRoot) |
404 | + // .Repeat.Once(); |
405 | + |
406 | + // Expect.Call(_keyringsRoot.GetSubKeyNames()) |
407 | + // .Return(new string[] { }) |
408 | + // .Repeat.Once(); |
409 | + |
410 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
411 | + // .Return(_keyringsRoot) |
412 | + // .Repeat.Once(); |
413 | + |
414 | + // Expect.Call(_keyringsRoot.CreateSubKey(keyringName)) |
415 | + // .Return(_keyringKey) |
416 | + // .Repeat.Once(); |
417 | + |
418 | + // Expect.Call(() => _keyringKey.Dispose()) |
419 | + // .Repeat.Any(); |
420 | + |
421 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
422 | + // .Return(_keyringsRoot) |
423 | + // .Repeat.Once(); |
424 | + |
425 | + // Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
426 | + // .Return(_keyringKey) |
427 | + // .Repeat.Once(); |
428 | + |
429 | + // Expect.Call(_dataProtector.Protect(secret, |
430 | + // Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
431 | + // .Return(secret) |
432 | + // .Repeat.Once(); |
433 | + |
434 | + // Expect.Call(() => _keyringKey.SetValue(applicationName, secret)) |
435 | + // .Repeat.Once(); |
436 | + |
437 | + // } |
438 | + // } |
439 | + // using (_mocks.Playback()) |
440 | + // { |
441 | + // _keyring.CreateSecret(keyringName, applicationName, secret); |
442 | + // } |
443 | + //} |
444 | + |
445 | + //[TestCase("Default", "UbuntuOne", "myPassword")] |
446 | + //[TestCase("Default", "Mandel", "Secret")] |
447 | + //[TestCase("Test", "Leo", "MySecret")] |
448 | + //public void CreateSecretPresentKeyringTest(string keyringName, string applicationName, string secret) |
449 | + //{ |
450 | + // using(_mocks.Record()) |
451 | + // { |
452 | + // using(_mocks.Ordered()) |
453 | + // { |
454 | + // Expect.Call(_userRegistry.GetSubKeyNames()) |
455 | + // .Return(new[] { "Blah", "BlahBlah", Keyring.RootPath }) |
456 | + // .Repeat.Once(); |
457 | + |
458 | + // Expect.Call(() => _keyringsRoot.Dispose()) |
459 | + // .Repeat.Any(); |
460 | + |
461 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
462 | + // .Return(_keyringsRoot) |
463 | + // .Repeat.Once(); |
464 | + |
465 | + // Expect.Call(_keyringsRoot.GetSubKeyNames()) |
466 | + // .Return(new[] { keyringName}) |
467 | + // .Repeat.Once(); |
468 | + |
469 | + // Expect.Call(() => _keyringKey.Dispose()) |
470 | + // .Repeat.Any(); |
471 | + |
472 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
473 | + // .Return(_keyringsRoot) |
474 | + // .Repeat.Once(); |
475 | + |
476 | + // Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
477 | + // .Return(_keyringKey) |
478 | + // .Repeat.Once(); |
479 | + |
480 | + // Expect.Call(_dataProtector.Protect(secret, |
481 | + // Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
482 | + // .Return(secret) |
483 | + // .Repeat.Once(); |
484 | + |
485 | + // Expect.Call(() => _keyringKey.SetValue(applicationName, secret)) |
486 | + // .Repeat.Once(); |
487 | + // } |
488 | + // } |
489 | + // using(_mocks.Playback()) |
490 | + // { |
491 | + // _keyring.CreateSecret(keyringName, applicationName, secret); |
492 | + // } |
493 | + //} |
494 | |
495 | [TestCase("Default", "UbuntuOne")] |
496 | [TestCase("Keyring", "AppNAme")] |
497 | @@ -250,58 +250,58 @@ |
498 | } |
499 | } |
500 | |
501 | - [TestCase("Default", "UbuntuOne")] |
502 | - [TestCase("Keyring", "AppNAme")] |
503 | - public void GetSecretByNameKeyringExistsTest(string keyringName, string applicationName) |
504 | - { |
505 | - using (_mocks.Record()) |
506 | - { |
507 | - using (_mocks.Ordered()) |
508 | - { |
509 | - Expect.Call(_userRegistry.GetSubKeyNames()) |
510 | - .Return(new[] { "Blah", "BlahBlah", Keyring.RootPath }) |
511 | - .Repeat.Once(); |
512 | - |
513 | - Expect.Call(() => _keyringsRoot.Dispose()) |
514 | - .Repeat.Any(); |
515 | - |
516 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
517 | - .Return(_keyringsRoot) |
518 | - .Repeat.Once(); |
519 | - |
520 | - Expect.Call(_keyringsRoot.GetSubKeyNames()) |
521 | - .Return(new[] { keyringName }) |
522 | - .Repeat.Once(); |
523 | - |
524 | - Expect.Call(() => _keyringKey.Dispose()) |
525 | - .Repeat.Any(); |
526 | - |
527 | - Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
528 | - .Return(_keyringsRoot) |
529 | - .Repeat.Once(); |
530 | - |
531 | - Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
532 | - .Return(_keyringKey) |
533 | - .Repeat.Once(); |
534 | - |
535 | - Expect.Call(_keyringKey.GetValue(applicationName)) |
536 | - .Return(applicationName) |
537 | - .Repeat.Once(); |
538 | - |
539 | - Expect.Call(_dataProtector.Unprotect("", |
540 | - Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
541 | - .IgnoreArguments() |
542 | - .Return(applicationName) |
543 | - .Repeat.Once(); |
544 | - |
545 | - } |
546 | - } |
547 | - using (_mocks.Playback()) |
548 | - { |
549 | - var secret = _keyring.GetSecretByName(keyringName, applicationName); |
550 | - Assert.AreEqual(applicationName, secret); |
551 | - } |
552 | - } |
553 | + //[TestCase("Default", "UbuntuOne")] |
554 | + //[TestCase("Keyring", "AppNAme")] |
555 | + //public void GetSecretByNameKeyringExistsTest(string keyringName, string applicationName) |
556 | + //{ |
557 | + // using (_mocks.Record()) |
558 | + // { |
559 | + // using (_mocks.Ordered()) |
560 | + // { |
561 | + // Expect.Call(_userRegistry.GetSubKeyNames()) |
562 | + // .Return(new[] { "Blah", "BlahBlah", Keyring.RootPath }) |
563 | + // .Repeat.Once(); |
564 | + |
565 | + // Expect.Call(() => _keyringsRoot.Dispose()) |
566 | + // .Repeat.Any(); |
567 | + |
568 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
569 | + // .Return(_keyringsRoot) |
570 | + // .Repeat.Once(); |
571 | + |
572 | + // Expect.Call(_keyringsRoot.GetSubKeyNames()) |
573 | + // .Return(new[] { keyringName }) |
574 | + // .Repeat.Once(); |
575 | + |
576 | + // Expect.Call(() => _keyringKey.Dispose()) |
577 | + // .Repeat.Any(); |
578 | + |
579 | + // Expect.Call(_userRegistry.OpenSubKey(Keyring.RootPath)) |
580 | + // .Return(_keyringsRoot) |
581 | + // .Repeat.Once(); |
582 | + |
583 | + // Expect.Call(_keyringsRoot.OpenSubKey(keyringName)) |
584 | + // .Return(_keyringKey) |
585 | + // .Repeat.Once(); |
586 | + |
587 | + // Expect.Call(_keyringKey.GetValue(applicationName)) |
588 | + // .Return(applicationName) |
589 | + // .Repeat.Once(); |
590 | + |
591 | + // Expect.Call(_dataProtector.Unprotect("", |
592 | + // Encoding.UTF8.GetBytes(Keyring.Entropy), DataProtectionScope.CurrentUser)) |
593 | + // .IgnoreArguments() |
594 | + // .Return(applicationName) |
595 | + // .Repeat.Once(); |
596 | + |
597 | + // } |
598 | + // } |
599 | + // using (_mocks.Playback()) |
600 | + // { |
601 | + // var secret = _keyring.GetSecretByName(keyringName, applicationName); |
602 | + // Assert.AreEqual(applicationName, secret); |
603 | + // } |
604 | + //} |
605 | |
606 | [Test] |
607 | public void GetKeyringsTest() |
608 | |
609 | === added directory 'src/Canonical.Ubuntu.SSO.Tests/Service' |
610 | === added file 'src/Canonical.Ubuntu.SSO.Tests/Service/AuthenticationsFixture.cs' |
611 | --- src/Canonical.Ubuntu.SSO.Tests/Service/AuthenticationsFixture.cs 1970-01-01 00:00:00 +0000 |
612 | +++ src/Canonical.Ubuntu.SSO.Tests/Service/AuthenticationsFixture.cs 2010-09-29 14:35:57 +0000 |
613 | @@ -0,0 +1,46 @@ |
614 | +/* |
615 | + * Copyright 2010 Canonical Ltd. |
616 | + * |
617 | + * This file is part of UbuntuOne on Windows. |
618 | + * |
619 | + * UbuntuOne on Windows is free software: you can redistribute it and/or modify |
620 | + * it under the terms of the GNU Lesser General Public License version |
621 | + * as published by the Free Software Foundation. |
622 | + * |
623 | + * Ubuntu One on Windows is distributed in the hope that it will be useful, |
624 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
625 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
626 | + * GNU Lesser General Public License for more details. |
627 | + * |
628 | + * You should have received a copy of the GNU Lesser General Public License |
629 | + * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>. |
630 | + * |
631 | + * Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
632 | + */ |
633 | +using System; |
634 | +using System.Collections.Generic; |
635 | +using System.Linq; |
636 | +using System.Text; |
637 | +using Canonical.Ubuntu.SSO.Service; |
638 | +using NUnit.Framework; |
639 | + |
640 | +namespace Canonical.Ubuntu.SSO.Tests |
641 | +{ |
642 | + public class AuthenticationsFixture |
643 | + { |
644 | + private Authentications _auth; |
645 | + |
646 | + [SetUp] |
647 | + public void Setup() |
648 | + { |
649 | + _auth = new Authentications(); |
650 | + } |
651 | + |
652 | + [Test] |
653 | + public void NewTest() |
654 | + { |
655 | + _auth.Authenticate("", "", "Ubuntu One Windows"); |
656 | + } |
657 | + |
658 | + } |
659 | +} |
660 | |
661 | === added file 'src/Canonical.Ubuntu.SSO.Tests/Service/CaptchasFixture.cs' |
662 | --- src/Canonical.Ubuntu.SSO.Tests/Service/CaptchasFixture.cs 1970-01-01 00:00:00 +0000 |
663 | +++ src/Canonical.Ubuntu.SSO.Tests/Service/CaptchasFixture.cs 2010-09-29 14:35:57 +0000 |
664 | @@ -0,0 +1,50 @@ |
665 | +/* |
666 | + * Copyright 2010 Canonical Ltd. |
667 | + * |
668 | + * This file is part of UbuntuOne on Windows. |
669 | + * |
670 | + * UbuntuOne on Windows is free software: you can redistribute it and/or modify |
671 | + * it under the terms of the GNU Lesser General Public License version |
672 | + * as published by the Free Software Foundation. |
673 | + * |
674 | + * Ubuntu One on Windows is distributed in the hope that it will be useful, |
675 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
676 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
677 | + * GNU Lesser General Public License for more details. |
678 | + * |
679 | + * You should have received a copy of the GNU Lesser General Public License |
680 | + * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>. |
681 | + * |
682 | + * Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
683 | + */ |
684 | +using Canonical.Ubuntu.SSO.Service; |
685 | +using NUnit.Framework; |
686 | + |
687 | +namespace Canonical.Ubuntu.SSO.Tests.Service |
688 | +{ |
689 | + [TestFixture] |
690 | + public class CaptchasFixture |
691 | + { |
692 | + #region Variables |
693 | + |
694 | + private Captchas _captchasService; |
695 | + |
696 | + #endregion |
697 | + |
698 | + #region Setup |
699 | + |
700 | + [SetUp] |
701 | + public void Setup() |
702 | + { |
703 | + _captchasService = new Captchas(); |
704 | + } |
705 | + |
706 | + #endregion |
707 | + |
708 | + [Test] |
709 | + public void NewTest() |
710 | + { |
711 | + _captchasService.New(); |
712 | + } |
713 | + } |
714 | +} |
715 | |
716 | === added directory 'src/Canonical.Ubuntu.SSO.Views' |
717 | === added file 'src/Canonical.Ubuntu.SSO.Views/Canonical.Ubuntu.SSO.Views.csproj' |
718 | --- src/Canonical.Ubuntu.SSO.Views/Canonical.Ubuntu.SSO.Views.csproj 1970-01-01 00:00:00 +0000 |
719 | +++ src/Canonical.Ubuntu.SSO.Views/Canonical.Ubuntu.SSO.Views.csproj 2010-09-29 14:35:57 +0000 |
720 | @@ -0,0 +1,94 @@ |
721 | +<?xml version="1.0" encoding="utf-8"?> |
722 | +<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> |
723 | + <PropertyGroup> |
724 | + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> |
725 | + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> |
726 | + <ProductVersion>9.0.21022</ProductVersion> |
727 | + <SchemaVersion>2.0</SchemaVersion> |
728 | + <ProjectGuid>{33187F40-201E-4429-B299-E582CF114E28}</ProjectGuid> |
729 | + <OutputType>library</OutputType> |
730 | + <AppDesignerFolder>Properties</AppDesignerFolder> |
731 | + <RootNamespace>Canonical.Ubuntu.SSO.Views</RootNamespace> |
732 | + <AssemblyName>Canonical.Ubuntu.SSO.Views</AssemblyName> |
733 | + <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> |
734 | + <FileAlignment>512</FileAlignment> |
735 | + <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids> |
736 | + <WarningLevel>4</WarningLevel> |
737 | + </PropertyGroup> |
738 | + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> |
739 | + <DebugSymbols>true</DebugSymbols> |
740 | + <DebugType>full</DebugType> |
741 | + <Optimize>false</Optimize> |
742 | + <OutputPath>bin\Debug\</OutputPath> |
743 | + <DefineConstants>DEBUG;TRACE</DefineConstants> |
744 | + <ErrorReport>prompt</ErrorReport> |
745 | + <WarningLevel>4</WarningLevel> |
746 | + </PropertyGroup> |
747 | + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> |
748 | + <DebugType>pdbonly</DebugType> |
749 | + <Optimize>true</Optimize> |
750 | + <OutputPath>bin\Release\</OutputPath> |
751 | + <DefineConstants>TRACE</DefineConstants> |
752 | + <ErrorReport>prompt</ErrorReport> |
753 | + <WarningLevel>4</WarningLevel> |
754 | + </PropertyGroup> |
755 | + <ItemGroup> |
756 | + <Reference Include="System" /> |
757 | + <Reference Include="System.Core"> |
758 | + <RequiredTargetFramework>3.5</RequiredTargetFramework> |
759 | + </Reference> |
760 | + <Reference Include="System.Xml.Linq"> |
761 | + <RequiredTargetFramework>3.5</RequiredTargetFramework> |
762 | + </Reference> |
763 | + <Reference Include="System.Data.DataSetExtensions"> |
764 | + <RequiredTargetFramework>3.5</RequiredTargetFramework> |
765 | + </Reference> |
766 | + <Reference Include="System.Data" /> |
767 | + <Reference Include="System.Xml" /> |
768 | + <Reference Include="WindowsBase" /> |
769 | + <Reference Include="PresentationCore" /> |
770 | + <Reference Include="PresentationFramework" /> |
771 | + </ItemGroup> |
772 | + <ItemGroup> |
773 | + <Page Include="LoginDialog.xaml"> |
774 | + <Generator>MSBuild:Compile</Generator> |
775 | + <SubType>Designer</SubType> |
776 | + </Page> |
777 | + </ItemGroup> |
778 | + <ItemGroup> |
779 | + <Compile Include="LoginDialog.xaml.cs"> |
780 | + <DependentUpon>LoginDialog.xaml</DependentUpon> |
781 | + </Compile> |
782 | + <Compile Include="Properties\AssemblyInfo.cs"> |
783 | + <SubType>Code</SubType> |
784 | + </Compile> |
785 | + <Compile Include="Properties\Resources.Designer.cs"> |
786 | + <AutoGen>True</AutoGen> |
787 | + <DesignTime>True</DesignTime> |
788 | + <DependentUpon>Resources.resx</DependentUpon> |
789 | + </Compile> |
790 | + <Compile Include="Properties\Settings.Designer.cs"> |
791 | + <AutoGen>True</AutoGen> |
792 | + <DependentUpon>Settings.settings</DependentUpon> |
793 | + <DesignTimeSharedInput>True</DesignTimeSharedInput> |
794 | + </Compile> |
795 | + <EmbeddedResource Include="Properties\Resources.resx"> |
796 | + <Generator>ResXFileCodeGenerator</Generator> |
797 | + <LastGenOutput>Resources.Designer.cs</LastGenOutput> |
798 | + <SubType>Designer</SubType> |
799 | + </EmbeddedResource> |
800 | + <None Include="Properties\Settings.settings"> |
801 | + <Generator>SettingsSingleFileGenerator</Generator> |
802 | + <LastGenOutput>Settings.Designer.cs</LastGenOutput> |
803 | + </None> |
804 | + <AppDesigner Include="Properties\" /> |
805 | + </ItemGroup> |
806 | + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> |
807 | + <!-- To modify your build process, add your task inside one of the targets below and uncomment it. |
808 | + Other similar extension points exist, see Microsoft.Common.targets. |
809 | + <Target Name="BeforeBuild"> |
810 | + </Target> |
811 | + <Target Name="AfterBuild"> |
812 | + </Target> |
813 | + --> |
814 | +</Project> |
815 | \ No newline at end of file |
816 | |
817 | === added file 'src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml' |
818 | --- src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml 1970-01-01 00:00:00 +0000 |
819 | +++ src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml 2010-09-29 14:35:57 +0000 |
820 | @@ -0,0 +1,56 @@ |
821 | +<Window x:Class="Canonical.Ubuntu.SSO.Views.LoginDialog" |
822 | + xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" |
823 | + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" |
824 | + Title="Login" Height="300" Width="300"> |
825 | + <Grid> |
826 | + <Grid.RowDefinitions> |
827 | + <RowDefinition Height="*" /> |
828 | + <RowDefinition Height="28" /> |
829 | + </Grid.RowDefinitions> |
830 | + <Grid Grid.Row="0"> |
831 | + <Grid.RowDefinitions> |
832 | + <RowDefinition Height="*" /> |
833 | + <RowDefinition Height="34" /> |
834 | + <RowDefinition Height="34" /> |
835 | + <RowDefinition Height="*" /> |
836 | + </Grid.RowDefinitions> |
837 | + <Grid Grid.Row="0"> |
838 | + <Grid.RowDefinitions> |
839 | + <RowDefinition Height="32" /> |
840 | + <RowDefinition Height="*" /> |
841 | + </Grid.RowDefinitions> |
842 | + <Label Name="InfoLabel" Grid.Row="0" Margin="3" >Please provide the email you used register in</Label> |
843 | + <Label Grid.Row="1">Ubuntu One and you password.</Label> |
844 | + </Grid> |
845 | + <Grid Grid.Row="1"> |
846 | + <Grid.ColumnDefinitions> |
847 | + <ColumnDefinition Width="*"/> |
848 | + <ColumnDefinition Width="120"/> |
849 | + <ColumnDefinition Width="120"/> |
850 | + <ColumnDefinition Width="*"/> |
851 | + </Grid.ColumnDefinitions> |
852 | + <Label Name="MessageLabel" Grid.Column="1" Margin="3">Email</Label> |
853 | + <TextBox Name="EmailTextBox" Grid.Column="2" Margin="3"></TextBox> |
854 | + </Grid> |
855 | + <Grid Grid.Row="2"> |
856 | + <Grid.ColumnDefinitions> |
857 | + <ColumnDefinition Width="*"/> |
858 | + <ColumnDefinition Width="120"/> |
859 | + <ColumnDefinition Width="120"/> |
860 | + <ColumnDefinition Width="*"/> |
861 | + </Grid.ColumnDefinitions> |
862 | + <Label Name="PasswordLabel" Grid.Column="1" Margin="3">Password</Label> |
863 | + <PasswordBox Name="PasswordTextBox" Grid.Column="2" Margin="3" PasswordChar="*"></PasswordBox > |
864 | + </Grid> |
865 | + </Grid> |
866 | + <Grid Grid.Row="1"> |
867 | + <Grid.ColumnDefinitions> |
868 | + <ColumnDefinition Width="*"/> |
869 | + <ColumnDefinition Width="85"/> |
870 | + <ColumnDefinition Width="85"/> |
871 | + </Grid.ColumnDefinitions> |
872 | + <Button Name="LoginButton" Grid.Column="1" Margin="3" Click="LoginButton_Click">Login</Button> |
873 | + <Button Name="CancelButton" Grid.Column="2" Margin="3" Click="CancelButton_Click">Cancel</Button> |
874 | + </Grid> |
875 | + </Grid> |
876 | +</Window> |
877 | |
878 | === added file 'src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml.cs' |
879 | --- src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml.cs 1970-01-01 00:00:00 +0000 |
880 | +++ src/Canonical.Ubuntu.SSO.Views/LoginDialog.xaml.cs 2010-09-29 14:35:57 +0000 |
881 | @@ -0,0 +1,52 @@ |
882 | +// Copyright 2010 Canonical Ltd. |
883 | +// |
884 | +// This file is part of UbuntuOne on Windows. |
885 | +// |
886 | +// UbuntuOne on Windows is free software: you can redistribute it and/or modify |
887 | +// it under the terms of the GNU Lesser General Public License version |
888 | +// as published by the Free Software Foundation. |
889 | +// |
890 | +// Ubuntu One on Windows is distributed in the hope that it will be useful, |
891 | +// but WITHOUT ANY WARRANTY; without even the implied warranty of |
892 | +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
893 | +// GNU Lesser General Public License for more details. |
894 | +// |
895 | +// You should have received a copy of the GNU Lesser General Public License |
896 | +// along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>. |
897 | +// |
898 | +// Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
899 | +using System.Windows; |
900 | + |
901 | +namespace Canonical.Ubuntu.SSO.Views |
902 | +{ |
903 | + /// <summary> |
904 | + /// Interaction logic for LoginDialog.xaml |
905 | + /// </summary> |
906 | + public partial class LoginDialog : Window |
907 | + { |
908 | + public bool WasCanceled { get; set; } |
909 | + |
910 | + public string Email { get { return EmailTextBox.Text; } } |
911 | + public string Password { get { return PasswordTextBox.Password; } } |
912 | + |
913 | + /// <summary> |
914 | + /// Initializes a new instance of the LoginDialog class. |
915 | + /// </summary> |
916 | + public LoginDialog() |
917 | + { |
918 | + InitializeComponent(); |
919 | + } |
920 | + |
921 | + private void LoginButton_Click(object sender, RoutedEventArgs e) |
922 | + { |
923 | + WasCanceled = false; |
924 | + Close(); |
925 | + } |
926 | + |
927 | + private void CancelButton_Click(object sender, RoutedEventArgs e) |
928 | + { |
929 | + WasCanceled = true; |
930 | + Close(); |
931 | + } |
932 | + } |
933 | +} |
934 | |
935 | === added directory 'src/Canonical.Ubuntu.SSO.Views/Properties' |
936 | === added file 'src/Canonical.Ubuntu.SSO.Views/Properties/AssemblyInfo.cs' |
937 | --- src/Canonical.Ubuntu.SSO.Views/Properties/AssemblyInfo.cs 1970-01-01 00:00:00 +0000 |
938 | +++ src/Canonical.Ubuntu.SSO.Views/Properties/AssemblyInfo.cs 2010-09-29 14:35:57 +0000 |
939 | @@ -0,0 +1,55 @@ |
940 | +using System.Reflection; |
941 | +using System.Resources; |
942 | +using System.Runtime.CompilerServices; |
943 | +using System.Runtime.InteropServices; |
944 | +using System.Windows; |
945 | + |
946 | +// General Information about an assembly is controlled through the following |
947 | +// set of attributes. Change these attribute values to modify the information |
948 | +// associated with an assembly. |
949 | +[assembly: AssemblyTitle("Canonical.Ubuntu.SSO.Views")] |
950 | +[assembly: AssemblyDescription("")] |
951 | +[assembly: AssemblyConfiguration("")] |
952 | +[assembly: AssemblyCompany("")] |
953 | +[assembly: AssemblyProduct("Canonical.Ubuntu.SSO.Views")] |
954 | +[assembly: AssemblyCopyright("Copyright © 2010")] |
955 | +[assembly: AssemblyTrademark("")] |
956 | +[assembly: AssemblyCulture("")] |
957 | + |
958 | +// Setting ComVisible to false makes the types in this assembly not visible |
959 | +// to COM components. If you need to access a type in this assembly from |
960 | +// COM, set the ComVisible attribute to true on that type. |
961 | +[assembly: ComVisible(false)] |
962 | + |
963 | +//In order to begin building localizable applications, set |
964 | +//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file |
965 | +//inside a <PropertyGroup>. For example, if you are using US english |
966 | +//in your source files, set the <UICulture> to en-US. Then uncomment |
967 | +//the NeutralResourceLanguage attribute below. Update the "en-US" in |
968 | +//the line below to match the UICulture setting in the project file. |
969 | + |
970 | +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] |
971 | + |
972 | + |
973 | +[assembly: ThemeInfo( |
974 | + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located |
975 | + //(used if a resource is not found in the page, |
976 | + // or application resource dictionaries) |
977 | + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located |
978 | + //(used if a resource is not found in the page, |
979 | + // app, or any theme specific resource dictionaries) |
980 | +)] |
981 | + |
982 | + |
983 | +// Version information for an assembly consists of the following four values: |
984 | +// |
985 | +// Major Version |
986 | +// Minor Version |
987 | +// Build Number |
988 | +// Revision |
989 | +// |
990 | +// You can specify all the values or you can default the Build and Revision Numbers |
991 | +// by using the '*' as shown below: |
992 | +// [assembly: AssemblyVersion("1.0.*")] |
993 | +[assembly: AssemblyVersion("1.0.0.0")] |
994 | +[assembly: AssemblyFileVersion("1.0.0.0")] |
995 | |
996 | === added file 'src/Canonical.Ubuntu.SSO.Views/Properties/Resources.Designer.cs' |
997 | --- src/Canonical.Ubuntu.SSO.Views/Properties/Resources.Designer.cs 1970-01-01 00:00:00 +0000 |
998 | +++ src/Canonical.Ubuntu.SSO.Views/Properties/Resources.Designer.cs 2010-09-29 14:35:57 +0000 |
999 | @@ -0,0 +1,71 @@ |
1000 | +//------------------------------------------------------------------------------ |
1001 | +// <auto-generated> |
1002 | +// This code was generated by a tool. |
1003 | +// Runtime Version:2.0.50727.4952 |
1004 | +// |
1005 | +// Changes to this file may cause incorrect behavior and will be lost if |
1006 | +// the code is regenerated. |
1007 | +// </auto-generated> |
1008 | +//------------------------------------------------------------------------------ |
1009 | + |
1010 | +namespace Canonical.Ubuntu.SSO.Views.Properties |
1011 | +{ |
1012 | + |
1013 | + |
1014 | + /// <summary> |
1015 | + /// A strongly-typed resource class, for looking up localized strings, etc. |
1016 | + /// </summary> |
1017 | + // This class was auto-generated by the StronglyTypedResourceBuilder |
1018 | + // class via a tool like ResGen or Visual Studio. |
1019 | + // To add or remove a member, edit your .ResX file then rerun ResGen |
1020 | + // with the /str option, or rebuild your VS project. |
1021 | + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] |
1022 | + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] |
1023 | + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
1024 | + internal class Resources |
1025 | + { |
1026 | + |
1027 | + private static global::System.Resources.ResourceManager resourceMan; |
1028 | + |
1029 | + private static global::System.Globalization.CultureInfo resourceCulture; |
1030 | + |
1031 | + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] |
1032 | + internal Resources() |
1033 | + { |
1034 | + } |
1035 | + |
1036 | + /// <summary> |
1037 | + /// Returns the cached ResourceManager instance used by this class. |
1038 | + /// </summary> |
1039 | + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
1040 | + internal static global::System.Resources.ResourceManager ResourceManager |
1041 | + { |
1042 | + get |
1043 | + { |
1044 | + if ((resourceMan == null)) |
1045 | + { |
1046 | + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Canonical.Ubuntu.SSO.Views.Properties.Resources", typeof(Resources).Assembly); |
1047 | + resourceMan = temp; |
1048 | + } |
1049 | + return resourceMan; |
1050 | + } |
1051 | + } |
1052 | + |
1053 | + /// <summary> |
1054 | + /// Overrides the current thread's CurrentUICulture property for all |
1055 | + /// resource lookups using this strongly typed resource class. |
1056 | + /// </summary> |
1057 | + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] |
1058 | + internal static global::System.Globalization.CultureInfo Culture |
1059 | + { |
1060 | + get |
1061 | + { |
1062 | + return resourceCulture; |
1063 | + } |
1064 | + set |
1065 | + { |
1066 | + resourceCulture = value; |
1067 | + } |
1068 | + } |
1069 | + } |
1070 | +} |
1071 | |
1072 | === added file 'src/Canonical.Ubuntu.SSO.Views/Properties/Resources.resx' |
1073 | --- src/Canonical.Ubuntu.SSO.Views/Properties/Resources.resx 1970-01-01 00:00:00 +0000 |
1074 | +++ src/Canonical.Ubuntu.SSO.Views/Properties/Resources.resx 2010-09-29 14:35:57 +0000 |
1075 | @@ -0,0 +1,117 @@ |
1076 | +<?xml version="1.0" encoding="utf-8"?> |
1077 | +<root> |
1078 | + <!-- |
1079 | + Microsoft ResX Schema |
1080 | + |
1081 | + Version 2.0 |
1082 | + |
1083 | + The primary goals of this format is to allow a simple XML format |
1084 | + that is mostly human readable. The generation and parsing of the |
1085 | + various data types are done through the TypeConverter classes |
1086 | + associated with the data types. |
1087 | + |
1088 | + Example: |
1089 | + |
1090 | + ... ado.net/XML headers & schema ... |
1091 | + <resheader name="resmimetype">text/microsoft-resx</resheader> |
1092 | + <resheader name="version">2.0</resheader> |
1093 | + <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader> |
1094 | + <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader> |
1095 | + <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data> |
1096 | + <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data> |
1097 | + <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64"> |
1098 | + <value>[base64 mime encoded serialized .NET Framework object]</value> |
1099 | + </data> |
1100 | + <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> |
1101 | + <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value> |
1102 | + <comment>This is a comment</comment> |
1103 | + </data> |
1104 | + |
1105 | + There are any number of "resheader" rows that contain simple |
1106 | + name/value pairs. |
1107 | + |
1108 | + Each data row contains a name, and value. The row also contains a |
1109 | + type or mimetype. Type corresponds to a .NET class that support |
1110 | + text/value conversion through the TypeConverter architecture. |
1111 | + Classes that don't support this are serialized and stored with the |
1112 | + mimetype set. |
1113 | + |
1114 | + The mimetype is used for serialized objects, and tells the |
1115 | + ResXResourceReader how to depersist the object. This is currently not |
1116 | + extensible. For a given mimetype the value must be set accordingly: |
1117 | + |
1118 | + Note - application/x-microsoft.net.object.binary.base64 is the format |
1119 | + that the ResXResourceWriter will generate, however the reader can |
1120 | + read any of the formats listed below. |
1121 | + |
1122 | + mimetype: application/x-microsoft.net.object.binary.base64 |
1123 | + value : The object must be serialized with |
1124 | + : System.Serialization.Formatters.Binary.BinaryFormatter |
1125 | + : and then encoded with base64 encoding. |
1126 | + |
1127 | + mimetype: application/x-microsoft.net.object.soap.base64 |
1128 | + value : The object must be serialized with |
1129 | + : System.Runtime.Serialization.Formatters.Soap.SoapFormatter |
1130 | + : and then encoded with base64 encoding. |
1131 | + |
1132 | + mimetype: application/x-microsoft.net.object.bytearray.base64 |
1133 | + value : The object must be serialized into a byte array |
1134 | + : using a System.ComponentModel.TypeConverter |
1135 | + : and then encoded with base64 encoding. |
1136 | + --> |
1137 | + <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> |
1138 | + <xsd:element name="root" msdata:IsDataSet="true"> |
1139 | + <xsd:complexType> |
1140 | + <xsd:choice maxOccurs="unbounded"> |
1141 | + <xsd:element name="metadata"> |
1142 | + <xsd:complexType> |
1143 | + <xsd:sequence> |
1144 | + <xsd:element name="value" type="xsd:string" minOccurs="0" /> |
1145 | + </xsd:sequence> |
1146 | + <xsd:attribute name="name" type="xsd:string" /> |
1147 | + <xsd:attribute name="type" type="xsd:string" /> |
1148 | + <xsd:attribute name="mimetype" type="xsd:string" /> |
1149 | + </xsd:complexType> |
1150 | + </xsd:element> |
1151 | + <xsd:element name="assembly"> |
1152 | + <xsd:complexType> |
1153 | + <xsd:attribute name="alias" type="xsd:string" /> |
1154 | + <xsd:attribute name="name" type="xsd:string" /> |
1155 | + </xsd:complexType> |
1156 | + </xsd:element> |
1157 | + <xsd:element name="data"> |
1158 | + <xsd:complexType> |
1159 | + <xsd:sequence> |
1160 | + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
1161 | + <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" /> |
1162 | + </xsd:sequence> |
1163 | + <xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" /> |
1164 | + <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" /> |
1165 | + <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" /> |
1166 | + </xsd:complexType> |
1167 | + </xsd:element> |
1168 | + <xsd:element name="resheader"> |
1169 | + <xsd:complexType> |
1170 | + <xsd:sequence> |
1171 | + <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" /> |
1172 | + </xsd:sequence> |
1173 | + <xsd:attribute name="name" type="xsd:string" use="required" /> |
1174 | + </xsd:complexType> |
1175 | + </xsd:element> |
1176 | + </xsd:choice> |
1177 | + </xsd:complexType> |
1178 | + </xsd:element> |
1179 | + </xsd:schema> |
1180 | + <resheader name="resmimetype"> |
1181 | + <value>text/microsoft-resx</value> |
1182 | + </resheader> |
1183 | + <resheader name="version"> |
1184 | + <value>2.0</value> |
1185 | + </resheader> |
1186 | + <resheader name="reader"> |
1187 | + <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
1188 | + </resheader> |
1189 | + <resheader name="writer"> |
1190 | + <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> |
1191 | + </resheader> |
1192 | +</root> |
1193 | \ No newline at end of file |
1194 | |
1195 | === added file 'src/Canonical.Ubuntu.SSO.Views/Properties/Settings.Designer.cs' |
1196 | --- src/Canonical.Ubuntu.SSO.Views/Properties/Settings.Designer.cs 1970-01-01 00:00:00 +0000 |
1197 | +++ src/Canonical.Ubuntu.SSO.Views/Properties/Settings.Designer.cs 2010-09-29 14:35:57 +0000 |
1198 | @@ -0,0 +1,30 @@ |
1199 | +//------------------------------------------------------------------------------ |
1200 | +// <auto-generated> |
1201 | +// This code was generated by a tool. |
1202 | +// Runtime Version:2.0.50727.4952 |
1203 | +// |
1204 | +// Changes to this file may cause incorrect behavior and will be lost if |
1205 | +// the code is regenerated. |
1206 | +// </auto-generated> |
1207 | +//------------------------------------------------------------------------------ |
1208 | + |
1209 | +namespace Canonical.Ubuntu.SSO.Views.Properties |
1210 | +{ |
1211 | + |
1212 | + |
1213 | + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] |
1214 | + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] |
1215 | + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase |
1216 | + { |
1217 | + |
1218 | + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); |
1219 | + |
1220 | + public static Settings Default |
1221 | + { |
1222 | + get |
1223 | + { |
1224 | + return defaultInstance; |
1225 | + } |
1226 | + } |
1227 | + } |
1228 | +} |
1229 | |
1230 | === added file 'src/Canonical.Ubuntu.SSO.Views/Properties/Settings.settings' |
1231 | --- src/Canonical.Ubuntu.SSO.Views/Properties/Settings.settings 1970-01-01 00:00:00 +0000 |
1232 | +++ src/Canonical.Ubuntu.SSO.Views/Properties/Settings.settings 2010-09-29 14:35:57 +0000 |
1233 | @@ -0,0 +1,7 @@ |
1234 | +<?xml version='1.0' encoding='utf-8'?> |
1235 | +<SettingsFile xmlns="uri:settings" CurrentProfile="(Default)"> |
1236 | + <Profiles> |
1237 | + <Profile Name="(Default)" /> |
1238 | + </Profiles> |
1239 | + <Settings /> |
1240 | +</SettingsFile> |
1241 | \ No newline at end of file |
1242 | |
1243 | === modified file 'src/Canonical.Ubuntu.SSO/Canonical.Ubuntu.SSO.csproj' |
1244 | --- src/Canonical.Ubuntu.SSO/Canonical.Ubuntu.SSO.csproj 2010-09-22 11:51:21 +0000 |
1245 | +++ src/Canonical.Ubuntu.SSO/Canonical.Ubuntu.SSO.csproj 2010-09-29 14:35:57 +0000 |
1246 | @@ -40,6 +40,7 @@ |
1247 | <RequiredTargetFramework>3.5</RequiredTargetFramework> |
1248 | </Reference> |
1249 | <Reference Include="System.Security" /> |
1250 | + <Reference Include="System.Web" /> |
1251 | <Reference Include="System.Xml.Linq"> |
1252 | <RequiredTargetFramework>3.5</RequiredTargetFramework> |
1253 | </Reference> |
1254 | @@ -64,6 +65,7 @@ |
1255 | <Compile Include="ISSOLoginProcessor.cs" /> |
1256 | <Compile Include="Keyring.cs" /> |
1257 | <Compile Include="LoginCredentialsEventArgs.cs" /> |
1258 | + <Compile Include="OAuthBase.cs" /> |
1259 | <Compile Include="RegistryKeyWrapper.cs" /> |
1260 | <Compile Include="Service\Account.cs" /> |
1261 | <Compile Include="Service\AccountDiff.cs" /> |
1262 | @@ -77,12 +79,15 @@ |
1263 | <Compile Include="Service\AuthenticationPage.cs" /> |
1264 | <Compile Include="Service\AuthenticationPageResource.cs" /> |
1265 | <Compile Include="Service\Authentications.cs" /> |
1266 | + <Compile Include="Service\AuthenticationsCustomized.cs" /> |
1267 | <Compile Include="Service\Captcha.cs" /> |
1268 | <Compile Include="Service\CaptchaDiff.cs" /> |
1269 | <Compile Include="Service\CaptchaFull.cs" /> |
1270 | <Compile Include="Service\CaptchaPage.cs" /> |
1271 | <Compile Include="Service\CaptchaPageResource.cs" /> |
1272 | <Compile Include="Service\Captchas.cs" /> |
1273 | + <Compile Include="Service\CaptchasCustomized.cs" /> |
1274 | + <Compile Include="Service\Constants.cs" /> |
1275 | <Compile Include="Service\EnumDescription.cs" /> |
1276 | <Compile Include="Service\HostedFile.cs" /> |
1277 | <Compile Include="Service\HttpMethodType.cs" /> |
1278 | |
1279 | === modified file 'src/Canonical.Ubuntu.SSO/DPAPIDataProtector.cs' |
1280 | --- src/Canonical.Ubuntu.SSO/DPAPIDataProtector.cs 2010-09-08 15:30:43 +0000 |
1281 | +++ src/Canonical.Ubuntu.SSO/DPAPIDataProtector.cs 2010-09-29 14:35:57 +0000 |
1282 | @@ -37,12 +37,16 @@ |
1283 | /// <param name="optionalEntropy">An additional byte array used to encrypt the data. </param> |
1284 | /// <param name="scope">One of the DataProtectionScope values.</param> |
1285 | /// <returns>A string representing the encrypted data.</returns> |
1286 | - public string Protect(string userData, byte[] optionalEntropy, DataProtectionScope scope) |
1287 | + public byte[] Protect(string userData, byte[] optionalEntropy, DataProtectionScope scope) |
1288 | { |
1289 | - var userDataBytes = Encoding.UTF8.GetBytes(userData); |
1290 | - var encryptedBytes = ProtectedData.Protect(userDataBytes, optionalEntropy, scope); |
1291 | - var enc = new UTF8Encoding(false); |
1292 | - return enc.GetString(encryptedBytes); |
1293 | + if(userData != null) |
1294 | + { |
1295 | + var userDataBytes = Encoding.UTF8.GetBytes(userData); |
1296 | + var encryptedBytes = ProtectedData.Protect(userDataBytes, optionalEntropy, scope); |
1297 | + |
1298 | + return encryptedBytes; |
1299 | + } |
1300 | + return null; |
1301 | } |
1302 | |
1303 | /// <summary> |
1304 | @@ -52,12 +56,14 @@ |
1305 | /// <param name="optionalEntropy">An additional byte array used to encrypt the data.</param> |
1306 | /// <param name="scope">One of the DataProtectionScope values. </param> |
1307 | /// <returns>A string representing the unprotected data.</returns> |
1308 | - public string Unprotect(string encryptedData, byte[] optionalEntropy, DataProtectionScope scope) |
1309 | + public string Unprotect(byte[] encryptedData, byte[] optionalEntropy, DataProtectionScope scope) |
1310 | { |
1311 | - var encryptedDataBytes = Encoding.UTF8.GetBytes(encryptedData); |
1312 | - var userDataBytes = ProtectedData.Unprotect(encryptedDataBytes, optionalEntropy, scope); |
1313 | - var enc = new UTF8Encoding(false); |
1314 | - return enc.GetString(userDataBytes); |
1315 | + if (encryptedData != null) |
1316 | + { |
1317 | + var userDataBytes = ProtectedData.Unprotect(encryptedData, optionalEntropy, scope); |
1318 | + return Encoding.UTF8.GetString(userDataBytes); |
1319 | + } |
1320 | + return null; |
1321 | } |
1322 | |
1323 | #endregion |
1324 | |
1325 | === modified file 'src/Canonical.Ubuntu.SSO/IDataProtector.cs' |
1326 | --- src/Canonical.Ubuntu.SSO/IDataProtector.cs 2010-09-08 15:30:43 +0000 |
1327 | +++ src/Canonical.Ubuntu.SSO/IDataProtector.cs 2010-09-29 14:35:57 +0000 |
1328 | @@ -33,8 +33,8 @@ |
1329 | /// <param name="userData">A string containing data to protect. </param> |
1330 | /// <param name="optionalEntropy">An additional byte array used to encrypt the data. </param> |
1331 | /// <param name="scope">One of the DataProtectionScope values.</param> |
1332 | - /// <returns>A string representing the encrypted data.</returns> |
1333 | - string Protect(string userData, byte[] optionalEntropy, DataProtectionScope scope); |
1334 | + /// <returns>A byte[] representing the encrypted data.</returns> |
1335 | + byte[] Protect(string userData, byte[] optionalEntropy, DataProtectionScope scope); |
1336 | |
1337 | /// <summary> |
1338 | /// Unprotects the encryptedData parameter and returns a string. |
1339 | @@ -43,6 +43,6 @@ |
1340 | /// <param name="optionalEntropy">An additional byte array used to encrypt the data.</param> |
1341 | /// <param name="scope">One of the DataProtectionScope values. </param> |
1342 | /// <returns>A string representing the unprotected data.</returns> |
1343 | - string Unprotect(string encryptedData, byte[] optionalEntropy, DataProtectionScope scope); |
1344 | + string Unprotect(byte[] encryptedData, byte[] optionalEntropy, DataProtectionScope scope); |
1345 | } |
1346 | } |
1347 | |
1348 | === modified file 'src/Canonical.Ubuntu.SSO/Keyring.cs' |
1349 | --- src/Canonical.Ubuntu.SSO/Keyring.cs 2010-09-13 12:20:56 +0000 |
1350 | +++ src/Canonical.Ubuntu.SSO/Keyring.cs 2010-09-29 14:35:57 +0000 |
1351 | @@ -23,6 +23,7 @@ |
1352 | using System.Text; |
1353 | using Canonical.UbuntuOne.Common.Validation; |
1354 | using log4net; |
1355 | +using Microsoft.Win32; |
1356 | |
1357 | namespace Canonical.Ubuntu.SSO |
1358 | { |
1359 | @@ -112,9 +113,22 @@ |
1360 | if (!_keyringsRootExists) |
1361 | { |
1362 | var rootKey = from key in UserRegistry.GetSubKeyNames() |
1363 | - where key == RootPath |
1364 | - select key; |
1365 | - _keyringsRootExists = rootKey.Count() == 1; |
1366 | + where key == "Canonical" |
1367 | + select key; |
1368 | + if (rootKey.Count() != 1) |
1369 | + { |
1370 | + _keyringsRootExists = false; |
1371 | + return _keyringsRootExists; |
1372 | + } |
1373 | + |
1374 | + using (var canonicalKey = UserRegistry.OpenSubKey("Canonical")) |
1375 | + { |
1376 | + rootKey = from key in canonicalKey.GetSubKeyNames() |
1377 | + where key == "Keyrings" |
1378 | + select key; |
1379 | + _keyringsRootExists = rootKey.Count() == 1; |
1380 | + } |
1381 | + |
1382 | } |
1383 | return _keyringsRootExists; |
1384 | } |
1385 | @@ -153,9 +167,9 @@ |
1386 | |
1387 | private IRegistryKey OpenKeyring(string keyring) |
1388 | { |
1389 | - using(var rootKey = UserRegistry.OpenSubKey(RootPath)) |
1390 | + using(var rootKey = UserRegistry.OpenSubKey(RootPath,RegistryKeyPermissionCheck.ReadWriteSubTree)) |
1391 | { |
1392 | - return rootKey.OpenSubKey(keyring); |
1393 | + return rootKey.OpenSubKey(keyring, RegistryKeyPermissionCheck.ReadWriteSubTree); |
1394 | } |
1395 | } |
1396 | |
1397 | @@ -173,7 +187,7 @@ |
1398 | { |
1399 | using (var keyring = OpenKeyring(keyringName)) |
1400 | { |
1401 | - var secret = keyring.GetValue(applicationName) as string; |
1402 | + var secret = keyring.GetValue(applicationName) as byte[]; |
1403 | return DataProtector.Unprotect(secret, Encoding.UTF8.GetBytes(Entropy), DataProtectionScope.CurrentUser); |
1404 | } |
1405 | } |
1406 | @@ -220,7 +234,7 @@ |
1407 | .IsNotNullOrEmpty(applicationName, "applicationName") |
1408 | .Check(); |
1409 | |
1410 | - return KeyringExist(keyringName) ? GetValue(keyringName, applicationName) : string.Empty; |
1411 | + return KeyringExist(keyringName) ? GetValue(keyringName, applicationName) : null; |
1412 | } |
1413 | |
1414 | /// <summary> |
1415 | |
1416 | === added file 'src/Canonical.Ubuntu.SSO/OAuthBase.cs' |
1417 | --- src/Canonical.Ubuntu.SSO/OAuthBase.cs 1970-01-01 00:00:00 +0000 |
1418 | +++ src/Canonical.Ubuntu.SSO/OAuthBase.cs 2010-09-29 14:35:57 +0000 |
1419 | @@ -0,0 +1,358 @@ |
1420 | +using System; |
1421 | +using System.Security.Cryptography; |
1422 | +using System.Collections.Generic; |
1423 | +using System.Text; |
1424 | +using System.Web; |
1425 | + |
1426 | +namespace OAuth |
1427 | +{ |
1428 | + public class OAuthBase |
1429 | + { |
1430 | + |
1431 | + /// <summary> |
1432 | + /// Provides a predefined set of algorithms that are supported officially by the protocol |
1433 | + /// </summary> |
1434 | + public enum SignatureTypes |
1435 | + { |
1436 | + HMACSHA1, |
1437 | + PLAINTEXT, |
1438 | + RSASHA1 |
1439 | + } |
1440 | + |
1441 | + /// <summary> |
1442 | + /// Provides an internal structure to sort the query parameter |
1443 | + /// </summary> |
1444 | + protected class QueryParameter |
1445 | + { |
1446 | + private readonly string _name = null; |
1447 | + private readonly string _value = null; |
1448 | + |
1449 | + public QueryParameter(string name, string value) |
1450 | + { |
1451 | + _name = name; |
1452 | + _value = value; |
1453 | + } |
1454 | + |
1455 | + public string Name |
1456 | + { |
1457 | + get { return _name; } |
1458 | + } |
1459 | + |
1460 | + public string Value |
1461 | + { |
1462 | + get { return _value; } |
1463 | + } |
1464 | + } |
1465 | + |
1466 | + /// <summary> |
1467 | + /// Comparer class used to perform the sorting of the query parameters |
1468 | + /// </summary> |
1469 | + protected class QueryParameterComparer : IComparer<QueryParameter> |
1470 | + { |
1471 | + |
1472 | + #region IComparer<QueryParameter> Members |
1473 | + |
1474 | + public int Compare(QueryParameter x, QueryParameter y) |
1475 | + { |
1476 | + return x.Name == y.Name ? string.Compare(x.Value, y.Value) |
1477 | + : string.Compare(x.Name, y.Name); |
1478 | + } |
1479 | + |
1480 | + #endregion |
1481 | + } |
1482 | + |
1483 | + protected const string OAuthVersion = "1.0"; |
1484 | + protected const string OAuthParameterPrefix = "oauth_"; |
1485 | + |
1486 | + // |
1487 | + // List of know and used oauth parameters' names |
1488 | + // |
1489 | + protected const string OAuthConsumerKeyKey = "oauth_consumer_key"; |
1490 | + protected const string OAuthCallbackKey = "oauth_callback"; |
1491 | + protected const string OAuthVersionKey = "oauth_version"; |
1492 | + protected const string OAuthSignatureMethodKey = "oauth_signature_method"; |
1493 | + protected const string OAuthSignatureKey = "oauth_signature"; |
1494 | + protected const string OAuthTimestampKey = "oauth_timestamp"; |
1495 | + protected const string OAuthNonceKey = "oauth_nonce"; |
1496 | + protected const string OAuthTokenKey = "oauth_token"; |
1497 | + protected const string OAuthTokenSecretKey = "oauth_token_secret"; |
1498 | + |
1499 | + protected const string HMACSHA1SignatureType = "HMAC-SHA1"; |
1500 | + protected const string PlainTextSignatureType = "PLAINTEXT"; |
1501 | + protected const string RSASHA1SignatureType = "RSA-SHA1"; |
1502 | + |
1503 | + protected Random Random = new Random(); |
1504 | + |
1505 | + protected string UnreservedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~"; |
1506 | + |
1507 | + /// <summary> |
1508 | + /// Helper function to compute a hash value |
1509 | + /// </summary> |
1510 | + /// <param name="hashAlgorithm">The hashing algoirhtm used. If that algorithm needs some initialization, like HMAC and its derivatives, they should be initialized prior to passing it to this function</param> |
1511 | + /// <param name="data">The data to hash</param> |
1512 | + /// <returns>a Base64 string of the hash value</returns> |
1513 | + private static string ComputeHash(HashAlgorithm hashAlgorithm, string data) |
1514 | + { |
1515 | + if (hashAlgorithm == null) |
1516 | + { |
1517 | + throw new ArgumentNullException("hashAlgorithm"); |
1518 | + } |
1519 | + |
1520 | + if (string.IsNullOrEmpty(data)) |
1521 | + { |
1522 | + throw new ArgumentNullException("data"); |
1523 | + } |
1524 | + |
1525 | + var dataBuffer = Encoding.ASCII.GetBytes(data); |
1526 | + var hashBytes = hashAlgorithm.ComputeHash(dataBuffer); |
1527 | + |
1528 | + return Convert.ToBase64String(hashBytes); |
1529 | + } |
1530 | + |
1531 | + /// <summary> |
1532 | + /// Internal function to cut out all non oauth query string parameters (all parameters not begining with "oauth_") |
1533 | + /// </summary> |
1534 | + /// <param name="parameters">The query string part of the Url</param> |
1535 | + /// <returns>A list of QueryParameter each containing the parameter name and value</returns> |
1536 | + private static List<QueryParameter> GetQueryParameters(string parameters) |
1537 | + { |
1538 | + if (parameters.StartsWith("?")) |
1539 | + { |
1540 | + parameters = parameters.Remove(0, 1); |
1541 | + } |
1542 | + |
1543 | + var result = new List<QueryParameter>(); |
1544 | + |
1545 | + if (!string.IsNullOrEmpty(parameters)) |
1546 | + { |
1547 | + string[] p = parameters.Split('&'); |
1548 | + foreach (string s in p) |
1549 | + { |
1550 | + if (!string.IsNullOrEmpty(s) && !s.StartsWith(OAuthParameterPrefix)) |
1551 | + { |
1552 | + if (s.IndexOf('=') > -1) |
1553 | + { |
1554 | + string[] temp = s.Split('='); |
1555 | + result.Add(new QueryParameter(temp[0], temp[1])); |
1556 | + } |
1557 | + else |
1558 | + { |
1559 | + result.Add(new QueryParameter(s, string.Empty)); |
1560 | + } |
1561 | + } |
1562 | + } |
1563 | + } |
1564 | + |
1565 | + return result; |
1566 | + } |
1567 | + |
1568 | + /// <summary> |
1569 | + /// This is a different Url Encode implementation since the default .NET one outputs the percent encoding in lower case. |
1570 | + /// While this is not a problem with the percent encoding spec, it is used in upper case throughout OAuth |
1571 | + /// </summary> |
1572 | + /// <param name="value">The value to Url encode</param> |
1573 | + /// <returns>Returns a Url encoded string</returns> |
1574 | + protected string UrlEncode(string value) |
1575 | + { |
1576 | + var result = new StringBuilder(); |
1577 | + |
1578 | + foreach (char symbol in value) |
1579 | + { |
1580 | + if (UnreservedChars.IndexOf(symbol) != -1) |
1581 | + { |
1582 | + result.Append(symbol); |
1583 | + } |
1584 | + else |
1585 | + { |
1586 | + result.Append('%' + String.Format("{0:X2}", (int)symbol)); |
1587 | + } |
1588 | + } |
1589 | + |
1590 | + return result.ToString(); |
1591 | + } |
1592 | + |
1593 | + /// <summary> |
1594 | + /// Normalizes the request parameters according to the spec |
1595 | + /// </summary> |
1596 | + /// <param name="parameters">The list of parameters already sorted</param> |
1597 | + /// <returns>a string representing the normalized parameters</returns> |
1598 | + protected string NormalizeRequestParameters(IList<QueryParameter> parameters) |
1599 | + { |
1600 | + var sb = new StringBuilder(); |
1601 | + QueryParameter p; |
1602 | + for (var i = 0; i < parameters.Count; i++) |
1603 | + { |
1604 | + p = parameters[i]; |
1605 | + sb.AppendFormat("{0}={1}", p.Name, p.Value); |
1606 | + |
1607 | + if (i < parameters.Count - 1) |
1608 | + { |
1609 | + sb.Append("&"); |
1610 | + } |
1611 | + } |
1612 | + |
1613 | + return sb.ToString(); |
1614 | + } |
1615 | + |
1616 | + /// <summary> |
1617 | + /// Generate the signature base that is used to produce the signature |
1618 | + /// </summary> |
1619 | + /// <param name="url">The full url that needs to be signed including its non OAuth url parameters</param> |
1620 | + /// <param name="consumerKey">The consumer key</param> |
1621 | + /// <param name="token">The token, if available. If not available pass null or an empty string</param> |
1622 | + /// <param name="tokenSecret">The token secret, if available. If not available pass null or an empty string</param> |
1623 | + /// <param name="httpMethod">The http method used. Must be a valid HTTP method verb (POST,GET,PUT, etc)</param> |
1624 | + /// <param name="nonce"></param> |
1625 | + /// <param name="signatureType">The signature type. To use the default values use <see cref="OAuthBase.SignatureTypes">OAuthBase.SignatureTypes</see>.</param> |
1626 | + /// <param name="timeStamp"></param> |
1627 | + /// <param name="normalizedUrl"></param> |
1628 | + /// <param name="normalizedRequestParameters"></param> |
1629 | + /// <returns>The signature base</returns> |
1630 | + public string GenerateSignatureBase(Uri url, string consumerKey, string token, string tokenSecret, string httpMethod, string timeStamp, string nonce, string signatureType, out string normalizedUrl, out string normalizedRequestParameters) |
1631 | + { |
1632 | + if (token == null) |
1633 | + { |
1634 | + token = string.Empty; |
1635 | + } |
1636 | + |
1637 | + if (tokenSecret == null) |
1638 | + { |
1639 | + tokenSecret = string.Empty; |
1640 | + } |
1641 | + |
1642 | + if (string.IsNullOrEmpty(consumerKey)) |
1643 | + { |
1644 | + throw new ArgumentNullException("consumerKey"); |
1645 | + } |
1646 | + |
1647 | + if (string.IsNullOrEmpty(httpMethod)) |
1648 | + { |
1649 | + throw new ArgumentNullException("httpMethod"); |
1650 | + } |
1651 | + |
1652 | + if (string.IsNullOrEmpty(signatureType)) |
1653 | + { |
1654 | + throw new ArgumentNullException("signatureType"); |
1655 | + } |
1656 | + |
1657 | + List<QueryParameter> parameters = GetQueryParameters(url.Query); |
1658 | + parameters.Add(new QueryParameter(OAuthVersionKey, OAuthVersion)); |
1659 | + parameters.Add(new QueryParameter(OAuthNonceKey, nonce)); |
1660 | + parameters.Add(new QueryParameter(OAuthTimestampKey, timeStamp)); |
1661 | + parameters.Add(new QueryParameter(OAuthSignatureMethodKey, signatureType)); |
1662 | + parameters.Add(new QueryParameter(OAuthConsumerKeyKey, consumerKey)); |
1663 | + |
1664 | + if (!string.IsNullOrEmpty(token)) |
1665 | + { |
1666 | + parameters.Add(new QueryParameter(OAuthTokenKey, token)); |
1667 | + } |
1668 | + |
1669 | + parameters.Sort(new QueryParameterComparer()); |
1670 | + |
1671 | + normalizedUrl = string.Format("{0}://{1}", url.Scheme, url.Host); |
1672 | + if (!((url.Scheme == "http" && url.Port == 80) || (url.Scheme == "https" && url.Port == 443))) |
1673 | + { |
1674 | + normalizedUrl += ":" + url.Port; |
1675 | + } |
1676 | + normalizedUrl += url.AbsolutePath; |
1677 | + normalizedRequestParameters = NormalizeRequestParameters(parameters); |
1678 | + |
1679 | + var signatureBase = new StringBuilder(); |
1680 | + signatureBase.AppendFormat("{0}&", httpMethod.ToUpper()); |
1681 | + signatureBase.AppendFormat("{0}&", UrlEncode(normalizedUrl)); |
1682 | + signatureBase.AppendFormat("{0}", UrlEncode(normalizedRequestParameters)); |
1683 | + |
1684 | + return signatureBase.ToString(); |
1685 | + } |
1686 | + |
1687 | + /// <summary> |
1688 | + /// Generate the signature value based on the given signature base and hash algorithm |
1689 | + /// </summary> |
1690 | + /// <param name="signatureBase">The signature based as produced by the GenerateSignatureBase method or by any other means</param> |
1691 | + /// <param name="hash">The hash algorithm used to perform the hashing. If the hashing algorithm requires initialization or a key it should be set prior to calling this method</param> |
1692 | + /// <returns>A base64 string of the hash value</returns> |
1693 | + public string GenerateSignatureUsingHash(string signatureBase, HashAlgorithm hash) |
1694 | + { |
1695 | + return ComputeHash(hash, signatureBase); |
1696 | + } |
1697 | + |
1698 | + /// <summary> |
1699 | + /// Generates a signature using the HMAC-SHA1 algorithm |
1700 | + /// </summary> |
1701 | + /// <param name="url">The full url that needs to be signed including its non OAuth url parameters</param> |
1702 | + /// <param name="consumerKey">The consumer key</param> |
1703 | + /// <param name="consumerSecret">The consumer seceret</param> |
1704 | + /// <param name="token">The token, if available. If not available pass null or an empty string</param> |
1705 | + /// <param name="tokenSecret">The token secret, if available. If not available pass null or an empty string</param> |
1706 | + /// <param name="httpMethod">The http method used. Must be a valid HTTP method verb (POST,GET,PUT, etc)</param> |
1707 | + /// <param name="timeStamp"></param> |
1708 | + /// <param name="nonce"></param> |
1709 | + /// <param name="normalizedUrl"></param> |
1710 | + /// <param name="normalizedRequestParameters"></param> |
1711 | + /// <returns>A base64 string of the hash value</returns> |
1712 | + public string GenerateSignature(Uri url, string consumerKey, string consumerSecret, string token, string tokenSecret, string httpMethod, string timeStamp, string nonce, out string normalizedUrl, out string normalizedRequestParameters) |
1713 | + { |
1714 | + return GenerateSignature(url, consumerKey, consumerSecret, token, tokenSecret, httpMethod, timeStamp, nonce, SignatureTypes.HMACSHA1, out normalizedUrl, out normalizedRequestParameters); |
1715 | + } |
1716 | + |
1717 | + /// <summary> |
1718 | + /// Generates a signature using the specified signatureType |
1719 | + /// </summary> |
1720 | + /// <param name="url">The full url that needs to be signed including its non OAuth url parameters</param> |
1721 | + /// <param name="consumerKey">The consumer key</param> |
1722 | + /// <param name="consumerSecret">The consumer seceret</param> |
1723 | + /// <param name="token">The token, if available. If not available pass null or an empty string</param> |
1724 | + /// <param name="tokenSecret">The token secret, if available. If not available pass null or an empty string</param> |
1725 | + /// <param name="httpMethod">The http method used. Must be a valid HTTP method verb (POST,GET,PUT, etc)</param> |
1726 | + /// <param name="nonce"></param> |
1727 | + /// <param name="signatureType">The type of signature to use</param> |
1728 | + /// <param name="timeStamp"></param> |
1729 | + /// <param name="normalizedUrl"></param> |
1730 | + /// <param name="normalizedRequestParameters"></param> |
1731 | + /// <returns>A base64 string of the hash value</returns> |
1732 | + public string GenerateSignature(Uri url, string consumerKey, string consumerSecret, string token, string tokenSecret, string httpMethod, string timeStamp, string nonce, SignatureTypes signatureType, out string normalizedUrl, out string normalizedRequestParameters) |
1733 | + { |
1734 | + normalizedUrl = null; |
1735 | + normalizedRequestParameters = null; |
1736 | + |
1737 | + switch (signatureType) |
1738 | + { |
1739 | + case SignatureTypes.PLAINTEXT: |
1740 | + return HttpUtility.UrlEncode(string.Format("{0}&{1}", consumerSecret, tokenSecret)); |
1741 | + case SignatureTypes.HMACSHA1: |
1742 | + var signatureBase = GenerateSignatureBase(url, consumerKey, token, tokenSecret, httpMethod, timeStamp, nonce, HMACSHA1SignatureType, out normalizedUrl, out normalizedRequestParameters); |
1743 | + |
1744 | + var hmacsha1 = new HMACSHA1(); |
1745 | + hmacsha1.Key = Encoding.ASCII.GetBytes(string.Format("{0}&{1}", UrlEncode(consumerSecret), string.IsNullOrEmpty(tokenSecret) ? "" : UrlEncode(tokenSecret))); |
1746 | + |
1747 | + return GenerateSignatureUsingHash(signatureBase, hmacsha1); |
1748 | + case SignatureTypes.RSASHA1: |
1749 | + throw new NotImplementedException(); |
1750 | + default: |
1751 | + throw new ArgumentException("Unknown signature type", "signatureType"); |
1752 | + } |
1753 | + } |
1754 | + |
1755 | + /// <summary> |
1756 | + /// Generate the timestamp for the signature |
1757 | + /// </summary> |
1758 | + /// <returns></returns> |
1759 | + public virtual string GenerateTimeStamp() |
1760 | + { |
1761 | + // Default implementation of UNIX time of the current UTC time |
1762 | + TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0); |
1763 | + return Convert.ToInt64(ts.TotalSeconds).ToString(); |
1764 | + } |
1765 | + |
1766 | + /// <summary> |
1767 | + /// Generate a nonce |
1768 | + /// </summary> |
1769 | + /// <returns></returns> |
1770 | + public virtual string GenerateNonce() |
1771 | + { |
1772 | + // Just a simple implementation of a random number between 123400 and 9999999 |
1773 | + return Random.Next(123400, 9999999).ToString(); |
1774 | + } |
1775 | + |
1776 | + } |
1777 | +} |
1778 | \ No newline at end of file |
1779 | |
1780 | === modified file 'src/Canonical.Ubuntu.SSO/RegistryKeyWrapper.cs' |
1781 | --- src/Canonical.Ubuntu.SSO/RegistryKeyWrapper.cs 2010-09-08 15:29:50 +0000 |
1782 | +++ src/Canonical.Ubuntu.SSO/RegistryKeyWrapper.cs 2010-09-29 14:35:57 +0000 |
1783 | @@ -41,7 +41,7 @@ |
1784 | /// Creates a new registry key that contains information about the default user configuration. |
1785 | /// </summary> |
1786 | public RegistryKeyWrapper() |
1787 | - : this(Registry.Users) |
1788 | + : this(Registry.CurrentUser) |
1789 | { |
1790 | |
1791 | } |
1792 | |
1793 | === modified file 'src/Canonical.Ubuntu.SSO/SSOCredentialsProvider.cs' |
1794 | --- src/Canonical.Ubuntu.SSO/SSOCredentialsProvider.cs 2010-09-09 09:11:07 +0000 |
1795 | +++ src/Canonical.Ubuntu.SSO/SSOCredentialsProvider.cs 2010-09-29 14:35:57 +0000 |
1796 | @@ -18,6 +18,7 @@ |
1797 | * Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
1798 | */ |
1799 | using System; |
1800 | +using System.Collections.Generic; |
1801 | |
1802 | namespace Canonical.Ubuntu.SSO |
1803 | { |
1804 | @@ -27,6 +28,14 @@ |
1805 | /// </summary> |
1806 | public class SSOCredentialsProvider : ISSOCredentialsProvider |
1807 | { |
1808 | + #region DI properties |
1809 | + |
1810 | + public ILoginView LoginView { get; set; } |
1811 | + |
1812 | + public IKeyring Keyring { get; set; } |
1813 | + |
1814 | + #endregion |
1815 | + |
1816 | #region Implementation of ISSOCredentialsProvider |
1817 | |
1818 | public event EventHandler<CredentialsFoundEventArgs> OnCredentialsFound; |
1819 | @@ -45,7 +54,8 @@ |
1820 | /// </summary> |
1821 | public void LoginToGetCredentials() |
1822 | { |
1823 | - throw new NotImplementedException(); |
1824 | + // try to get the credentials from the keyring |
1825 | + |
1826 | } |
1827 | |
1828 | /// <summary> |
1829 | @@ -60,7 +70,6 @@ |
1830 | /// </summary> |
1831 | public void LoginOrRegisterToGetCredentials() |
1832 | { |
1833 | - throw new NotImplementedException(); |
1834 | } |
1835 | |
1836 | #endregion |
1837 | |
1838 | === modified file 'src/Canonical.Ubuntu.SSO/Service/Authentications.cs' |
1839 | --- src/Canonical.Ubuntu.SSO/Service/Authentications.cs 2010-09-22 11:51:21 +0000 |
1840 | +++ src/Canonical.Ubuntu.SSO/Service/Authentications.cs 2010-09-29 14:35:57 +0000 |
1841 | @@ -50,13 +50,13 @@ |
1842 | } |
1843 | |
1844 | /// <param name="token_name">Token name.</param> |
1845 | - public void Authenticate(string token_name) |
1846 | + public string Authenticate(string username, string password, string token_name) |
1847 | { |
1848 | Dictionary<string,string> keyValue = new Dictionary<string, string>(); |
1849 | keyValue.Add("ws.op", "authenticate"); |
1850 | keyValue.Add("token_name", token_name); |
1851 | string serializedData = _customizeInterface.Serialize(HttpMethodType.GET, keyValue); |
1852 | - string fetchedData = _customizeInterface.Fetch(HttpMethodType.GET, this._uri, this._httpHeaders, serializedData); |
1853 | + return _customizeInterface.Fetch(username, password, HttpMethodType.GET, this._uri, this._httpHeaders, serializedData); |
1854 | } |
1855 | |
1856 | /// <param name="team_names">List of team names to check</param> |
1857 | |
1858 | === added file 'src/Canonical.Ubuntu.SSO/Service/AuthenticationsCustomized.cs' |
1859 | --- src/Canonical.Ubuntu.SSO/Service/AuthenticationsCustomized.cs 1970-01-01 00:00:00 +0000 |
1860 | +++ src/Canonical.Ubuntu.SSO/Service/AuthenticationsCustomized.cs 2010-09-29 14:35:57 +0000 |
1861 | @@ -0,0 +1,235 @@ |
1862 | +/* |
1863 | + * Copyright 2010 Canonical Ltd. |
1864 | + * |
1865 | + * This file is part of UbuntuOne on Windows. |
1866 | + * |
1867 | + * UbuntuOne on Windows is free software: you can redistribute it and/or modify |
1868 | + * it under the terms of the GNU Lesser General Public License version |
1869 | + * as published by the Free Software Foundation. |
1870 | + * |
1871 | + * Ubuntu One on Windows is distributed in the hope that it will be useful, |
1872 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1873 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1874 | + * GNU Lesser General Public License for more details. |
1875 | + * |
1876 | + * You should have received a copy of the GNU Lesser General Public License |
1877 | + * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>. |
1878 | + * |
1879 | + * Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
1880 | + */ |
1881 | +using System; |
1882 | +using System.Collections.Generic; |
1883 | +using System.IO; |
1884 | +using System.Net; |
1885 | +using System.Text; |
1886 | + |
1887 | +namespace Canonical.Ubuntu.SSO.Service |
1888 | +{ |
1889 | + public partial class Authentications |
1890 | + { |
1891 | + private class AuthenticationsCustomizer : ICustomize |
1892 | + { |
1893 | + #region Implementation of ICustomize |
1894 | + |
1895 | + public T Parse<T>(string rawString) |
1896 | + { |
1897 | + throw new NotImplementedException(); |
1898 | + } |
1899 | + |
1900 | + public string Fetch(HttpMethodType methodType, string uri, Dictionary<string, string> httpHeadersParam, string dataParam) |
1901 | + { |
1902 | + var fetchedData = string.Empty; |
1903 | + |
1904 | + string uriData = string.Format("{0}/authentications", uri); |
1905 | + switch (methodType) |
1906 | + { |
1907 | + |
1908 | + case HttpMethodType.GET: |
1909 | + uriData = uriData + string.Format("?{0}", dataParam); |
1910 | + var getRequest = (HttpWebRequest)WebRequest.Create(uriData); |
1911 | + getRequest.Method = "GET"; |
1912 | + getRequest.ContentType = "application/x-www-form-urlencoded"; |
1913 | + getRequest.Accept = "application/json"; |
1914 | + var getResponse = (HttpWebResponse)getRequest.GetResponse(); |
1915 | + var getResponseReader = new StreamReader(getResponse.GetResponseStream()); |
1916 | + fetchedData = getResponseReader.ReadToEnd(); |
1917 | + break; |
1918 | + |
1919 | + |
1920 | + case HttpMethodType.POST: |
1921 | + var request = (HttpWebRequest)WebRequest.Create(uriData); |
1922 | + request.Method = "POST"; |
1923 | + request.ContentType = "application/x-www-form-urlencoded"; |
1924 | + request.Accept = "application/json"; |
1925 | + using (var stream = request.GetRequestStream()) |
1926 | + { |
1927 | + var data = Encoding.ASCII.GetBytes(dataParam); |
1928 | + stream.Write(data, 0, data.Length); |
1929 | + stream.Close(); |
1930 | + } |
1931 | + |
1932 | + var response = (HttpWebResponse)request.GetResponse(); |
1933 | + var responseReader = new StreamReader(response.GetResponseStream()); |
1934 | + var responseData = responseReader.ReadToEnd(); |
1935 | + |
1936 | + break; |
1937 | + |
1938 | + case HttpMethodType.PUT: |
1939 | + break; |
1940 | + |
1941 | + case HttpMethodType.PATCH: |
1942 | + break; |
1943 | + |
1944 | + case HttpMethodType.DELETE: |
1945 | + break; |
1946 | + |
1947 | + } |
1948 | + |
1949 | + |
1950 | + return fetchedData; |
1951 | + } |
1952 | + |
1953 | + public string Fetch(string username, string password, HttpMethodType methodType, string uri, Dictionary<string, string> httpHeadersParam, string dataParam) |
1954 | + { |
1955 | + var fetchedData = string.Empty; |
1956 | + |
1957 | + string uriData = string.Format("{0}/authentications", uri); |
1958 | + switch (methodType) |
1959 | + { |
1960 | + |
1961 | + case HttpMethodType.GET: |
1962 | + uriData = uriData + string.Format("?{0}", dataParam); |
1963 | + var getRequest = (HttpWebRequest)WebRequest.Create(uriData); |
1964 | + getRequest.Method = "GET"; |
1965 | + getRequest.ContentType = "application/x-www-form-urlencoded"; |
1966 | + getRequest.Accept = "application/json"; |
1967 | + getRequest.Headers.Add("Authorization", "Basic " + |
1968 | + Convert.ToBase64String( |
1969 | + Encoding.ASCII.GetBytes(string.Format("{0}:{1}", username, password)))); |
1970 | + var getResponse = (HttpWebResponse)getRequest.GetResponse(); |
1971 | + var getResponseReader = new StreamReader(getResponse.GetResponseStream()); |
1972 | + fetchedData = getResponseReader.ReadToEnd(); |
1973 | + break; |
1974 | + |
1975 | + |
1976 | + case HttpMethodType.POST: |
1977 | + var request = (HttpWebRequest)WebRequest.Create(uriData); |
1978 | + request.Method = "POST"; |
1979 | + request.ContentType = "application/x-www-form-urlencoded"; |
1980 | + request.Accept = "application/json"; |
1981 | + using (var stream = request.GetRequestStream()) |
1982 | + { |
1983 | + var data = Encoding.ASCII.GetBytes(dataParam); |
1984 | + stream.Write(data, 0, data.Length); |
1985 | + stream.Close(); |
1986 | + } |
1987 | + |
1988 | + var response = (HttpWebResponse)request.GetResponse(); |
1989 | + var responseReader = new StreamReader(response.GetResponseStream()); |
1990 | + var responseData = responseReader.ReadToEnd(); |
1991 | + |
1992 | + break; |
1993 | + |
1994 | + case HttpMethodType.PUT: |
1995 | + break; |
1996 | + |
1997 | + case HttpMethodType.PATCH: |
1998 | + break; |
1999 | + |
2000 | + case HttpMethodType.DELETE: |
2001 | + break; |
2002 | + |
2003 | + } |
2004 | + |
2005 | + |
2006 | + return fetchedData; |
2007 | + } |
2008 | + |
2009 | + public string Serialize(HttpMethodType methodType, Dictionary<string, string> keyvalues) |
2010 | + { |
2011 | + string serializedString = string.Empty; |
2012 | + |
2013 | + |
2014 | + switch (methodType) |
2015 | + { |
2016 | + |
2017 | + case HttpMethodType.GET: |
2018 | + |
2019 | + case HttpMethodType.POST: |
2020 | + |
2021 | + serializedString = CreateUrlString(keyvalues); |
2022 | + |
2023 | + break; |
2024 | + |
2025 | + |
2026 | + case HttpMethodType.PATCH: |
2027 | + |
2028 | + case HttpMethodType.PUT: |
2029 | + |
2030 | + serializedString = CreateJsonString(keyvalues); |
2031 | + |
2032 | + break; |
2033 | + |
2034 | + } |
2035 | + |
2036 | + |
2037 | + return serializedString; |
2038 | + } |
2039 | + |
2040 | + private static string CreateUrlString(Dictionary<string, string> keyvalues) |
2041 | + { |
2042 | + |
2043 | + List<string> keyValue = new List<string>(); |
2044 | + |
2045 | + |
2046 | + foreach (KeyValuePair<string, string> pair in keyvalues) |
2047 | + { |
2048 | + |
2049 | + string pairedData = string.Format("{0}={1}", pair.Key, pair.Value); |
2050 | + |
2051 | + keyValue.Add(pairedData); |
2052 | + |
2053 | + } |
2054 | + |
2055 | + |
2056 | + return string.Join("&", keyValue.ToArray()); |
2057 | + |
2058 | + } |
2059 | + |
2060 | + |
2061 | + private static string CreateJsonString(Dictionary<string, string> keyvalues) |
2062 | + { |
2063 | + |
2064 | + List<string> keyValue = new List<string>(); |
2065 | + |
2066 | + |
2067 | + foreach (KeyValuePair<string, string> pair in keyvalues) |
2068 | + { |
2069 | + |
2070 | + string pairedData = string.Format("\"{0}\":\"{1}\"", pair.Key, pair.Value); |
2071 | + |
2072 | + keyValue.Add(pairedData); |
2073 | + |
2074 | + } |
2075 | + |
2076 | + |
2077 | + string jsonBody = string.Join(",", keyValue.ToArray()); |
2078 | + |
2079 | + |
2080 | + return "{" + jsonBody + "}"; |
2081 | + |
2082 | + } |
2083 | + |
2084 | + #endregion |
2085 | + } |
2086 | + |
2087 | + /// <summary> |
2088 | + /// Basic constructor that will init the data of the object to be used with the Ubuntu SSO servers |
2089 | + /// </summary> |
2090 | + public Authentications() |
2091 | + : this(Constants.ServiceUrl, new Dictionary<string, string>(), new AuthenticationsCustomizer()) |
2092 | + { |
2093 | + |
2094 | + } |
2095 | + } |
2096 | +} |
2097 | |
2098 | === added file 'src/Canonical.Ubuntu.SSO/Service/CaptchasCustomized.cs' |
2099 | --- src/Canonical.Ubuntu.SSO/Service/CaptchasCustomized.cs 1970-01-01 00:00:00 +0000 |
2100 | +++ src/Canonical.Ubuntu.SSO/Service/CaptchasCustomized.cs 2010-09-29 14:35:57 +0000 |
2101 | @@ -0,0 +1,190 @@ |
2102 | +/* |
2103 | + * Copyright 2010 Canonical Ltd. |
2104 | + * |
2105 | + * This file is part of UbuntuOne on Windows. |
2106 | + * |
2107 | + * UbuntuOne on Windows is free software: you can redistribute it and/or modify |
2108 | + * it under the terms of the GNU Lesser General Public License version |
2109 | + * as published by the Free Software Foundation. |
2110 | + * |
2111 | + * Ubuntu One on Windows is distributed in the hope that it will be useful, |
2112 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
2113 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2114 | + * GNU Lesser General Public License for more details. |
2115 | + * |
2116 | + * You should have received a copy of the GNU Lesser General Public License |
2117 | + * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>. |
2118 | + * |
2119 | + * Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
2120 | + */ |
2121 | +using System; |
2122 | +using System.Collections.Generic; |
2123 | +using System.IO; |
2124 | +using System.Net; |
2125 | +using System.Text; |
2126 | + |
2127 | +namespace Canonical.Ubuntu.SSO.Service |
2128 | +{ |
2129 | + /// <summary> |
2130 | + /// Provides the methods that will allow to fetch the needed data from the Ubuntu SSO |
2131 | + /// service regarding the captchas. |
2132 | + /// </summary> |
2133 | + public partial class Captchas |
2134 | + { |
2135 | + private class CaptchasCustomizer : ICustomize |
2136 | + { |
2137 | + #region Implementation of ICustomize |
2138 | + |
2139 | + public T Parse<T>(string rawString) |
2140 | + { |
2141 | + throw new NotImplementedException(); |
2142 | + } |
2143 | + |
2144 | + public string Fetch(HttpMethodType methodType, string uri, Dictionary<string, string> httpHeadersParam, string dataParam) |
2145 | + { |
2146 | + var fetchedData = string.Empty; |
2147 | + |
2148 | + string uriData = string.Format("{0}/captchas", uri); |
2149 | + switch (methodType) |
2150 | + { |
2151 | + |
2152 | + case HttpMethodType.GET: |
2153 | + |
2154 | + using (var client = new WebClient()) |
2155 | + { |
2156 | + client.Headers.Add("Accept", "application/json"); |
2157 | + foreach (var pair in httpHeadersParam) |
2158 | + { |
2159 | + client.Headers.Add(pair.Key, pair.Value); |
2160 | + fetchedData = client.DownloadString(uriData); |
2161 | + } |
2162 | + } |
2163 | + break; |
2164 | + |
2165 | + |
2166 | + case HttpMethodType.POST: |
2167 | + HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriData); |
2168 | + request.Method = "POST"; |
2169 | + request.ContentType = "application/x-www-form-urlencoded"; |
2170 | + request.Accept = "application/json"; |
2171 | + using(var stream = request.GetRequestStream()) |
2172 | + { |
2173 | + var data = Encoding.ASCII.GetBytes(dataParam); |
2174 | + stream.Write(data, 0, data.Length); |
2175 | + stream.Close(); |
2176 | + } |
2177 | + |
2178 | + var response = (HttpWebResponse)request.GetResponse(); |
2179 | + var responseReader = new StreamReader(response.GetResponseStream()); |
2180 | + var responseData = responseReader.ReadToEnd(); |
2181 | + |
2182 | + break; |
2183 | + |
2184 | + case HttpMethodType.PUT: |
2185 | + break; |
2186 | + |
2187 | + case HttpMethodType.PATCH: |
2188 | + break; |
2189 | + |
2190 | + case HttpMethodType.DELETE: |
2191 | + break; |
2192 | + |
2193 | + } |
2194 | + |
2195 | + |
2196 | + return fetchedData; |
2197 | + } |
2198 | + |
2199 | + public string Fetch(string username, string password, HttpMethodType methodType, string uri, Dictionary<string, string> httpHeadersParam, string dataParam) |
2200 | + { |
2201 | + throw new NotImplementedException(); |
2202 | + } |
2203 | + |
2204 | + public string Serialize(HttpMethodType methodType, Dictionary<string, string> keyvalues) |
2205 | + { |
2206 | + string serializedString = string.Empty; |
2207 | + |
2208 | + |
2209 | + switch (methodType) |
2210 | + { |
2211 | + |
2212 | + case HttpMethodType.GET: |
2213 | + |
2214 | + case HttpMethodType.POST: |
2215 | + |
2216 | + serializedString = CreateUrlString(keyvalues); |
2217 | + |
2218 | + break; |
2219 | + |
2220 | + |
2221 | + case HttpMethodType.PATCH: |
2222 | + |
2223 | + case HttpMethodType.PUT: |
2224 | + |
2225 | + serializedString = CreateJsonString(keyvalues); |
2226 | + |
2227 | + break; |
2228 | + |
2229 | + } |
2230 | + |
2231 | + |
2232 | + return serializedString; |
2233 | + } |
2234 | + |
2235 | + private static string CreateUrlString(Dictionary<string, string> keyvalues) |
2236 | + { |
2237 | + |
2238 | + List<string> keyValue = new List<string>(); |
2239 | + |
2240 | + |
2241 | + foreach (KeyValuePair<string, string> pair in keyvalues) |
2242 | + { |
2243 | + |
2244 | + string pairedData = string.Format("{0}={1}", pair.Key, pair.Value); |
2245 | + |
2246 | + keyValue.Add(pairedData); |
2247 | + |
2248 | + } |
2249 | + |
2250 | + |
2251 | + return string.Join("&", keyValue.ToArray()); |
2252 | + |
2253 | + } |
2254 | + |
2255 | + |
2256 | + private static string CreateJsonString(Dictionary<string, string> keyvalues) |
2257 | + { |
2258 | + |
2259 | + List<string> keyValue = new List<string>(); |
2260 | + |
2261 | + |
2262 | + foreach (KeyValuePair<string, string> pair in keyvalues) |
2263 | + { |
2264 | + |
2265 | + string pairedData = string.Format("\"{0}\":\"{1}\"", pair.Key, pair.Value); |
2266 | + |
2267 | + keyValue.Add(pairedData); |
2268 | + |
2269 | + } |
2270 | + |
2271 | + |
2272 | + string jsonBody = string.Join(",", keyValue.ToArray()); |
2273 | + |
2274 | + |
2275 | + return "{" + jsonBody + "}"; |
2276 | + |
2277 | + } |
2278 | + |
2279 | + #endregion |
2280 | + } |
2281 | + |
2282 | + /// <summary> |
2283 | + /// Basic constructor that will init the data of the object to be used with the Ubuntu SSO servers |
2284 | + /// </summary> |
2285 | + public Captchas() |
2286 | + : this(Constants.ServiceUrl, new Dictionary<string, string>(), new CaptchasCustomizer()) |
2287 | + { |
2288 | + |
2289 | + } |
2290 | + } |
2291 | +} |
2292 | |
2293 | === added file 'src/Canonical.Ubuntu.SSO/Service/Constants.cs' |
2294 | --- src/Canonical.Ubuntu.SSO/Service/Constants.cs 1970-01-01 00:00:00 +0000 |
2295 | +++ src/Canonical.Ubuntu.SSO/Service/Constants.cs 2010-09-29 14:35:57 +0000 |
2296 | @@ -0,0 +1,30 @@ |
2297 | +/* |
2298 | + * Copyright 2010 Canonical Ltd. |
2299 | + * |
2300 | + * This file is part of UbuntuOne on Windows. |
2301 | + * |
2302 | + * UbuntuOne on Windows is free software: you can redistribute it and/or modify |
2303 | + * it under the terms of the GNU Lesser General Public License version |
2304 | + * as published by the Free Software Foundation. |
2305 | + * |
2306 | + * Ubuntu One on Windows is distributed in the hope that it will be useful, |
2307 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
2308 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
2309 | + * GNU Lesser General Public License for more details. |
2310 | + * |
2311 | + * You should have received a copy of the GNU Lesser General Public License |
2312 | + * along with UbuntuOne for Windows. If not, see <http://www.gnu.org/licenses/>. |
2313 | + * |
2314 | + * Authors: Manuel de la Peña <manuel.delapena@canonical.com> |
2315 | + */ |
2316 | +namespace Canonical.Ubuntu.SSO.Service |
2317 | +{ |
2318 | + /// <summary> |
2319 | + /// Class that contains a number of contants that are used with the SSO service. |
2320 | + /// </summary> |
2321 | + public static class Constants |
2322 | + { |
2323 | + public static string PingUrl = "https://edge.one.ubuntu.com/oauth/sso-finished-so-get-tokens/"; |
2324 | + public static string ServiceUrl = "https://login.ubuntu.com/api/1.0"; |
2325 | + } |
2326 | +} |
2327 | |
2328 | === modified file 'src/Canonical.Ubuntu.SSO/Service/ICustomize.cs' |
2329 | --- src/Canonical.Ubuntu.SSO/Service/ICustomize.cs 2010-09-22 11:51:21 +0000 |
2330 | +++ src/Canonical.Ubuntu.SSO/Service/ICustomize.cs 2010-09-29 14:35:57 +0000 |
2331 | @@ -23,7 +23,8 @@ |
2332 | ; |
2333 | |
2334 | string Fetch(HttpMethodType methodType, string uri, System.Collections.Generic.Dictionary<string, string> httpHeadersParam, string dataParam); |
2335 | - |
2336 | + |
2337 | + string Fetch(string username, string password, HttpMethodType methodType, string uri, System.Collections.Generic.Dictionary<string, string> httpHeadersParam, string dataParam); |
2338 | string Serialize(HttpMethodType methodType, Dictionary<string, string> keyvalues); |
2339 | } |
2340 | } |
2341 | |
2342 | === modified file 'src/Canonical.UbuntuOne.Client/Canonical.UbuntuOne.Client.csproj' |
2343 | --- src/Canonical.UbuntuOne.Client/Canonical.UbuntuOne.Client.csproj 2010-08-30 17:30:31 +0000 |
2344 | +++ src/Canonical.UbuntuOne.Client/Canonical.UbuntuOne.Client.csproj 2010-09-29 14:35:57 +0000 |
2345 | @@ -55,6 +55,14 @@ |
2346 | <Compile Include="SyncDaemonClient.cs" /> |
2347 | </ItemGroup> |
2348 | <ItemGroup> |
2349 | + <ProjectReference Include="..\Canonical.Ubuntu.SSO.Views\Canonical.Ubuntu.SSO.Views.csproj"> |
2350 | + <Project>{33187F40-201E-4429-B299-E582CF114E28}</Project> |
2351 | + <Name>Canonical.Ubuntu.SSO.Views</Name> |
2352 | + </ProjectReference> |
2353 | + <ProjectReference Include="..\Canonical.Ubuntu.SSO\Canonical.Ubuntu.SSO.csproj"> |
2354 | + <Project>{9460A771-2589-45DA-9618-9FE8BB7D16E8}</Project> |
2355 | + <Name>Canonical.Ubuntu.SSO</Name> |
2356 | + </ProjectReference> |
2357 | <ProjectReference Include="..\Canonical.UbuntuOne.Common\Canonical.UbuntuOne.Common.csproj"> |
2358 | <Project>{11353FF8-8E5A-488E-9CB1-873DADD232B9}</Project> |
2359 | <Name>Canonical.UbuntuOne.Common</Name> |
2360 | @@ -65,11 +73,19 @@ |
2361 | <SpecificVersion>False</SpecificVersion> |
2362 | <HintPath>..\..\lib\log4net\log4net.dll</HintPath> |
2363 | </Reference> |
2364 | + <Reference Include="Newtonsoft.Json, Version=3.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL"> |
2365 | + <SpecificVersion>False</SpecificVersion> |
2366 | + <HintPath>..\..\lib\JsonNet\Newtonsoft.Json.dll</HintPath> |
2367 | + </Reference> |
2368 | + <Reference Include="PresentationCore"> |
2369 | + <RequiredTargetFramework>3.0</RequiredTargetFramework> |
2370 | + </Reference> |
2371 | <Reference Include="PresentationFramework"> |
2372 | <RequiredTargetFramework>3.0</RequiredTargetFramework> |
2373 | </Reference> |
2374 | <Reference Include="System" /> |
2375 | <Reference Include="System.Data" /> |
2376 | + <Reference Include="System.Web" /> |
2377 | <Reference Include="System.Xml" /> |
2378 | <Reference Include="WindowsBase"> |
2379 | <RequiredTargetFramework>3.0</RequiredTargetFramework> |
2380 | |
2381 | === modified file 'src/Canonical.UbuntuOne.Client/Notification/NotificationIconPresenter.cs' |
2382 | --- src/Canonical.UbuntuOne.Client/Notification/NotificationIconPresenter.cs 2010-09-02 09:44:10 +0000 |
2383 | +++ src/Canonical.UbuntuOne.Client/Notification/NotificationIconPresenter.cs 2010-09-29 14:35:57 +0000 |
2384 | @@ -18,10 +18,20 @@ |
2385 | using System; |
2386 | using System.Diagnostics; |
2387 | using System.IO; |
2388 | +using System.Net; |
2389 | +using System.Text; |
2390 | +using System.Text.RegularExpressions; |
2391 | +using System.Web; |
2392 | +using System.Windows; |
2393 | +using Canonical.Ubuntu.SSO; |
2394 | +using Canonical.Ubuntu.SSO.Service; |
2395 | +using Canonical.Ubuntu.SSO.Views; |
2396 | using Canonical.UbuntuOne.Client.Preferences; |
2397 | using Canonical.UbuntuOne.Common.Aop; |
2398 | using Canonical.UbuntuOne.Common.Utils; |
2399 | using log4net; |
2400 | +using Newtonsoft.Json.Linq; |
2401 | +using OAuth; |
2402 | |
2403 | namespace Canonical.UbuntuOne.Client.Notification |
2404 | { |
2405 | @@ -114,11 +124,11 @@ |
2406 | { |
2407 | get |
2408 | { |
2409 | - if(_logger == null) |
2410 | + if (_logger == null) |
2411 | { |
2412 | lock (_loggerLock) |
2413 | { |
2414 | - _logger = LogManager.GetLogger(typeof (NotificationIconPresenter)); |
2415 | + _logger = LogManager.GetLogger(typeof(NotificationIconPresenter)); |
2416 | } |
2417 | } |
2418 | return _logger; |
2419 | @@ -140,6 +150,36 @@ |
2420 | |
2421 | #region Helper methods |
2422 | |
2423 | + public HttpWebRequest MakeRequest(string uri, string consumerKey, string consumerSecret, string toke, string tokenSecret) |
2424 | + { |
2425 | + // Form the full REST request url |
2426 | + Uri url = new Uri(uri); |
2427 | + |
2428 | + // Instantiate OAuthBase and declare variables |
2429 | + var oAuth = new OAuthBase(); |
2430 | + var nonce = oAuth.GenerateNonce(); |
2431 | + var timeStamp = oAuth.GenerateTimeStamp(); |
2432 | + var normUrl = string.Empty; |
2433 | + var normParams = string.Empty; |
2434 | + var strRequest = string.Empty; |
2435 | + |
2436 | + // Create an OAuth signature |
2437 | + string signature = oAuth.GenerateSignature(url, |
2438 | + consumerKey, consumerSecret, toke, tokenSecret, |
2439 | + "GET", timeStamp, nonce, OAuthBase.SignatureTypes.HMACSHA1, |
2440 | + out normUrl, out normParams); |
2441 | + |
2442 | + // Construct the OAuth authenticated REST url |
2443 | + strRequest = normParams + "&" + HttpUtility.UrlEncode("oauth_signature") + "=" + HttpUtility.UrlEncode(signature); |
2444 | + strRequest = strRequest.Replace("&", @""","); |
2445 | + strRequest = strRequest.Replace("=", @"="""); |
2446 | + strRequest += @""""; |
2447 | + strRequest = @"OAuth realm=""""," + strRequest; |
2448 | + var request = WebRequest.Create(normUrl) as HttpWebRequest; |
2449 | + request.Headers.Add("Authorization", strRequest); |
2450 | + return request; |
2451 | + } |
2452 | + |
2453 | /// <summary> |
2454 | /// Helper method that will ensure that when the state of the sync daemon changes this change |
2455 | /// is correctly reflected in the View. |
2456 | @@ -186,9 +226,9 @@ |
2457 | private void OnNotificationHandler(object sender, NotificationEventArgs e) |
2458 | { |
2459 | NotificationIconView.Notification = e.Message; |
2460 | - } |
2461 | + } |
2462 | |
2463 | - #endregion |
2464 | + #endregion |
2465 | |
2466 | #region Implementation of INotificationIconPresenter |
2467 | |
2468 | @@ -197,11 +237,48 @@ |
2469 | /// </summary> |
2470 | public void ManualSync() |
2471 | { |
2472 | + // TODO: use the oauth code from the provider not here! |
2473 | + var keyring = new Keyring(); |
2474 | + keyring.DataProtector = new DPAPIDataProtector(); |
2475 | + var secret = keyring.GetSecretByName("Default", "UbuntuOne"); |
2476 | + if (secret == null) |
2477 | + { |
2478 | + var dialog = new LoginDialog(); |
2479 | + dialog.ShowDialog(); |
2480 | + if (dialog.WasCanceled) |
2481 | + { |
2482 | + MessageBox.Show("You need to login to be able to sync your files."); |
2483 | + return; |
2484 | + } |
2485 | + try |
2486 | + { |
2487 | + var auth = new Authentications(); |
2488 | + var credentials = JObject.Parse(auth.Authenticate(dialog.Email, dialog.Password, "Ubuntu One @ Windows")); |
2489 | + secret = string.Format("{0}:{1}:{2}:{3}", |
2490 | + (string)credentials["token"], |
2491 | + (string)credentials["token_secret"], |
2492 | + (string)credentials["consumer_key"], |
2493 | + (string)credentials["consumer_secret"]); |
2494 | + // TODO: Move this out of here!!! put it in the correct location, like the SSOProvider!! |
2495 | + // ping the service to make it download the tokens |
2496 | + var pingRequest = MakeRequest(Constants.PingUrl + dialog.Email, (string) credentials["consumer_key"], |
2497 | + (string) credentials["consumer_secret"], |
2498 | + (string) credentials["token"], (string) credentials["token_secret"]); |
2499 | + var pingRepomse = pingRequest.GetResponse(); |
2500 | + keyring.CreateSecret("Default", "UbuntuOne", secret); |
2501 | + } |
2502 | + catch (Exception e) |
2503 | + { |
2504 | + MessageBox.Show("You provided the wrong credentials."); |
2505 | + return; |
2506 | + } |
2507 | + } |
2508 | + |
2509 | // TODO: Use the service rather than do it here. |
2510 | // TODO: This has to be fixed, we should not call the command directly, user the |
2511 | // process dispatcher to prepare for the syncdaemon!!!! |
2512 | // TODO: Do not hardcode the folder, use an object to store that |
2513 | - // TODO: Do not store oauth in the env vars!!!! |
2514 | + |
2515 | var oneDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), |
2516 | "UbuntuOne"); |
2517 | // ensure that the path can be handled by the python code |
2518 | @@ -221,8 +298,7 @@ |
2519 | WorkingDirectory = @"C:\Program Files\Canonical\UbuntuOne\Client\U1Sync", |
2520 | FileName = @"C:\Program Files\Canonical\UbuntuOne\Client\U1Sync\main.exe", |
2521 | Arguments = String.Format(" --init \"{0}\" --oauth {1}", |
2522 | - oneDir, |
2523 | - Environment.GetEnvironmentVariable("UbuntuOne", EnvironmentVariableTarget.User)), |
2524 | + oneDir, secret), |
2525 | UseShellExecute = false, |
2526 | RedirectStandardOutput = false, |
2527 | RedirectStandardError = false, |
2528 | @@ -242,8 +318,7 @@ |
2529 | WorkingDirectory = @"C:\Program Files\Canonical\UbuntuOne\Client\U1Sync", |
2530 | FileName = @"C:\Program Files\Canonical\UbuntuOne\Client\U1Sync\main.exe", |
2531 | Arguments = String.Format("\"{0}\" --oauth {1}", |
2532 | - oneDir, |
2533 | - Environment.GetEnvironmentVariable("UbuntuOne", EnvironmentVariableTarget.User)), |
2534 | + oneDir, secret), |
2535 | UseShellExecute = false, |
2536 | RedirectStandardOutput = false, |
2537 | RedirectStandardError = false, |
2538 | @@ -272,7 +347,7 @@ |
2539 | { |
2540 | Explorer.OpenFolder(SharesLocation); |
2541 | } |
2542 | - catch(ExplorerException exception) |
2543 | + catch (ExplorerException exception) |
2544 | { |
2545 | Logger.WarnFormat("There was an error operning the SharesLocation, {0}", exception); |
2546 | // use the view to notify the error |
2547 | |
2548 | === modified file 'src/UbuntuOne.sln' |
2549 | --- src/UbuntuOne.sln 2010-09-13 12:20:56 +0000 |
2550 | +++ src/UbuntuOne.sln 2010-09-29 14:35:57 +0000 |
2551 | @@ -27,6 +27,8 @@ |
2552 | EndProject |
2553 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Canonical.Ubuntu.SSO.Tests", "Canonical.Ubuntu.SSO.Tests\Canonical.Ubuntu.SSO.Tests.csproj", "{17BBBEC2-0F4F-48CE-A585-07AA33B6B2B3}" |
2554 | EndProject |
2555 | +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Canonical.Ubuntu.SSO.Views", "Canonical.Ubuntu.SSO.Views\Canonical.Ubuntu.SSO.Views.csproj", "{33187F40-201E-4429-B299-E582CF114E28}" |
2556 | +EndProject |
2557 | Global |
2558 | GlobalSection(SolutionConfigurationPlatforms) = preSolution |
2559 | Debug|Any CPU = Debug|Any CPU |
2560 | @@ -167,6 +169,16 @@ |
2561 | {17BBBEC2-0F4F-48CE-A585-07AA33B6B2B3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU |
2562 | {17BBBEC2-0F4F-48CE-A585-07AA33B6B2B3}.Release|Mixed Platforms.Build.0 = Release|Any CPU |
2563 | {17BBBEC2-0F4F-48CE-A585-07AA33B6B2B3}.Release|x86.ActiveCfg = Release|Any CPU |
2564 | + {33187F40-201E-4429-B299-E582CF114E28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
2565 | + {33187F40-201E-4429-B299-E582CF114E28}.Debug|Any CPU.Build.0 = Debug|Any CPU |
2566 | + {33187F40-201E-4429-B299-E582CF114E28}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU |
2567 | + {33187F40-201E-4429-B299-E582CF114E28}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU |
2568 | + {33187F40-201E-4429-B299-E582CF114E28}.Debug|x86.ActiveCfg = Debug|Any CPU |
2569 | + {33187F40-201E-4429-B299-E582CF114E28}.Release|Any CPU.ActiveCfg = Release|Any CPU |
2570 | + {33187F40-201E-4429-B299-E582CF114E28}.Release|Any CPU.Build.0 = Release|Any CPU |
2571 | + {33187F40-201E-4429-B299-E582CF114E28}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU |
2572 | + {33187F40-201E-4429-B299-E582CF114E28}.Release|Mixed Platforms.Build.0 = Release|Any CPU |
2573 | + {33187F40-201E-4429-B299-E582CF114E28}.Release|x86.ActiveCfg = Release|Any CPU |
2574 | EndGlobalSection |
2575 | GlobalSection(SolutionProperties) = preSolution |
2576 | HideSolutionNode = FALSE |
2577 | |
2578 | === modified file 'src/u1sync/client.py' |
2579 | --- src/u1sync/client.py 2010-08-27 14:43:32 +0000 |
2580 | +++ src/u1sync/client.py 2010-09-29 14:35:57 +0000 |
2581 | @@ -185,8 +185,6 @@ |
2582 | self._status_reason = None |
2583 | self._status_waiting = [] |
2584 | self._active_waiters = set() |
2585 | - self.consumer_key = CONSUMER_KEY |
2586 | - self.consumer_secret = "hammertime" |
2587 | |
2588 | def force_shutdown(self): |
2589 | """Forces the client to shut itself down.""" |
2590 | @@ -428,11 +426,9 @@ |
2591 | return self.defer_from_thread(_resolve_worker) |
2592 | |
2593 | @log_timing |
2594 | - def oauth_from_token(self, token): |
2595 | + def oauth_from_token(self, token, consumer): |
2596 | """Perform OAuth authorisation using an existing token.""" |
2597 | |
2598 | - consumer = OAuthConsumer(self.consumer_key, self.consumer_secret) |
2599 | - |
2600 | def _auth_successful(value): |
2601 | """Callback for successful auth. Changes status to |
2602 | authenticated.""" |
2603 | |
2604 | === modified file 'src/u1sync/main.py' |
2605 | --- src/u1sync/main.py 2010-08-28 20:52:32 +0000 |
2606 | +++ src/u1sync/main.py 2010-09-29 14:35:57 +0000 |
2607 | @@ -278,14 +278,13 @@ |
2608 | def run_client(): |
2609 | """Run the blocking client.""" |
2610 | token = options_parser.options.token |
2611 | - |
2612 | client.connect_ssl(options_parser.options.host, |
2613 | int(options_parser.options.port), |
2614 | options_parser.options.no_ssl_verify) |
2615 | |
2616 | try: |
2617 | client.set_capabilities() |
2618 | - client.oauth_from_token(options_parser.options.token) |
2619 | + client.oauth_from_token(options_parser.options.token, options_parser.options.consumer) |
2620 | |
2621 | if options_parser.options.mode == "sync": |
2622 | do_sync(client=client, directory=options_parser.options.directory, |
2623 | |
2624 | === modified file 'src/u1sync/ubuntuone_optparse.py' |
2625 | --- src/u1sync/ubuntuone_optparse.py 2010-08-27 14:43:32 +0000 |
2626 | +++ src/u1sync/ubuntuone_optparse.py 2010-09-29 14:35:57 +0000 |
2627 | @@ -18,7 +18,7 @@ |
2628 | # You should have received a copy of the GNU General Public License along |
2629 | # with this program. If not, see <http://www.gnu.org/licenses/>. |
2630 | import uuid |
2631 | -from oauth.oauth import OAuthToken |
2632 | +from oauth.oauth import OAuthToken, OAuthConsumer |
2633 | from optparse import OptionParser, SUPPRESS_HELP |
2634 | from u1sync.merge import ( |
2635 | SyncMerge, ClobberServerMerge, ClobberLocalMerge) |
2636 | @@ -187,11 +187,12 @@ |
2637 | self.error("--oauth is currently compulsery.") |
2638 | else: |
2639 | try: |
2640 | - (key, secret) = self.options.oauth.split(':', 2) |
2641 | + (token_key, toke_secret, consumer_key, consumer_secret) = self.options.oauth.split(':', 4) |
2642 | except ValueError: |
2643 | self.error("--oauth requires a key and secret together in the " |
2644 | " form KEY:SECRET") |
2645 | - self.options.token = OAuthToken(key, secret) |
2646 | + self.options.token = OAuthToken(token_key, toke_secret) |
2647 | + self.options.consumer = OAuthConsumer(consumer_key, consumer_secret) |
2648 | |
2649 | def _validate_share(self): |
2650 | """Validates the share option""" |
looks sane to me 8-þ