Skip to content

Commit 3f617c5

Browse files
committed
Merge pull request #445 from libgit2/safer-signature
Safe signature
2 parents 5a911e3 + a712556 commit 3f617c5

File tree

2 files changed

+71
-12
lines changed

2 files changed

+71
-12
lines changed

ObjectiveGit/GTRepository.m

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -718,24 +718,33 @@ - (GTSubmodule *)submoduleWithName:(NSString *)name error:(NSError **)error {
718718

719719
#pragma mark User
720720

721+
+ (NSString *)defaultUserName {
722+
NSString *name = NSFullUserName();
723+
if (name.length == 0) name = NSUserName();
724+
if (name.length == 0) name = @"nobody";
725+
return name;
726+
}
727+
728+
+ (NSString *)defaultEmail {
729+
NSString *username = NSUserName();
730+
if (username.length == 0) username = @"nobody";
731+
NSString *domain = NSProcessInfo.processInfo.hostName ?: @"nowhere.local";
732+
return [NSString stringWithFormat:@"%@@%@", username, domain];
733+
}
734+
721735
- (GTSignature *)userSignatureForNow {
722736
GTConfiguration *configuration = [self configurationWithError:NULL];
723737
NSString *name = [configuration stringForKey:@"user.name"];
724-
if (name.length == 0) {
725-
name = NSFullUserName();
726-
if (name.length == 0) name = NSUserName();
727-
if (name.length == 0) name = @"nobody";
728-
}
738+
if (name.length == 0) name = self.class.defaultUserName;
729739

730740
NSString *email = [configuration stringForKey:@"user.email"];
731-
if (email == nil) {
732-
NSString *username = NSUserName();
733-
if (username.length == 0) username = @"nobody";
734-
NSString *domain = NSProcessInfo.processInfo.hostName ?: @"nowhere.local";
735-
email = [NSString stringWithFormat:@"%@@%@", username, domain];
736-
}
741+
if (email.length == 0) email = self.class.defaultEmail;
742+
743+
NSDate *now = [NSDate date];
744+
GTSignature *signature = [[GTSignature alloc] initWithName:name email:email time:now];
745+
if (signature != nil) return signature;
737746

738-
return [[GTSignature alloc] initWithName:name email:email time:[NSDate date]];
747+
return [[GTSignature alloc] initWithName:self.class.defaultUserName email:self.class.defaultEmail time:now];
739748
}
740749

741750
#pragma mark Tagging

ObjectiveGitTests/GTRepositorySpec.m

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,56 @@
542542
});
543543
});
544544

545+
describe(@"-userSignatureForNow", ^{
546+
static NSString * const userName = @"johnsmith";
547+
static NSString * const email = @"[email protected]";
548+
549+
__block GTConfiguration *configuration;
550+
551+
beforeEach(^{
552+
configuration = [repository configurationWithError:NULL];
553+
expect(configuration).notTo(beNil());
554+
});
555+
556+
it(@"should use the values from the config", ^{
557+
[configuration setString:userName forKey:@"user.name"];
558+
[configuration setString:email forKey:@"user.email"];
559+
560+
GTSignature *signature = [repository userSignatureForNow];
561+
expect(signature.name).to(equal(userName));
562+
expect(signature.email).to(equal(email));
563+
});
564+
565+
describe(@"invalid values", ^{
566+
it(@"should use a default value if the name is empty", ^{
567+
[configuration setString:@"" forKey:@"user.name"];
568+
[configuration setString:email forKey:@"user.email"];
569+
570+
GTSignature *signature = [repository userSignatureForNow];
571+
expect(@(signature.name.length)).to(beGreaterThan(@0));
572+
expect(@(signature.email.length)).to(beGreaterThan(@0));
573+
});
574+
575+
it(@"should use a default value if the email is empty", ^{
576+
[configuration setString:userName forKey:@"user.name"];
577+
[configuration setString:@"" forKey:@"user.email"];
578+
579+
GTSignature *signature = [repository userSignatureForNow];
580+
expect(@(signature.name.length)).to(beGreaterThan(@0));
581+
expect(@(signature.email.length)).to(beGreaterThan(@0));
582+
});
583+
584+
it(@"should use a default value if the email contains angled brackets", ^{
585+
[configuration setString:userName forKey:@"user.name"];
586+
[configuration setString:@"<[email protected]>" forKey:@"user.email"];
587+
588+
GTSignature *signature = [repository userSignatureForNow];
589+
expect(@(signature.name.length)).to(beGreaterThan(@0));
590+
expect(@(signature.email.length)).to(beGreaterThan(@0));
591+
});
592+
});
593+
});
594+
545595
afterEach(^{
546596
[self tearDown];
547597
});

0 commit comments

Comments
 (0)